Game Bilangan Tambah

16

Game Bilangan Tambah

Tulis fungsi / program yang mengambil 2 parameter integer, parameter integer atau variabel integer , angka awal, dan jumlah iterasi maks. Kode tersebut harus melakukan contoh permainan berikut untuk membuat nomor baru, dan ulangi sampai nomor tersebut satu digit tersisa. misalnya.

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

Pada dasarnya, ambil setiap digit individu dan tambahkan ke tetangganya, lalu tambahkan hasil penambahan berikutnya juga.

Hitungan iterasi max adalah untuk menjaga loop tak terbatas, dan ketika max mengenai, kode harus membuang 5 langkah nomor terakhir. Output yang sama harus terjadi ketika menyelesaikan dengan mencapai satu digit. Jika kurang dari 5 langkah terjadi, hanya output angka yang valid.

Output akan muncul seperti ( Step: Number) termasuk 5 langkah terakhir dari langkah-langkah yang selesai atau diakhiri:

func(3541, 50) akan menghasilkan format output yang tepat ini:

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

func(3541, 5) akan menghasilkan:

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

Seluruh perhitungan menjadi:

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

Jika ada kurang dari 5 langkah, cukup cetak langkah-langkah yang diambil.

Hanya gunakan lib bawaan, parameter bisa dari mana saja (apa pun yang paling mudah untuk bahasa pilihan Anda). Tidak ada batasan ukuran integer maksimum, dan jika ada luapan, biarkan crash.

Mengingat ini tidak terlalu sulit dari sudut pandang teka-teki, saya akan memberikan sampai hari Minggu tanggal 25, 20:00 (UTC + 8) untuk pengiriman yang dipertimbangkan untuk jawaban yang diterima, di mana titik terpendek dari bahasa apa pun akan menjadi pemenang.

EDIT:

Selamat kepada Howard, menang dengan jawaban 48 GolfScript .

Disebutkan secara khusus untuk marinus tempat kedua dengan jawaban 66 APL .

Favorit pribadi saya (menjadi bias terhadap JavaScript) adalah jawaban core1024 .

Mat
sumber
Saya tidak mengerti, apakah func(3541, 5)seharusnya mencetak 5 langkah atau 10?
Tal
5 langkah. Ini harus berhenti ketika menyentuh iterasi 5, tidak melakukan iterasi lagi dan mencetak 5 langkah terakhir. Saya hanya menyertakan set lengkap langkah untuk menunjukkan proses perhitungan penuh untuk input tertentu.
Mat

Jawaban:

4

GolfScript, 48 46 karakter

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

Terima kasih kepada Peter Taylor untuk peningkatan dua karakter.

Mengharapkan kedua angka di tumpukan. Coba online .

Contoh:

> 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
Howard
sumber
Ada penghematan moderat dengan menambahkan flip setelah .,,dan mengubah peta akhir menjadi adil {': '*}%.
Peter Taylor
10

APL (66)

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

Argumen kiri adalah jumlah iterasi maksimum dan argumen kanan adalah angka awal.

Penjelasan:

  • ∆←⍺{... }⍕⍵: meneruskan argumen kiri sebagai angka dan argumen kanan sebagai string ke fungsi yang menghitung daftar angka, dan menyimpannya di :
    • (1<⍴⍵)∧⍺>0:: jika jumlah digit lebih dari 1 dan jumlah iterasi yang tersisa lebih dari 0:
      • ⍎¨⍵: mengevaluasi setiap digit
      • 2+/: jumlah setiap pasangan
      • ⍕¨: memformat setiap angka sebagai string
      • ∆←,/: menyatukan string dan menyimpan di
      • ∆,(⍺-1)∇⊃∆: return , diikuti oleh hasil penerapan fungsi ini dengan satu iterasi yang lebih sedikit diizinkan
    • ⋄⍬: jika tidak, kembalikan daftar kosong
  • ∆,⍪⍳⍴∆: pasangkan setiap elemen dengan indeksnya di
  • {...}/ : untuk setiap pasangan:
    • (⍕⍵),': ',⍺: mengembalikan string dengan indeks, diikuti oleh :, diikuti oleh angka
  • ↑¯5↑: ubah daftar string menjadi matriks sehingga ditampilkan pada baris terpisah, dan ambil 5 item terakhir

