Trò chơi số được nối


16

Trò chơi số được nối

Viết hàm / chương trình lấy 2 tham số nguyên tham số nguyên hoặc biến số nguyên , số bắt đầu và số lần lặp tối đa. Mã phải thực hiện ví dụ trò chơi sau để tạo một số mới và lặp lại cho đến khi số đó là một chữ số còn lại. ví dụ.

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

Về cơ bản, lấy từng chữ số riêng lẻ và thêm nó vào hàng xóm của nó, sau đó nối thêm kết quả của lần bổ sung tiếp theo.

Số lần lặp tối đa là để bảo vệ các vòng lặp vô hạn và khi đạt đến mức tối đa, mã sẽ kết xuất 5 bước số cuối cùng. Đầu ra tương tự sẽ xảy ra khi kết thúc bằng cách đạt đến một chữ số. Nếu ít hơn 5 bước xảy ra, chỉ xuất các số hợp lệ.

Đầu ra sẽ xuất hiện như ( Step: Number) bao gồm 5 bước cuối cùng của các bước đã hoàn thành hoặc kết thúc:

func(3541, 50) sẽ tạo ra định dạng đầu ra chính xác này:

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

func(3541, 5) sẽ sản xuất:

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

Toàn bộ tính toán là:

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

Nếu có ít hơn 5 bước, chỉ cần in các bước đã thực hiện.

Chỉ sử dụng libs tích hợp, các tham số có thể từ bất cứ đâu (bất cứ điều gì dễ dàng nhất cho ngôn ngữ bạn chọn). Không có giới hạn về kích thước số nguyên tối đa và nếu có tràn, hãy để nó bị sập.

Do điều này không quá khó từ quan điểm giải đố, tôi sẽ đưa ra cho đến Chủ nhật ngày 25, 8 giờ tối (UTC + 8) để các bài nộp được xem xét cho câu trả lời được chấp nhận, tại thời điểm ngắn nhất trong bất kỳ ngôn ngữ nào sẽ là người chiến thắng.

BIÊN TẬP:

Xin chúc mừng Howard, chiến thắng với câu trả lời 48 GolfScript .

Đặc biệt đề cập đến bến thứ 2 với câu trả lời 66 APL .

Yêu thích cá nhân của tôi (thiên về JavaScript) là câu trả lời của core1024 .


Tôi không hiểu, func(3541, 5)nên in 5 bước hay 10?
Tal

5 bước. Nó sẽ dừng lại khi chạm vào lần lặp 5, không thực hiện thêm lần lặp nào và in ra 5 bước cuối cùng. Tôi chỉ bao gồm tập hợp đầy đủ các bước để hiển thị toàn bộ quy trình tính toán cho đầu vào cụ thể đó.
Matt

Câu trả lời:


4

GolfScript, 48 46 ký tự

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

Cảm ơn Peter Taylor vì đã cải thiện hai nhân vật.

Mong đợi cả hai số trên ngăn xếp. Hãy thử trực tuyến .

Ví dụ:

> 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

Có một sự tiết kiệm vừa phải bằng cách thêm một lần lật sau .,,và biến bản đồ cuối cùng thành {': '*}%.
Peter Taylor

10

APL (66)

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

Đối số bên trái là số lần lặp tối đa và đối số bên phải là số bắt đầu.

Giải trình:

  • ∆←⍺{... }⍕⍵: truyền đối số bên trái dưới dạng số và đối số bên phải dưới dạng chuỗi cho hàm tính toán danh sách các số và lưu trữ trong :
    • (1<⍴⍵)∧⍺>0:: nếu số lượng chữ số nhiều hơn 1 và số lần lặp còn lại nhiều hơn 0:
      • ⍎¨⍵: đánh giá từng chữ số
      • 2+/: tổng hợp từng cặp
      • ⍕¨: định dạng mỗi số dưới dạng chuỗi
      • ∆←,/: nối chuỗi và lưu trữ trong
      • ∆,(⍺-1)∇⊃∆: return , theo sau là kết quả của việc áp dụng hàm này với một lần lặp ít hơn được phép
    • ⋄⍬: nếu không, trả về danh sách trống
  • ∆,⍪⍳⍴∆: ghép từng phần tử với chỉ mục của nó trong
  • {... }/: cho mỗi cặp:
    • (⍕⍵),': ',⍺: trả về một chuỗi có chỉ mục, theo :sau là số
  • ↑¯5↑: biến danh sách các chuỗi thành một ma trận để chúng hiển thị trên các dòng riêng biệt và lấy 5 mục cuối cùng

Kiểm tra:

      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  

Liệu xử lý này hiển thị dưới 5 bước đúng cách? Ví dụ 3 {...} 3541.
thuật toán

@algorithmshark Nó bây giờ (nó đã cho dòng thêm với :đầu tiên)
marinus

5

Toán học, 172 ký tự

Việc này quá dài, nhờ vào tên hàm của Mathicala và xử lý chuỗi xấu xí ("trò chơi" thực tế chỉ có 76 trong số các ký tự đó), nhưng dù sao thì đây vẫn là:

