एक नंबर स्ट्रिंग सिकोड़ें


12

की एक स्ट्रिंग को देखते हुए 1और 2किसी भी लम्बाई के, कुछ कोड लिखने (एक होने की जरूरत नहीं है समारोह अब और, सब कुछ ठीक हो जाएगा) है कि गणना कितने कदम यह एक अंतिम रूप स्ट्रिंग हटना करने की जरूरत है इस कसौटी के बाद,:

यदि आपकी स्ट्रिंग है 112112, तो इसका मतलब है कि आपको एक 1, दो 1s और 2 प्रिंट करना होगा, जैसे 1112:। जब आप फिर से ऑपरेशन करेंगे तो आपको 1 और 2. प्रिंट करना होगा 12। तब आप एक 2 प्रिंट करते हैं, प्राप्त करते हैं 2। यह एक अंतिम रूप है, क्योंकि यह स्ट्रिंग अब बदलने वाली नहीं है। आपका कोड आउटपुट होगा 3, क्योंकि आपको अंतिम रूप प्राप्त करने के लिए 3 चरणों की आवश्यकता थी।

अन्य नियम

  • यदि स्ट्रिंग की असमान लंबाई है, तो अंतिम संख्या अछूती रहती है।

  • हर स्ट्रिंग जो अब बदल नहीं सकती (जैसे 222222) को अंतिम रूप माना जाता है।

  • आप किसी भी बाहरी स्रोत का उपयोग नहीं कर सकते।

  • आपका कोड के हर तार के साथ काम करना चाहिए 1और 2

  • सबसे कम कोड जीतता है, क्योंकि यह कोड-गोल्फ है।

  • आपका कोड हर चरण को प्रिंट करना चाहिए।

  • हर इनपुट विधि ठीक होगी।

उदाहरण

Input >> 122122122121212212

Your code has to print:
211222111111222
11222111222
122111222
2111222
111222
1222
222
Steps:7 (you can omit the "Steps")
---- ---- ---- ----
Input >> 22222221

Your code has to print:
22222211
2222221
2
---- ---- ---- ----
Input >> 2222

Your code has to print:
0

संपादित करें: भारी संपादित किया गया। उस बात से बहुत दुखी हूं।


3
"यदि आपका तार 112112 है, तो इसका मतलब है कि आपको 1, दो 1s और 2 को प्रिंट करना होगा, जैसे: 1112।" मुझे यह नहीं मिला।
फेबिनौट

7
इसे जोर से पढ़ने की कोशिश करें। यह "एक एक", "दो वाले" और "एक दो" हैं। मेरा मतलब है, "1 समय 1", "2 बार 1" और "1 समय 2"।
वीरोस

5
यदि रेगेक्स "उपयोगी भी नहीं हैं", तो आप उन पर प्रतिबंध क्यों लगाते हैं?
JB

1
रेगेक्स प्रतिबंध हटा दिया गया।
वीरोस

1
@ProgramFOX "एक 1, दो 1 एस, और एक 2" 1 11 2:। हर दो नंबर एक जोड़ी है: जोड़ी की पहली संख्या कहती है कि जोड़ी में दूसरे नंबर को कितनी बार प्रस्तुत करना है। जोड़ीदार के बिना कोई भी अंतिम विषम अंक इस रूप में प्रदान किया जाता है।
अप्सिलर्स

जवाबों:


7

रूबी 1.9+, 73 वर्ण

मैं नो-रेगेक्स नियम को मूर्खतापूर्ण और मनमाने तरीके से देखता हूं, इसलिए यहां एक प्रभावी रीजेक्स आधारित समाधान है:

gets
($.+=1;puts$_.gsub!(/(.)(.)/){$2*$1.to_i})until~/^(22)*[12]?$/
p~-$.

परीक्षण चालन:

$ ruby 21.rb <<< 122122122121212212
211222111111222
11222111222
122111222
2111222
111222
1222
222
7

अंतिम पंक्ति चरणों की संख्या है।

संपादित करें: रेगेक्स प्रतिबंध को वेरोस द्वारा हटा दिया गया है।


3

सी - 156 154

मेरा पहला कोड गोल्फ यहाँ!

f(char*s,c){puts(s);char*a=s,*b=s,m=50,x,y;while(*a){
x=*a++;y=*a++;if(y)m&=x&y;*b++=y?:x;x-49?*b++=y:(*b=0);}
*b=*a;return m/50?printf("%i",c),c:f(s,c+1);}

परीक्षा:

char c[] = "12211122211222221";
f(c,0);

आउटपुट:

12211122211222221
21112211222221
111221222211
121122221
21222211
1122221
122221
22211
22111
2211
221
10

2

GolfScript: 69 अक्षर