Uji:

      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  
marinus
sumber
Apakah ini menangani tampilan kurang dari 5 langkah dengan benar? Misalnya 3 {...} 3541.
algorithmshark
@algorithmshark Itu sekarang (memberi garis ekstra dengan yang :pertama)
marinus
5

Mathematica, 172 karakter

Ini terlalu lama, berkat nama fungsi Mathematica dan penanganan string yang jelek ("game" yang sebenarnya hanya 76 dari karakter-karakter itu), tapi ini dia:

""<>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]

Ini mengharapkan nomor input dalam variabel ndan jumlah iterasi maksimum dalamm .

Dengan lebih sedikit golf:

"" <> 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
    ]
Martin Ender
sumber
5

Ruby, 106 karakter

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}

Saya tidak 100% jelas tentang aturan input, tetapi jika saya bisa melakukannya n sebagai string saya dapat menyimpan 5 karakter, dan jika saya bisa menggunakan variabel yang telah ditentukan dan menulis program alih-alih fungsi, saya bisa menyimpan 9 lagi.

Menciptakan fungsi fyang bisa disebut sebagai berikut:

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
Paul Prestidge
sumber
2
Pengamatan menarik bahwa 4 "atau lebih" 9 "menghasilkan hasil yang berbeda
Digital Trauma
4

J - 96 92 char

Saya pertama kali memecahkan ini dengan asumsi bahwa semua game dihentikan, dan ini kembali menggigit saya selama pengujian. Argumen kiri adalah jumlah langkah, argumen kanan adalah posisi awal, yang dapat diberikan sebagai angka atau string.

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

Ini agak terlalu golf dan berbelit-belit untuk degolf memuaskan, jadi saya akan mengatakan ini:

  • (<@>:@[(' '-.~[:,@":2+/\"."0@]^:)":)Bagian ini menjalankan permainan untuk sejumlah langkah yang ditentukan. 2+/\bertanggung jawab untuk menambahkan setiap pasangan angka, dan <@>:@[bersama-sama dengan ^:kontrol menangkap langkah-langkah menengah permainan.
  • (#\(,': '&,)&":"0,)@}.@({.~,i.0:)@:".Bagian ini memformat semua hasil sebagai step: result. ({.~,i.0:)memastikan kita tidak mengambil terlalu banyak langkah, #\adalah nomor langkah, dan (,': '&,)&":"0bit menambahkan titik dua dan spasi.
  • (-@(<.5<.#){.])Bagian ini memotong lima langkah yang relevan atau kurang dari daftar lengkap. <.berarti 'minimum'.

Ini bekerja, tetapi jika Anda mulai dengan jumlah yang cukup besar, hasil gim dengan cepat mulai bertambah besar, yang membuat J beralih dari bilangan bulat ke ganda yang tidak tepat. Berikut ini beberapa contohnya:

   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
algoritme hiu
sumber
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])}

Tidak disatukan

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])
}
edc65
sumber
3

Perl, 86 84

Dengan baris baru untuk keterbacaan:

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

+ Edit: Tidak ada alasan untuk tidak menggunakan -nsaklar baris perintah, dan kemudian skor adalah 82 = 81 + 1 :

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

Dan, kemungkinan integer overflow menjadi OK, itu 81 = 80 + 1

$.=$_;
print+(map$.=~s/.(?=(.|))/~$1?$&+$1:''/eg>1?"$_: $.$/":(),/ /..$')[-5..-1]
pengguna2846289
sumber
Saya belajar hal baru. Luar biasa!
core1024
2

Javascript, 247 278 288 307 Karakter

 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,''))}