""<>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ó hy vọng số lượng đầu vào trong biến nvà số lần lặp tối đa trong m.

Với ít golf hơn:

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

Ruby, 106 ký tự

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}

Tôi không rõ ràng 100% về các quy tắc đầu vào, nhưng nếu tôi có thể lấy nmột chuỗi, tôi có thể lưu 5 ký tự và nếu tôi có thể sử dụng các biến được xác định trước và viết chương trình thay vì hàm, tôi có thể lưu thêm 9 ký tự.

Tạo một hàm fcó thể được gọi như sau:

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
Quan sát thú vị rằng 4 "9" trở lên tạo ra kết quả phân kỳ
Chấn thương kỹ thuật số

4

J - 96 92 char

Trước tiên tôi đã giải quyết điều này với giả định rằng tất cả các trò chơi đã kết thúc và điều này quay trở lại để cắn vào mông tôi trong quá trình thử nghiệm. Đối số bên trái là số bước, đối số bên phải là vị trí bắt đầu, có thể được cung cấp dưới dạng số hoặc chuỗi.

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

Đây là một chút quá golf và gây khó chịu cho degolf thỏa mãn, vì vậy tôi sẽ nói điều này:

  • (<@>:@[(' '-.~[:,@":2+/\"."0@]^:)":)Phần này chạy trò chơi cho số bước được chỉ định. 2+/\chịu trách nhiệm thêm từng cặp chữ số và <@>:@[song song với các ^:điều khiển nắm bắt các bước trung gian của trò chơi.
  • (#\(,': '&,)&":"0,)@}.@({.~,i.0:)@:".Phần này định dạng tất cả các kết quả như step: result. ({.~,i.0:)đang đảm bảo rằng chúng ta không thực hiện quá nhiều bước, #\là số bước và (,': '&,)&":"0bit thêm dấu hai chấm và dấu cách.
  • (-@(<.5<.#){.])Phần này cắt giảm các bước năm hoặc ít hơn có liên quan ra khỏi danh sách đầy đủ. <.có nghĩa là 'tối thiểu của'.

Nó hoạt động, nhưng nếu bạn bắt đầu với một số lượng đủ lớn, kết quả của trò chơi sẽ nhanh chóng bắt đầu tăng kích thước, điều này khiến J chuyển từ số nguyên sang nhân đôi không chính xác. Dưới đây là một số ví dụ:

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

Bị đánh cắp

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

Với các dòng mới để dễ đọc:

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

+ Chỉnh sửa: Không có lý do gì để không sử dụng -nchuyển đổi dòng lệnh, và sau đó điểm là 82 = 81 + 1 :

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

Và, tràn số nguyên có thể là OK, đó là 81 = 80 + 1

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

Tôi đã học những bài hát mới. Tuyệt vời!
core1024

2

Javascript, 247 278 288 307 Ký tự

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

Định dạng

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

Chỉnh sửa 1 : Loại bỏ ternary

Chỉnh sửa 2 : Logic lộn ngược cho chỉ mục "bỏ qua" 0

Chỉnh sửa 3 : Làm lại cuộc gọi đệ quy.

Vĩ cầm


Đừng lo lắng, không có gì để xem ở đây. Nghĩ rằng nó đã được in 5 đầu tiên nhưng nó nên với fiddle của bạn. Làm tốt lắm :)
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

Đầu ra:

$ ./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 (Bản nháp ECMAScript 6) - 134 ký tự

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

Ví dụ:

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

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]

Ung dung:

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

Tôi hy vọng nó ổn khi in thêm một số dòng trống nếu toàn bộ chỉ mất chưa đến 5 bước.


Thay thế (('')x5, @o, "$i: $s")bằng (@o, "$i: $s")join"\n", @o[-5..0]bằng join"\n", @o[-5..-1]. Sau đó, bạn sẽ có 3 byte phía trước;)
core1024

Tôi không có bất kỳ vấn đề với các dòng trống thêm.
Matt

@ core1024 Cảm ơn :) Tôi cũng sẽ cho bạn một lời khuyên, nhưng bạn đã thoát khỏi phần "trừ khi" dài đó
Tal

1

Java      524   405 365 ký tự [414 byte]

Phiên bản chơi gôn: 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);}}

Phiên bản dễ đọc:

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

Bạn có thể thu nhỏ điều này bằng cách sử dụng 1 char cho tên biến và hàm.
Lex Webb

Xong ... cũng đã thay đổi logic để dừng đệ quy bằng num <= 9 thay vì chữ số.length == 1 (Chỉ thấy trong chủ đề này ... không đánh tôi trước đó).
user12345

bạn có thể giảm độ dài của tên đối số trong phương thức chính của bạn, điều đó sẽ cung cấp cho bạn thêm 3 nhân
vật trò chuyện

bạn không cần phải chuyển đổi chuỗi thành mảng ký tự, bạn có thể truy cập một ký tự từ chuỗi bằng chatAtphương thức
user902383