0\{\)\.p.[]\{~10base{.,1>{(\(@\{''+*}++~@\+\.}{~+0.}if}do;}~.@=!}do;(

आंतरिक लूप का प्रत्येक पुनरावृत्ति स्ट्रिंग में पहले 2 नंबर पाता है, और उन्हें फॉर्म का एक ब्लॉक बनाने के लिए उपयोग करता है {num1 num2 '' + *}। जब इस ब्लॉक का मूल्यांकन किया जाता है, तो हमें उन संख्याओं का वांछित पठन प्राप्त होता है। इसे तब तक दोहराएं जब तक कि अधिक वर्ण न हों। फिर, पुनरावृत्तियों और मुद्रण की संख्या पर नज़र रखते हुए उस लूप को दोहराएं।

नमूना:

echo '12211122211222221' | ruby golfscript.rb g.gs
"12211122211222221"
"21112211222221"
"111221222211"
"121122221"
"2122221"
"1122221"
"122221"
"22211"
"22111"
"2211"
"221"
10

2

अजगर - 126

def f(s):
 j=0
 while 1:
    n="";i=0
    for c in s:n+=c*i;i=[int(c),0][i>0]
    if i:n+=`i`
    if s==n:break
    s=n;print s;j+=1
 print j

यह इनपुट मान को प्रिंट नहीं करता है। अगर इसकी जरूरत है, तो print s;पहले दाहिनी ओर चलेंn="";

नोट: आपने "फ़ंक्शन" कहा, इसलिए यह एक फ़ंक्शन है। यहाँ एक संस्करण है जो एक फ़ंक्शन नहीं है (127 वर्ण):

s=raw_input();j=0
while 1:
    n="";i=0
    for c in s:n+=c*i;i=[int(c),0][i>0]
    if i:n+=`i`
    if s==n:break
    s=n;print s;j+=1
print j

(अगर मैं उपयोगकर्ता को 118 में नंबर पेस्ट कर सकता हूं (पहली पंक्ति पर उद्धरण के बीच डेटा पेस्ट करें):

s="";j=0
while 1:
    n="";i=0
    for c in s:n+=c*i;i=[int(c),0][i>0]
    if i:n+=`i`
    if s==n:break
    s=n;print s;j+=1
print j

नमूना रन:

211222111111222
11222111222
122111222
2111222
111222
1222
222
7

एक बोनस के रूप में, इनमें से प्रत्येक समाधान बड़ी संख्या (9 तक) वाले तारों के लिए काम करता है, लेकिन कुछ तार बड़े और बड़े आउटपुट (उदाहरण के लिए, 99) उत्पन्न करते हैं


1

जावास्क्रिप्ट, १० JavaScript

(फ़ायरफ़ॉक्स की तरह तीर फ़ंक्शन समर्थन की आवश्यकता है)

for(p=prompt,s=p(),k=0;r=s.match(/.?.?/g).map(a=>a>2?a[1]+(a<13?'':a[1]):a).join(''),p(s),r!=s;s=r)k++;p(k)
  • s इनपुट स्ट्रिंग है

  • प्रत्येक दौर में, हम regex .?.?का उपयोग sदो-वर्ण स्ट्रिंग्स की एक सरणी में विस्फोट करने के लिए करते हैं, फिर mapउन स्ट्रिंग्स को उनके कम किए गए रूपों में जोड़ते हैं और सरणी को वापस एक साथ गोंद करते हैं

  • r पिछले के मुकाबले तुलना के लिए वर्तमान दौर के परिणाम को संग्रहीत करता है s

  • k गोल काउंटर है

  • हम एक इनपुट और आउटपुट तंत्र दोनों के रूप में बुरी तरह से दुर्व्यवहार करते हैं prompt( pक्योंकि यह उपयोगकर्ता के लिए एक संदेश प्रस्तुत कर सकता है)


for(p=prompt,s=p(),k=0;
    r=s.match(/.?.?/g).map(
        a=>
            a>2?                     // if a is more than one char
                a[1]+(a<13?'':a[1])  // double the second char if the first char is 2
               :a                    // if not two chars, return a
    ).join(''),                      // glue new array together
     p(s),                           // print s
     r!=s;                           // test if string has changed
    s=r)
        k++;
p(k)

1

पर्ल - 50 (+2) बाइट्स

$a-=print while"$_"ne(s/(.)(.)/$2x$1/ge,$_);$_=-$a

आवश्यक -plकमांड लाइन स्विच।

नमूना उपयोग:

$ more in.dat
122122122121212212

$ perl -pl rev-count.pl < in.dat
211222111111222
11222111222
122111222
2111222
111222
1222
222
7

$ more in.dat
22222221

$ perl -pl rev-count.pl < in.dat
22222211
2222221
2

$ more in.dat
2222

$ perl -pl rev-count.pl < in.dat
0

1

PHP, 240

<?php
$s=$_GET['i'];$h=$s;for($t=1;$h!=r($h);$t++){echo$h.'<br>';$h=r($h);}echo r($s)==$s?0:$h.'<br>'.$t;function r($c){for($i=0;$i<strlen($c)-1;$i+=2){$s.=$c[$i]==1?$c[$i+1]:$c[$i+1].$c[$i+1];if($i+3==strlen($c))$s.=$c[$i+2];}return$s;}?>

उदाहरण: http://skyleo.de/codegolf.php?i=211222111111222

211222111111222
11222111222
122111222
2111222
111222
1222
222
7

मैं कोडगोल्फ में थोरा बुरा हूँ ।_ शायद मुझे केवल जावा और PHP का उपयोग नहीं करना चाहिए (और मुझे अधिक जटिल सोचना चाहिए)


1
कोडगॉल्फ सबसे जटिल समाधान खोजने के बारे में नहीं है, बल्कि सबसे सरल है।
प्रिमो

आपको वास्तव में करने की आवश्यकता नहीं है str_splitक्योंकि आप PHP में एक सरणी की तरह एक स्ट्रिंग में अलग-अलग पात्रों तक पहुंच सकते हैं।
गारेथ

हाँ, कुछ समय बाद मुझे लगा कि मैं, लेकिन मैं इसे संपादित करने के लिए बहुत आलसी था। लेकिन अब मैंने इसे बदल दिया।
लियो पफ्लग

0

आर, 158

s=utf8ToInt(scan(,""))-48;i=0;while(any(!!s-2)){t=(a<-sum(s|T))%%2;u=s[seq(a-t)];cat(s<-c(rep(u[c(F,T)],u[c(T,F)]),s[a*t]),"\n",sep="");i=i+1};cat("Steps:",i)

उदाहरण:

122122122121212212

211222111111222
11222111222
122111222
2111222
111222
1222
222
Steps: 7

0

मैथेमेटिका, 117

s="122122122121212212";
Grid@FixedPointList[(Partition[#,2,2,1,{}]/.{{1,1}->{1},{1,2}->{2},{2,1}->{1,1}}//Flatten)&,FromDigits/@Characters@s]

122122122121212212
211222111111222
11222111222
122111222
2111222
111222
1222
222
222

0

चौकीदार, २

ओपर्स की टिप्पणियों में मेरे प्रश्न के लिए "जो भी इनपुट विधि आपके कोड को छोटा करती है, उसका उपयोग कर सकते हैं" Vereos की प्रतिक्रिया के आधार पर, निम्नलिखित स्क्रिप्ट परिणाम प्राप्त करता है:

$a

उदाहरण के लिए "122122122121212212" चलाएं:

# Input method is to assign answer to $a:
$a = @"
211222111111222
11222111222
122111222
2111222
111222
1222
222
Steps: 7
"@

# Execute script
$a

# Answer follows:
211222111111222
11222111222
122111222
2111222
111222
1222
222

स्पष्ट रूप से यह एक गंभीर प्रविष्टि नहीं है - यह मेरा उद्देश्य है कि किसी भी इनपुट पद्धति की अनुमति देने से उत्तर देने के लिए आवश्यक वास्तविक कोड को तुच्छ समझा जा सकता है। इसलिए इनपुट पद्धति को और अधिक कठोरता से निर्दिष्ट करने की आवश्यकता है।


0

जे, 41 चरस

एक समारोह के रूप में (ew parens! उनके बारे में बहुत खुश नहीं):

(,":@#)@}:@(([:;_2&(<@((".@[#])/)\))^:a:)
विस्फोट देखें
                _2&(            )\          NB. on non-overlapping 2-grams:
                       (      )/            NB.   insert between the two chars:
                        ".@[                NB.     read left operand ([) as a number
                            #]              NB.     and repeat right this many times,
                    <@(           )         NB.   then put it in a box
            ([:;                   )        NB. open and concatenate the boxes
           (                        ^:a:)   NB. repeat until fixpoint (keeping intermediates)
        }:@                                 NB. drop first element (the input)
(,":@#)@                                    NB. append length of array (# steps)
नमूना चला
   (,":@#)@}:@(([:;_2&(<@((".@[#])/)\))^:a:) '1121121'
1121121
11121  
121    
21     
11     
5      
   (,":@#)@}:@(([:;_2&(<@((".@[#])/)\))^:a:) '122122122121212212'
122122122121212212
211222111111222   
11222111222       
122111222         
2111222           
111222            
1222              
7                 

0

पर्ल, 107 वर्ण

अन्य पर्ल कोड स्पष्ट रूप से यह धड़कता है, लेकिन इसके लायक क्या है, यहां यह है। मैंने एक अतिरिक्त चरित्र की कीमत पर -l स्विच का उपयोग किया:

$_=<>;while(1){$l=$_;$_=join"",map{($a,$b)=split//;$b?$b x$a:$a}grep/./,split/(..?)/;last if$l eq$_;print}

उस का अधिक सुपाठ्य संस्करण:

$x = <>; while(1) { $l = $x; $x = join "", map{ ($a,$b) = split//, $_; $b ? $b x $a: $a } grep /./, split /(..?)/, $x; last if $l eq $x; print $x}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.