数値文字列を縮小する


12

文字列を考える1と、2いくつかのコードを記述し、任意の長さの(である必要はありません機能を計算するにはどのように多くのステップ、それはこの基準以下、最終形態に文字列を縮小する必要がないということはもう、すべてがうまくなります):

文字列がの場合112112、これは次のように1、2、1、2を印刷する必要があることを意味します 1112。もう一度操作を実行すると、1と2を印刷する必要があります12。次に、1を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、2、1、2のように印刷する必要があることを意味します:1112」。わかりません。
— Fabinout

7
大声でそれを読んでみてください。「1つ」、「2つ」、「1つ2つ」です。つまり、「1回1」、「2回1」、「1回2」です。
— ヴェレオス14年

5
正規表現が「役に立たない」場合、なぜ禁止するのですか?
— JB 14年

1
正規表現の制限が削除されました。
— ヴェレオ14年

1
@ProgramFOX "1 1、2つの1S、および2": 1 11 2。2つの数字はすべてペアです。ペアの最初の数字は、ペアの2番目の数字を何回レンダリングするかを示します。ペアパートナーのない最後の奇数は、そのままレンダリングされます。
— apsillers

回答:


6

Ruby 1.9 +、73文字

no-regexルールは愚かでand意的であると考えているため、正規表現ベースの悪意のあるソリューションを以下に示します。

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

テスト走行:

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

最後の行はステップ数です。

編集:正規表現の制限はVereosによって削除されました。


3

C- 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、107

(例えば、Firefoxのように矢印関数のサポートが必要です)

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 入力文字列です

  • 各ラウンドは、我々は正規表現を使用.?.?爆発しs、その後、2文字の文字列の配列に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

Perl-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

私はcodegolfがちょっと苦手です。多分私はJavaとPHPだけを使うべきではありません(そしてもっと複雑だと思うべきです)


1
CodeGolfは、最も複雑なソリューションを見つけることではなく、最もシンプルなソリューションを見つけることです。
— primo 14年

str_splitPHPの配列のように文字列内の個々の文字にアクセスできるため、実際に行う必要はありません。
— ガレス14

ええ、しばらくして私は自分自身と思ったのですが、編集するのが面倒でした。しかし、今では変更しました。
— レオPflug 14

0

R、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

パワーシェル、2

OPのコメント内の私の質問に対する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

J、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

Perl、107文字

他のperlコードは明らかにこれを打ち負かしていますが、それが価値があるのは、ここにあります。余分な文字を犠牲にして-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}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.