追加番号ゲーム


16

追加番号ゲーム

2つの整数パラメーター、 整数パラメーターまたは整数変数、開始番号、および最大反復カウントを取る関数/プログラムを作成します。コードは、次のゲーム例を実行して新しい数字を作成し、数字が1桁左になるまで繰り返します。例えば。

3 7 2 = (3 + 7) & (7 + 2) = 10 9
1 0 9 = (1 + 0) & (0 + 9) = 1 9
1 9 = (1 + 9) = 10
1 0 = (1 + 0) = 1

基本的に、個々の数字を取得してその数字を隣に追加し、次の追加の結果も追加します。

最大反復回数は、無限ループを保護するためのものであり、最大値に達すると、コードは最後の5つの数値ステップをダンプする必要があります。同じ出力は、1桁に達して終了するときに発生するはずです。発生したステップが5つ未満の場合は、有効な数値のみを出力します。

出力はStep: Number、終了または終了したステップの最後の5ステップを含む()のように表示されます。

func(3541, 50) この正確な出力形式を生成します:

6: 1411
7: 552
8: 107
9: 17
10: 8

func(3541, 5) 生成するもの:

1: 895
2: 1714
3: 885
4: 1613
5: 774

計算全体:

1: 895
2: 1714
3: 885
4: 1613
5: 774
6: 1411
7: 552
8: 107
9: 17
10: 8

手順が5つ未満の場合は、それらの手順を印刷してください。

組み込みのライブラリのみを使用し、パラメータはどこからでも使用できます(選択した言語にとって最も簡単なもの)。最大整数サイズに制限はありません。オーバーフローがある場合は、クラッシュさせます。

これがパズルの観点からそれほど難しくないことを考えると、受け入れられた回答を検討するために提出を検討するために、日曜日の25日まで、午後8時(UTC + 8)まで与えます。

編集:

ハワード、おめでとう、48 GolfScriptの回答で優勝。

66 APLの回答がある2位のマリヌスへの特別な言及。

私のお気に入り(JavaScriptに偏っている)はcore1024の回答でした。


わかりません、func(3541, 5)5ステップまたは10ステップを印刷するはずですか?
タル

5つのステップ。反復5に達すると停止し、反復を実行せずに最後の5ステップを出力します。その特定の入力の完全な計算プロセスを示すために、すべてのステップを含めました。
マット

回答:


4

GolfScript、48 46文字