Diformat

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, ''))
}

Sunting 1 : Terner dihapus

Edit 2 : Logika terbalik untuk "melompati" indeks 0

Sunting 3 : Panggilan rekursif ulang.

Biola

Origineil
sumber
Jangan khawatir, tidak ada yang bisa dilihat di sini. Pikir itu mencetak pertama 5 tetapi harus dengan biola Anda. Kerja bagus :)
Matt
2

Bash + coreutils, 115 byte

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

Keluaran:

$ ./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
$ 
digital Trauma
sumber
2

JavaScript (ECMAScript 6 Draft) - 134 Karakter

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'))

Contoh:

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"
MT0
sumber
1

Javascript, 182 byte

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])}
Camilan
sumber
1

Perl, 166 147 138 129 byte

<>=~/ /;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]

Tidak Terkumpul:

<> =~ / /;
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]

Saya harap tidak apa-apa mencetak beberapa baris kosong tambahan jika semuanya kurang dari 5 langkah.

Tal
sumber
Ganti (('')x5, @o, "$i: $s")dengan (@o, "$i: $s")dan join"\n", @o[-5..0]dengan join"\n", @o[-5..-1]. Maka Anda akan menjadi 3 byte di depan;)
core1024
Saya tidak punya masalah dengan saluran ekstra kosong.
Matt
@ core1024 Terima kasih :) Saya akan memberi Anda tip juga, tetapi Anda sudah menyingkirkan bagian "kecuali" yang panjang itu
Tal
1

Java      524   405 365 karakter [414 byte]

Versi golf: 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);}}

Versi yang dapat dibaca:

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);
}
}
pengguna12345
sumber
Anda dapat mengecilkan ini dengan menggunakan 1 karakter untuk nama variabel dan fungsi.
Lex Webb
Selesai ... juga mengubah logika untuk menghentikan rekursi menggunakan num <= 9 alih-alih digit.length == 1 (Terlihat di utas ini saja ... tidak mengenai saya sebelumnya).
pengguna12345
Anda dapat mengurangi panjang nama argumen dalam metode utama Anda, yang akan memberi Anda 3 karakter tambahan
user902383
Anda tidak perlu mengkonversi string ke array karakter, Anda dapat mengakses karakter tunggal dari string menggunakan chatAt metode
user902383
1
dan hal terakhir, Anda tidak perlu mengubah karakter Anda menjadi string dan kemudian menguraikannya, Integer.valueOf(digits[i] + "") + Integer.valueOf(digits[i + 1] + "");Anda bisa melakukannya(digits[i] + digits[i+1] - 96)
user902383
1

JavaScript 133 byte

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'))}

Tidak Terkumpul:

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'))
}
core1024
sumber
Satu-satunya masalah adalah nama fungsinya sama dengan salah satu variabel Anda :) Tapi tekniknya mengagumkan.
Matt
Poin bagus! Saya mengganti nama fungsi;)
core1024
1

Jawa, 341 karakter 371 karakter

 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);}}}

Diformat:

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);
    }
}}

Terima kasih kepada user902383 saya bisa mengurangi kode sebanyak 30 karakter, dengan tidak memisahkan String menjadi sebuah Array menggunakan -96 bukannya "Integer.valueOf ()

Thomas Rüping
sumber
Anda masih dapat mengurangi beberapa karakter,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

Dart, 602 588 byte

Dart mungkin adalah salah satu bahasa terburuk untuk melakukan ini di ... Saya harus menemukan cara yang lebih baik untuk melakukan ini.

Bagaimanapun, ini entri saya:

Input melalui konsol

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;}

Dan versi yang ungolf, sedikit tidak ditambang:

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;
}
MisterBla
sumber
0

PERL 135 129/125 125/121 byte

Ini memiliki bug yang sama dengan jawaban Tal

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]}