1
và điều cuối cùng, bạn không cần phải chuyển đổi ký tự của mình thành chuỗi và sau đó phân tích cú pháp, thay vào đó Integer.valueOf(digits[i] + "") + Integer.valueOf(digits[i + 1] + "");bạn có thể làm(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'))}

Ung dung:

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

Vấn đề duy nhất là tên hàm giống như một trong các biến của bạn :) Nhưng kỹ thuật này thật tuyệt vời.
Matt

Điểm tốt! Tôi đã đổi tên hàm;)
core1024

1

Java, 341 ký tự 371 ký tự

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

Định dạng:

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

Nhờ user902383 tôi đã có thể giảm mã xuống 30 ký tự, bằng cách không tách Chuỗi thành một mảng bằng cách sử dụng -96 thay vì "Integer.valueOf ()


bạn vẫn có thể giảm một số ký tự,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

Phi tiêu, 602 588 byte

Phi tiêu có lẽ là một trong những ngôn ngữ tồi tệ nhất để làm điều này trong ... Tôi sẽ cần tìm một cách tốt hơn để làm điều này.

Dù sao, đây là mục của tôi:

Nhập thông qua bảng điều khiển

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

Và phiên bản chưa được chỉnh sửa, hơi chưa hoàn thành:

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 byte

Nó có lỗi giống như câu trả lời của 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]}

Chỉnh sửa 129 byte dưới dạng hàm:

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 là một hàm:

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 dưới dạng tập lệnh bàn điều khiển (không có 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 dưới dạng tập lệnh bàn điều khiển (không có 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]

Mở rộng:

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

Kiểm tra với c(372,4);:

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

Kiểm tra với c(3541,50);:

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

Tôi tin rằng bạn chỉ nên in 5 bước cuối cùng.
Tal

Đã sửa lỗi;)
core1024

Và bạn vẫn còn 3 byte phía trước tôi ... nổ tung nó! : p
Tal

@Tal Chúng tôi thậm chí bây giờ: 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);}

Có thể đọc được

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

Sử dụng:

F(3541, 50)

Đầu ra:

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

0

Rắn hổ mang - 363

Một kết quả khá thất vọng ... nhưng này, tôi vẫn đánh bại Java.

nên được miễn nhiễm với tràn số nguyên cho các trường hợp thử nghiệm thực tế.

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 ký tự

Sử dụng rất nhiều chuỗi để thực hiện nhiệm vụ.

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 ký tự

Phiên bản xác định hàm

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

Phiên bản hơi vô căn cứ:

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

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

sử dụng ví dụ:

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

Để dễ đọc hơn, hãy sử dụng putStr:

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

Bạn phải liệt kê chỉ 5 bước cuối cùng ra khỏi tính toán. Hãy thử putStr $ 3541#50và so sánh nó với ví dụ của OP. Nếu không thì tôi mừng vì có một anh chàng Haskell ở đây.
core1024

@ core1024 Nó làm được! Mặc dù tôi đã dán nhãn sai cho họ, bạn đã đúng. Tôi sẽ sửa nó vào ngày mai.
Flonk

0

Groovy - 191 182 ký tự

Dựa trên giải pháp của Thomas Rüping , được chuyển sang 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}

Thực thi và đầu ra:

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

Ung dung:

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

Hơi ít chơi golf (mini-golfed?)

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

}

Chỉ cần phân bổ đủ bộ nhớ để lưu trữ năm kết quả theo chu kỳ. Vòng lặp bên ngoài tiếp tục cho đến khi chúng ta đạt đến giới hạn hoặc đạt đến một chữ số. Vòng lặp bên trong thêm chữ số cuối của số vào chữ số cuối cùng là 1/10 của số và thêm số này, nhân với lũy thừa 10 có liên quan đến kết quả. Chia số bạn trước mặc dù là 10 và lặp lại để lấy tổng. Sau đó in ra đến năm kết quả cuối cùng.

Thử thách tiếp theo là xem liệu tôi có thể cạo râu đủ để đánh bại một số ngôn ngữ kịch bản tại sân golf không.

Chỉnh sửa: Bây giờ biên dịch với cảnh báo nhưng năm ký tự bị xóa bằng cách xóa khai báo "void"


Mẹo chơi gôn: f (int a, int z) -> f (a, z) và có thể sử dụng t = 10 tiết kiệm thêm 2 ký tự. Nhưng sử dụng a và a / = 10 trong cùng một biểu thức là không xác định
edc65

0

C # - 309 330 320 306 byte

Phiên bản chơi gôn:

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

Cách sử dụng: F (3541,50);

Phiên bản Ungolfed cho dễ đọc:

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

Đề xuất cải tiến luôn được chào đón! ;)

Chỉnh sửa: Đã xóa String.Empty và thay thế nó bằng "" để tiết kiệm 10 byte.

Chỉnh sửa 2: Cảm ơn malik cho tipp với chuỗi!


Bạn không cần .ToCharArray(). Một chuỗi = mảng char
jzm

Ồ, và một điều khác bạn có thể làm là, thay vì .ToString(), làm+""
jzm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.