{.`n*[~]n\{:s++s}*;~}*].,,\]zip{': '*}%1>-5>n*

ピーター・テイラーに感謝2文字の改善をして。

スタック上の両方の数値を期待します。オンラインで試す

例:

> 4 50

> 141 50
1: 55
2: 10
3: 1

> 3541 50
6: 1411
7: 552
8: 107
9: 17
10: 8

> 3541 5
1: 895
2: 1714
3: 885
4: 1613
5: 774

後にフリップを追加し.,,、最終的なマップをjustに変えることで、ある程度の節約ができ{': '*}%ます。
ピーターテイラー

10

APL(66)

{↑¯5↑{(⍕⍵),': ',⍺}/∆,⍪⍳⍴∆←⍺{(1<⍴⍵)∧⍺>0:∆,(⍺-1)∇⊃∆←,/⍕¨2+/⍎¨⍵⋄⍬}⍕⍵}

左の引数は最大反復回数で、右の引数は開始番号です。

説明:

  • ∆←⍺{... }⍕⍵:数値のリストを計算する関数に、左の引数を数値として、右の引数を文字列として渡し、以下に格納します。
    • (1<⍴⍵)∧⍺>0::桁数が1を超え、残っている反復の量が0
      • ⍎¨⍵:各桁を評価する
      • 2+/:各ペアの合計
      • ⍕¨:各数値を文字列としてフォーマットします
      • ∆←,/:文字列を連結して保存する
      • ∆,(⍺-1)∇⊃∆:return に続いて、この関数を適用した結果が1回少ない反復で許可されます
    • ⋄⍬:そうでない場合は、空のリストを返します
  • ∆,⍪⍳⍴∆:の各要素とそのインデックスをペアにします
  • {... }/:各ペアに対して:
    • (⍕⍵),': ',⍺:インデックス、その後に:、その後に番号が続く文字列を返します
  • ↑¯5↑:文字列のリストをマトリックスに変換して、別々の行に表示し、最後の5項目を取得します

テスト:

      5{↑¯5↑{(⍕⍵),': ',⍺}/∆,⍪⍳⍴∆←⍺{(1<⍴⍵)∧⍺>0:∆,(⍺-1)∇⊃∆←,/⍕¨2+/⍎¨⍵⋄⍬}⍕⍵}3541
1: 895 
2: 1714
3: 885 
4: 1613
5: 774 
      50{↑¯5↑{(⍕⍵),': ',⍺}/∆,⍪⍳⍴∆←⍺{(1<⍴⍵)∧⍺>0:∆,(⍺-1)∇⊃∆←,/⍕¨2+/⍎¨⍵⋄⍬}⍕⍵}3541
6: 1411
7: 552 
8: 107 
9: 17  
10: 8  

これは5ステップ未満の表示を適切に処理しますか?例えば3 {...} 3541
algorithmshark

@algorithmshark今すぐ(:最初に余分な行を追加しました)
marinus

5

Mathematica、172文字

Mathematicaの関数名とい文字列処理のおかげでこれは長すぎます(実際の「ゲーム」はこれらの文字のたった76です)が、とにかくここにあります:

""<>ToString/@(f=Flatten)@Take[Thread@{r=Range@Length[s=Rest@Cases[NestList[FromDigits[f@(d=IntegerDigits)[Tr/@Partition[d@#,2,1]]]&,n,m],i_/;i>0]],": "&/@r,s,"\n"&/@r},-5]

変数の入力数nとの最大反復回数を想定していますm

ゴルフが少ない場合:

"" <> ToString /@
  (f = Flatten)@
   Take[
    Thread@{
      r = Range@Length[
         s = Rest@Cases[
            NestList[                 
             FromDigits[
               f@(d = IntegerDigits)[Tr /@ Partition[d@#, 2, 1]]] &,
             n,
             m
             ],
            i_ /; i > 0
            ]
         ],
      ": " & /@ r,
      s,
      "\n" & /@ r
      },
    -5
    ]

5

ルビー、106文字

f=->n,m{s=0
$*<<"#{s}: #{n=n.to_s.gsub(/.\B/){eval$&+?++$'[0]}.chop}"until n.to_i<10||m<s+=1
puts$*.pop 5}

私は入力規則について完全に明確ではありませんが、もし可能なら n、文字列として使用できる場合は5文字を保存でき、定義済みの変数を使用して関数の代わりにプログラムを作成できる場合は、9を保存できます。

f次のように呼び出すことができる関数を作成します。

f[3541, 6]

2: 1714
3: 885
4: 1613
5: 774
6: 1411

f[372, 50]

1: 109
2: 19
3: 10
4: 1

f[9999, 10]

6: 99999999999
7: 18181818181818181818
8: 9999999999999999999
9: 181818181818181818181818181818181818
10: 99999999999999999999999999999999999

2
4つ以上の「9」が異なる結果を生み出すという興味深い観察
Digital Trauma

4

J- 96 92文字

すべてのゲームが終了したと仮定して最初にこれを解決しましたが、テスト中に私がお尻に噛み付くようになりました。左引数はステップ数、右引数は開始位置であり、数値または文字列として指定できます。

([(-@(<.5<.#){.])(#\(,': '&,)&":"0,)@}.@({.~,i.0:)@:".@(<@>:@[(' '-.~[:,@":2+/\"."0@]^:)":))

これは少しゴルファーが多すぎて満足のいくdegolfが得られないので、次のように言います。

  • (<@>:@[(' '-.~[:,@":2+/\"."0@]^:)":)この部分は、指定されたステップ数でゲームを実行します。2+/\数字の各ペアを追加し、ゲームの中間ステップをキャプチャするコントロールと<@>:@[連携し^:ます。
  • (#\(,': '&,)&":"0,)@}.@({.~,i.0:)@:".この部分は、すべての結果をとしてフォーマットしますstep: result({.~,i.0:)あまり多くのステップを踏まないようにしています。#\ステップ番号であり、(,': '&,)&":"0ビットはコロンとスペースを追加します。
  • (-@(<.5<.#){.])この部分は、関連する5つ以下の手順を完全なリストから削除します。<.「最小」を意味します。

動作しますが、十分な数から始めると、ゲームの結果はすぐにサイズが大きくなり始め、Jが整数から不正確な倍数に切り替わります。ここではいくつかの例を示します。

   f =: ([(-@(<.5<.#){.])(#\(,': '&,)&":"0,)@}.@({.~,i.0:)@:".@(<@>:@[(' '-.~[:,@":2+/\"."0@]^:)":))
   5 f 3541
1: 895
2: 1714
3: 885
4: 1613
5: 774
   50 f 3541
6: 1411
7: 552
8: 107
9: 17
10: 8
   100 f 372
1: 109
2: 19
3: 10
4: 1

3

Javascript 139 144 150

function f(a,n){for(r=[a+=''];n--&&a[1];r.push(a=t))for(t='',i=0;a[++i];)t+=a[i-1]- -a[i];for(i=0;r[++i];)r[i+5]||console.log(i+': '+r[i])}

非ゴルフ

function f(a,n)
{
  for (r=[a+='']; n-- && a[1]; r.push(a=t))
  {
    for (t = '', i = 0; a[++i]; )
    {
      t += a[i-1]- -a[i]; /* -char force conversion to number */
    }
  }   
  for (i = 0; r[++i];) r[i+5]||console.log(i+': '+r[i])
}

3

Perl、86 84

読みやすくするための改行あり:

$s+=$_=<>;
print+(map$s=~s/.(?=(.|))/~$1?$&+$1:''/eg>1?"$_: $s$/":(),/ /..$')[-5..-1]

+編集:-nコマンドラインスイッチを使用しない理由はありません。スコアは82 = 81 + 1です。

$s+=$_;
print+(map$s=~s/.(?=(.|))/~$1?$&+$1:''/eg>1?"$_: $s$/":(),/ /..$')[-5..-1]

そして、可能性のある整数オーバーフローはOK、それは81 = 80 + 1です

$.=$_;
print+(map$.=~s/.(?=(.|))/~$1?$&+$1:''/eg>1?"$_: $.$/":(),/ /..$')[-5..-1]

新しいことを学びました。驚くばかり!
core1024

2

Javascript、247 278 288 307文字

 var t=[],q=1;function f(a,c){var x=a.toString().split(''),r='',p=parseInt;for(y in x){var i=p(y);if(i){r+=(p(x[i])+p(x[i-1])).toString();}}if(c!=0&&a>10){t.push(q+++':'+r+'\n');if(q>6){t.shift()}f(r,c-1);}console.log(t.join(',').replace(/,/g,''))}

フォーマット済み

var t = [],
q = 1;

function f(a, c) {
 var x = a.toString().split(''),
    r = '',
    p = parseInt;
 for (y in x) {
    var i = p(y);
    if (i) {
        r += (p(x[i]) + p(x[i - 1])).toString();
    }
 }
 if (c != 0 && a > 10) {
    t.push(q+++':' + r + '\n');
    if (q > 6) {
        t.shift()
    }
    f(r, c - 1);
 }
 console.log(t.join(',').replace(/,/g, ''))
}

編集1:三項を削除

編集2:「スキップ」0インデックスのロジックを反転

編集3:再帰呼び出しを作り直しました。

フィドル


心配する必要はありません、ここで見るものは何もありません。それは最初の5を印刷していたと思ったが、それはあなたのフィドルであるはずです。良い仕事:)
マット

2

Bash + coreutils、115バイト

for((a=$1;++i<=$2&a>9;)){
a=`paste -d+ <(fold -1<<<${a%?}) <(fold -1<<<${a#?})|bc|tr -d '
'`
echo $i: $a
}|tail -n5

出力:

$ ./appended-number.sh 3541 50
6: 1411
7: 552
8: 107
9: 17
10: 8
$ ./appended-number.sh 3541 5
1: 895
2: 1714
3: 885
4: 1613
5: 774
$ 

2

JavaScript(ECMAScript 6ドラフト)-134文字

f=(x,y,i=0,j=[])=>([m=''].map.call(m+x,(z,p,n)=>m+=p?+z+1*n[p-1]:m),j[i++]=i+': '+m,m.length>1&&i<y?f(m,y,i,j):j.slice(-5).join('\n'))

例:

f(372,5)
"1: 109
2: 19
3: 10
4: 1"

f(3541,50)
"6: 1411
7: 552
8: 107
9: 17
10: 8"

f(3541,5)
"1: 895
2: 1714
3: 885
4: 1613
5: 774"

1

Javascript、182バイト

function f(I,T){s=[],x=1;for(;;){d=(""+I).split("");l=d.length;if(l==1||x>T)break;for(I="",i=1;i<l;)I+=+d[i-1]+ +d[i++];s.push(x+++": "+I)}s=s.slice(-5);for(i in s)console.log(s[i])}

1

Perlの、166の 147 138 129バイト

<>=~/ /;for$i(1..$'){@n=split'',$s||$`;$s=join'',map{$n[$_]+$n[$_+1]}0..@n-2;@o=(@o,"$i: $s");$s<10&&last}print join$/,@o[-5..-1]

ゴルフをしていない:

<> =~ / /;
for $i (1..$') {
    @n = split'', $s||$`;
    $s = join'',map {$n[$_]+$n[$_+1]} 0..@n-2;
    @o = (@o, "$i: $s");
    $s<10 && last
}
print join$/,@o[-5..-1]

全体が5ステップ未満の場合、余分な空の行が出力されることをお勧めします。


交換する(('')x5, @o, "$i: $s")(@o, "$i: $s")してjoin"\n", @o[-5..0]join"\n", @o[-5..-1]。その後、3バイト先に進みます;)
core1024

余分な空の行に問題はありません。
マット

core1024おかげで:)私もあなたにヒントを与えるつもりだったが、すでに一部で「しない限り」という長いを処分した@
タル

1

Java      524   405 365文字[414のバイト]

ゴルフバージョン: class A{static int n=0;List<String> s=new ArrayList<>();void c(int b,int r){String d=b+"";if(r==0||b <= 9){int m=s.size();for(int i= m>=5?m-5:0;i<m;i++)System.out.println(s.get(i));return;}String l="";for(int i=0;i<d.length()-1;i++)l+=d.charAt(i)+d.charAt(i+1)-96;s.add(++n+":"+l);c(Integer.valueOf(l),--r);}public static void main(String[] a){new A().c(3541,50);}}

読み取り可能なバージョン:

class AddDigits {
static int n = 0;
List<String> steps = new ArrayList<>();

void count(int num, int count) {
    String digits = num + "";
    if (count == 0 || num <= 9) {
        int stepsSize = steps.size();
        for (int i = stepsSize >= 5 ? stepsSize - 5 : 0; i < stepsSize; i++) {
            System.out.println(steps.get(i));
        }
        return;
    }
    String line = "";
    for (int i = 0; i < digits.length() - 1; i++) {
        line += digits.charAt(i) + digits.charAt(i + 1) - 96;
    }
    steps.add(++n + ":" + line);
    count(Integer.valueOf(line), --count);
}

public static void main(String[] args) {
    new AddDigits().count(3541, 50);
}
}

変数名と関数名に1文字を使用して、これを縮小できます。
レックスウェッブ

完了...また、digits.length == 1の代わりにnum <= 9を使用して再帰を停止するようにロジックを変更しました(このスレッドでのみ見られました...以前は私にヒットしませんでした)。
user12345

あなたはあなたに追加の3 chatacters与えるyoutはmainメソッドに引数名の長さを減らすことができる
user902383

文字列を文字の配列に変換する必要はありません。chatAtメソッドを使用して文字列から単一の文字にアクセスできます
user902383

1
そして最後、あなたは文字列にあなたの文字を変換し、それを解析する必要があるといけない、代わりにInteger.valueOf(digits[i] + "") + Integer.valueOf(digits[i + 1] + "");あなたができる(digits[i] + digits[i+1] - 96)
user902383

1

JavaScript 133バイト

function f(n,g){for(c=r=[];g--;(n=s)&&(r[c++]=c+': '+s))for(i=s='',n+=s;n[++i];s+=n[i]-+-n[i-1]);console.log(r.slice(-5).join('\n'))}

ゴルフをしていない:

function sums(num, guard) {
    for(count = res = [];guard--;(num = sum) && (res[count++] = count + ': ' + sum))
        for(i = sum = '',num += sum;num[++i];sum += num[i] -+- num[i-1]);
    console.log(res.slice(-5).join('\n'))
}

唯一の問題は、関数名が変数の1つと同じであることです:)しかし、この手法は素晴らしいです。
マット

いい視点ね!関数の名前を変更しました;)
core1024

1

Java、341文字 371文字

 class a{public static void main(String[] a){p(3541,50);}static void p(int n,int k){Queue<String>q=new LinkedList();int c=0;while(n>9&&c<k){c++;String r="";String p=""+n;for(int i=0;i<p.length()-1;i++)r+=((p.charAt(i)+p.charAt(i+1)-96));n=Integer.parseInt(r);q.add(c+": "+n);if(q.size()>5)q.remove();}for(String s:q){System.out.println(s);}}}

フォーマット済み:

class a {
public static void main(String[] a) {
    p(3541, 50);
}

static void p(int n, int k) {
    Queue<String> q = new LinkedList();
    int c = 0;
    while (n > 9 && c < k) {
        c++;
        String r = "";
        String p = "" + n;
        for (int i = 0; i < p.length() - 1; i++)
            r += ((p.charAt(i) + p.charAt(i + 1) - 96));
        n = Integer.parseInt(r);
        q.add(c + ": " + n);
        if (q.size() > 5)
            q.remove();
    }
    for (String s : q) {
        System.out.println(s);
    }
}}

user902383のおかげで、「Integer.valueOf()」の代わりに-96を使用して文字列を配列に分割せずに、コードを30文字削減できました。


それでもいくつかの文字を減らすことができますclass a{public static void main(String[] a) {p(3541, 50);}static void p(int n,int k){Queue<String> q=new LinkedList();int c=0;while(n>9&&c<k){c++;String r="";String p=""+n;for(int i=0;i<p.length()-1;i++)r+=((p.charAt(i)+p.charAt(i+1)-96));n=Integer.parseInt(r);q.add(c+": "+n);if(q.size()>5)q.remove();}for(String s:q){System.out.println(s);}}}
user902383

0

ダーツ、602 588バイト

Dartはおそらくこれを行うには最悪の言語の1つです。これを行うには、より良い方法を見つける必要があります。

とにかく、ここに私のエントリがあります:

コンソールからの入力

var steps={};void main(a){c(a[0],int.parse(a[1]));}void c(inp,m){int i=0;int n=int.parse(inp);while(++i<=m){n=addUp(n.toString());steps[i]=n;if(n<10)break;}printSteps();}int addUp(n){var ns=[];for(int i=0;i<n.length;i++){try{ns.add(n[i]+n[i+1]);}catch(e){}}return addNumbers(ns);}int addNumbers(ns){var it=ns.iterator;var s="";while(it.moveNext()){int i=0;for(var t in it.current.split('')){i+=int.parse(t);}s=s+i.toString();}return int.parse(s);}void printSteps(){int l=steps.length;for(int i=getStart(l);i<=l;i++){print("${i}:\t${steps[i]}");}}int getStart(l){int m=l-4;return m>0?m:1;}

そして、わずかに縮小されていないバージョン:

var steps = {};

void main(a)
{
    c(a[0], int.parse(a[1]));
}

void c(String input, int max)
{
    int i = 0;
    int n = int.parse(input);

    while(++i <= max)
    {
        n = addUp(n.toString());

        steps[i] = n;

        if(n < 10)
            break;
    }

    printSteps();
}

int addUp(String n)
{
    List numbers = [];

    for(int i = 0; i < n.length; i++)
    {
        try
        {
            numbers.add(n[i] + n[i + 1]);
        }
        catch(e){}
    }

    return addNumbers(numbers);
}

int addNumbers(List numbers)
{
    Iterator it = numbers.iterator;

    String s = "";

    while(it.moveNext())
    {
        int i = 0;
        for(String s in it.current.split(''))
        {
            i += int.parse(s);
        }

        s = s + i.toString();
    }

    return int.parse(s);
}

void printSteps()
{
    int l = steps.length;

    for(int i = getStart(l); i <= l; i++)
    {        
        print("${i}:\t${steps[i]}");
    } 
}

int getStart(int l)
{
    int m = l - 4;
    return m > 0 ? m : 1;
}

0

PERL 135 129/125 125/121バイト

タルの答えと同じバグがあります

sub c{($e,$l)=@_;print join"\n",(grep/\d$/,map{$s="";{$e=~/(.)(.)/;redo if""ne($e=$2.$')and$s.=$1+$2};++$c.": ".($e=$s)}1..$l)[-5..-1]}

関数として129バイトを編集します。

sub c{($e,$l)=@_;print join$/,(grep/\d$/,map{$s="";{$e=~/(.)(.)/;redo if""ne($e=$2.$')and$s.=$1+$2}"$_: ".($e=$s)}1..$l)[-5..-1]}

関数としての125バイト:

sub c{($e,$l)=@_;print+(grep/\d$/,map{$s="";{$e=~/(.)(.)/;redo if""ne($e=$2.$')and$s.=$1+$2}"$_: ".($e=$s).$/}1..$l)[-5..-1]}

コンソールスクリプトとして125バイト(hashbangなし):

($e,$l)=@ARGV;print join$/,(grep/\d$/,map{$s="";{$e=~/(.)(.)/;redo if""ne($e=$2.$')and$s.=$1+$2}"$_: ".($e=$s)}1..$l)[-5..-1]

コンソールスクリプトとして121バイト(hashbangなし):

($e,$l)=@ARGV;print+(grep/\d$/,map{$s="";{$e=~/(.)(.)/;redo if""ne($e=$2.$')and$s.=$1+$2}"$_: ".($e=$s).$/}1..$l)[-5..-1]

拡張:

sub c
{
    ($e, $l) = @_;
    print +(grep /\d$/, map {
        $s="";
        {
            $e =~ /(.)(.)/;
            redo if "" ne ($e = $2.$') and $s .= $1 + $2
        }
        "$_: ".($e = $s).$/
    } 1 .. $l)[-5 .. -1]
}

でテストするc(372,4);

[blank line]
1: 109
2: 19
3: 10
4: 1

でテストするc(3541,50);

6: 1411
7: 552
8: 107
9: 17
10: 8

ただし、最後の5つのステップのみを印刷することになっていると思います。
タル

修正済み;)
core1024

そして、あなたはまだ私の3バイト先を行っています...それを爆発させてください!:p
タル

@タル私たちは今でも:D
core1024

0

C#-269

void F(int x,int y){var o=new List<string>();var i=x+"";for(int n=1;n<y&&i.Length>1;n++){var s="";for(int z=0;z<i.Length;z++){int a=i[z]-'0';var t=a+(z+1!=i.Length?i[z+1]-'0':-a);if(t!=0)s+=t;}i=s;o.Add(n+": "+i);}foreach(var p in o.Skip(o.Count-5))Debug.WriteLine(p);}

読みやすい:

void F(int x,int y){
    var o=new List<string>();
    var i=x+"";
    for(int n=1;n<y&&i.Length>1;n++)
    {
        var s="";
        for(int z=0;z<i.Length;z++){
            int a=i[z]-'0';
            var t=a+(z+1!=i.Length?i[z+1]-'0':-a);
            if(t!=0)
                s+=t;
        }
        i=s;
        o.Add(n+": "+i);
    }
    //Output
    foreach(var p in o.Skip(o.Count-5))
        Debug.WriteLine(p);
}

使用法:

F(3541, 50)

出力:

6: 1411
7: 552
8: 107
9: 17
10: 8

0

コブラ-363

かなり憂鬱な結果が...しかし、ちょっと、私はまだJavaを破った。

それはすべきである実用的なテストケースのための整数オーバーフローに対して免疫こと。

class P
    cue init(a,b)
        base.init
        l=[]
        c=.p(a.toString)
        for x in b
            l.add("")
            y=l.count
            for i in c.count-1,l[y-1]+=(c[i]+c[i+1]).toString
            if l.last.length<2,break
            c=.p(l.last)
        z=if(y>5,y-5,0)
        for x in l[z:y],print"[z+=1]:",x
    def p(n) as List<of int>
        c=List<of int>()
        for i in n,c.add(int.parse(i.toString))
        return c

0

Python 2.7、 174 173 158文字

多くの文字列を使用してタスクを実行します。

x,n=raw_input().split()
o,i=[],0
while int(n)>i<o>9<x:x="".join(`sum(map(int,x[j:j+2]))`for j in range(len(x)-1));i+=1;o+=[`i`+": "+x]
print"\n".join(o[-5:])

Python 2.7、155文字

関数を定義するバージョン

def a(x,n):
 o,i,x=[],0,`x`
 while n>i<o>9<int(x):x="".join(`sum(map(int,x[j:j+2]))`for j in range(len(x)-1));i+=1;o+=[`i`+": "+x]
 print"\n".join(o[-5:])

わずかに未使用のバージョン:

x,n=map(int,raw_input().split())
o,i=[],1
while i<=n and x>9:
  x=int("".join(`sum(map(int,`x`[j:j+2]))` for j in range(len(`x`)-1)))
  o.append("%d: %d"%(i,x))
  i+=1
print "\n".join(o[-5:])

0

ハスケル、154

s=show
z=zipWith
m#n=concat.z(\a b->s a++": "++b++"\n")[1..].(\x->drop(length x-n)x).takeWhile(/="").iterate((\x->z(+)x(tail x)>>=s).map(\x->read[x]))$s m

使用例:

λ> 3541#5
"1: 1411\n2: 552\n3: 107\n4: 17\n5: 8\n"

読みやすくするには、次を使用しますputStr

λ> putStr $ 3541#5
1: 1411
2: 552
3: 107
4: 17
5: 8

計算の最後の5ステップのみをリストする必要があります。putStr $ 3541#50OPの例と比較してみてください。それ以外の場合は、ここにHaskellの男がいるのが嬉しいです。
core1024

@ core1024そうです!間違ったラベルを付けましたが、あなたは正しいです。明日修正します。
フランク

0

グルーヴィー-191文字

Groovy 2.2.1に移植されたThomasRüpingのソリューションに基づきます。

f={it as int};n=args[0];s=f args[1];q=[];x=0;while(f(n)>9&&x<s){x++;d=n.split("");n="";for(i in 1..d.length-2)n+=f(d[i])+f(d[i+1]);q << "$x: $n"};q[-1..5].reverse().each{println it}

実行と出力:

bash$ groovy Numbers.groovy 3541 50 
6: 1411
7: 552
8: 107
9: 17
10: 8

ゴルフをしていない:

f = {it as int}
n = args[0]
s = f args[1]

queue = []
stepCounter = 0

while (f(n) > 9 && stepCounter < s) {
    stepCounter++
    digits=n.split("")
    n=""
    for(i in 1..digits.length-2) {
        n += f(digits[i]) + f(digits[i+1])
    }
    queue << "$stepCounter: $n"
}

queue[-1..5].reverse().each{ println it }

0

** C 186 179 174 **

f(int a,int z){for(int c,d,i,j=0,m[5];m[j++%5]=a,j<=z&&a/10;a=c)for(c=0,i=1;a/10;d=a%10+(a/=10)%10,c+=d*i,i*=d<10?10:100);for(i=j<5?0:j-5;i<j;printf("%d: %d\n",i,m[i++%5]));}

やや少ないゴルフ(ミニゴルフ?)

f(int a, int z)
{


for(int c,d,i,j=0,m[5];m[j++%5]=a,j<=z&&a/10;a=c)
    for(c=0,i=1;a/10;d=a%10+(a/=10)%10,c+=d*i,i*=d<10?10:100);

    for(i=j<5?0:j-5;i<j;printf("%d: %d\n",i,m[i++%5]));

}

5つの結果を周期的に保存するのに十分なメモリを割り当てるだけです。外側のループは、制限に達するか1桁に達するまで続きます。内側のループは、数字の最後の数字を数字の最後の数字の1/10に加算し、これに10のべき乗を掛けた結果を加算します。あなたが最初にあなたが10で除算し、合計を取得するために繰り返します。次に、最後の5つの結果まで印刷します。

次の課題は、ゴルフでいくつかのスクリプト言語を打ち負かすのに十分な剃毛ができるかどうかを確認することです。

編集:現在は警告付きでコンパイルされますが、「void」宣言を削除することで5文字が削り取られました。


ゴルフのヒント:f(int a、int z)-> f(a、z)そしてt = 10を使用してさらに2文字を節約できます。しかし、同じ表現で/ = 10が定義されていないを使用して
edc65

0

C#の- 309 330 320 306のバイト

ゴルフバージョン:

private static void F(int aN,int aM){var s=new List<string>();var n=aN.ToString();for(int i=1;i<=aM;i++){int z=n.Length;if(z==1){break;}var a=n;n="";for(int j=0;j<z-1;j++){int r=a[j]-'0'+a[j + 1]-'0';n=n+r;}s.Add(i+": "+n);}int l=s.Count;int p=5;if(l<5){p=l;}for(int k=l-p;k<l;k++){Debug.WriteLine(s[k]);}}

使用法:F(3541,50);

読みやすさのためのゴルフバージョン:

private static void AppendNumbers(int aNum, int aMaxSteps)
    {
        var results = new List<string>();
        var numString = aNum.ToString();
        for (int i = 1; i <= aMaxSteps; i++)
        {
            int stringLength = numString.Length;
            if (stringLength == 1)
            {
                break;
            }
            var a = numString;
            numString = "";
            for (int j = 0; j < stringLength-1; j++)
            {
                int additionResult = a[j]-'0' + (a[j + 1]-'0');
                numString = numString + additionResult;
            }
            results.Add(i+": "+ numString);
        }
        int numberOfResults = results.Count;
        int p = 5;
        if (numberOfResults < 5)
        {
            p = numberOfResults;
        }
        for (int k = numberOfResults - p; k < numberOfResults; k++)
        {
            Debug.WriteLine(results[k]);
        }
    }

改善の提案はいつでも歓迎します!;)

編集: String.Emptyを削除し、「」に置き換えて10バイト節約しました。

編集2:文字列のtippのmalikに感謝します!


必要ありません.ToCharArray()。ストリング= char配列
JZM

ああ、別のあなたがすることができるもので、代わりに.ToString()、やる+""
JZM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.