Edit 129 byte sebagai fungsi:

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 byte sebagai fungsi:

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 byte sebagai skrip konsol (tanpa 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 byte sebagai skrip konsol (tanpa 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]

Diperluas:

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]
}

Uji dengan c(372,4);:

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

Uji dengan c(3541,50);:

6: 1411
7: 552
8: 107
9: 17
10: 8
core1024
sumber
Saya percaya Anda hanya harus mencetak 5 langkah terakhir.
Tal
Memperbaikinya
Dan Anda masih 3 byte di depan saya ... ledakan itu! : p
Tal
@Tal Kami bahkan sekarang: 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);}

Dapat dibaca:

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);
}

Pemakaian:

F(3541, 50)

Keluaran:

6: 1411
7: 552
8: 107
9: 17
10: 8
jzm
sumber
0

Cobra - 363

Hasil yang agak menyedihkan ... tapi hei, saya masih mengalahkan Jawa.

Ini harus kebal terhadap overflows integer untuk praktis uji kasus.

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
Suram
sumber
0

Python 2.7, 174 173 158 karakter

Menggunakan banyak string untuk melakukan tugas.

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 karakter

Versi mendefinisikan fungsi

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:])

Versi sedikit tidak berbulu:

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:])
avall
sumber
0

Haskell, 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

contoh penggunaan:

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

Agar lebih mudah dibaca, gunakan putStr:

λ> putStr $ 3541#5
1: 1411
2: 552
3: 107
4: 17
5: 8
Flonk
sumber
Anda harus mendaftar hanya 5 langkah terakhir dari perhitungan. Coba putStr $ 3541#50dan bandingkan dengan contoh OP. Kalau tidak, aku senang ada pria Haskell di sini.
core1024
@ core1024 Ya! Meskipun saya salah menyebut mereka, Anda benar. Saya akan memperbaikinya besok.
Flonk
0

Groovy - 191 182 karakter

Berdasarkan solusi Thomas Rüping , porting ke Groovy 2.2.1:

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}

Eksekusi dan keluaran:

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

Tidak Terkumpul:

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 }
Michael Easter
sumber
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]));}

Sedikit kurang golf (mini-golf?)

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]));

}

Alokasikan saja memori yang cukup untuk menyimpan lima hasil secara siklis. Lingkaran luar terus berjalan sampai kita mencapai batas atau mencapai satu digit. Loop dalam menambahkan angka terakhir dari angka ke angka terakhir 1/10 dari angka dan menambahkan ini, dikalikan dengan kekuatan 10 yang relevan dengan hasilnya. Bagilah nomor Anda terlebih dahulu dengan 10 dan ulangi untuk mendapatkan total. Kemudian cetak hingga lima hasil terakhir.

Tantangan berikutnya adalah melihat apakah saya bisa mencukur cukup banyak untuk mengalahkan beberapa bahasa skrip di golf.

Sunting: Sekarang dikompilasi dengan peringatan tetapi lima karakter dicukur dengan menghapus deklarasi "void"

Ahli alkimia
sumber
Kiat golf: f (int a, int z) -> f (a, z) dan dapat menggunakan t = 10 menghemat 2 karakter lagi. Tetapi menggunakan a dan = 10 dalam ekspresi yang sama tidak ditentukan
edc65
0

C # - 309 330 320 306 Bytes

Versi Golf:

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]);}}

Penggunaan: F (3541,50);

Versi tidak dikoleksi untuk dibaca:

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]);
        }
    }

Saran untuk perbaikan selalu kami terima! ;)

Sunting: Removed String.Empty dan ganti dengan "" untuk menghemat 10 Bytes.

Edit 2: Berkat malik untuk tipp dengan string!

tsavinho
sumber
Kamu tidak perlu .ToCharArray(). String = array char
jzm
Oh, dan hal lain yang bisa Anda lakukan adalah, bukannya .ToString() , lakukan+""
jzm