เกมต่อท้ายตัวเลข


16

เกมต่อท้ายตัวเลข

เขียนฟังก์ชัน / โปรแกรมที่รับพารามิเตอร์จำนวนเต็ม 2 ตัวพารามิเตอร์จำนวนเต็มหรือตัวแปรจำนวนเต็มจำนวนเริ่มต้นและจำนวนสูงสุดของการวนซ้ำซ้ำ รหัสควรทำตัวอย่างเกมต่อไปนี้เพื่อสร้างหมายเลขใหม่และทำซ้ำจนกว่าตัวเลขจะเหลือตัวเลขหลักเดียว เช่น.

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 ขั้นตอนสุดท้ายของจำนวน เอาต์พุตเดียวกันควรเกิดขึ้นเมื่อเสร็จสิ้นด้วยการเข้าถึงตัวเลขหนึ่งหลัก หากเกิดน้อยกว่า 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 ขั้นตอนเพียงพิมพ์ขั้นตอนเหล่านั้น

ใช้ libs ในตัวเท่านั้นพารามิเตอร์สามารถมาจากที่ใดก็ได้ (สิ่งที่ง่ายที่สุดสำหรับภาษาที่คุณเลือก) ไม่ จำกัด ขนาดสูงสุดเต็มจำนวนและหากมีจำนวนมากเกินไปให้ปล่อยให้ขัดข้อง

เนื่องจากนี่ไม่ใช่เรื่องยากจากมุมมองปริศนาฉันจะให้จนถึงวันอาทิตย์ที่ 25, 20:00 (UTC + 8) สำหรับการส่งผลงานเพื่อพิจารณาคำตอบที่ได้รับการยอมรับ ณ จุดที่สั้นที่สุดของภาษาใด ๆ จะเป็นผู้ชนะ

แก้ไข:

ขอแสดงความยินดีโฮเวิร์ดชนะด้วย 48 GolfScript คำตอบ

กล่าวถึงเป็นพิเศษเพื่อ marinus ที่ 2 กับ 66 APL คำตอบ

ที่ชื่นชอบส่วนตัวของฉัน (ถูกลำเอียงไปทางจาวาสคริปต์) เป็น core1024 ของคำตอบ


ฉันไม่เข้าใจfunc(3541, 5)ควรพิมพ์ 5 ขั้นตอนหรือ 10 หรือไม่
Tal

5 ขั้นตอน มันควรจะหยุดเมื่อมันมาถึงการทำซ้ำ 5 ไม่ทำซ้ำอีกแล้วพิมพ์ 5 ขั้นตอนสุดท้าย ฉันเพิ่งรวมชุดเต็มของขั้นตอนเพื่อแสดงกระบวนการคำนวณแบบเต็มสำหรับอินพุตนั้น
Matt

คำตอบ:


4

GolfScript, 48 46 ตัวอักษร

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

ขอบคุณPeter Taylorสำหรับการปรับปรุงตัวละครสองตัว

คาดว่าตัวเลขทั้งสองในสแต็ก ลองออนไลน์

ตัวอย่าง:

> 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

มีการประหยัดปานกลางโดยการเพิ่มพลิกหลังและเปลี่ยนแผนที่สุดท้ายเข้ามาเพียง.,, {': '*}%
Peter Taylor

10

APL (66)

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

อาร์กิวเมนต์ซ้ายคือจำนวนการวนซ้ำสูงสุดและอาร์กิวเมนต์ที่ถูกต้องคือหมายเลขเริ่มต้น

คำอธิบาย:

  • ∆←⍺{... }⍕⍵: ผ่านอาร์กิวเมนต์ซ้ายเป็นตัวเลขและอาร์กิวเมนต์ขวาเป็นสตริงไปยังฟังก์ชันที่คำนวณรายการตัวเลขและเก็บไว้ใน:
    • (1<⍴⍵)∧⍺>0:: หากจำนวนหลักมากกว่า 1 และจำนวนการทำซ้ำที่เหลือมากกว่า0:
      • ⍎¨⍵: ประเมินแต่ละหลัก
      • 2+/: ผลรวมแต่ละคู่
      • ⍕¨: จัดรูปแบบแต่ละหมายเลขเป็นสตริง
      • ∆←,/: เชื่อมสตริงและจัดเก็บเข้าด้วยกัน
      • ∆,(⍺-1)∇⊃∆: return แล้วตามด้วยผลลัพธ์ของการใช้ฟังก์ชั่นนี้กับหนึ่งซ้ำน้อยอนุญาต
    • ⋄⍬: หากไม่มีให้ส่งคืนรายการว่าง
  • ∆,⍪⍳⍴∆: จับคู่แต่ละองค์ประกอบของกับดัชนีใน
  • {... }/: สำหรับแต่ละคู่:
    • (⍕⍵),': ',⍺: ส่งคืนสตริงที่มีดัชนีตามด้วย:ตามด้วยหมายเลข
  • ↑¯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]

โดยคาดว่าจำนวนการป้อนข้อมูลในตัวแปรและจำนวนสูงสุดของการทำซ้ำในnm

ด้วยสนามกอล์ฟน้อย:

"" <> 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 ตัวอักษร

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}

ฉันไม่ชัดเจนเกี่ยวกับกฎการป้อนข้อมูล 100% แต่ถ้าฉันสามารถใช้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 "สร้างผลลัพธ์ที่แตกต่าง
บาดเจ็บทางดิจิตอล

4

J - 96 92 ถ่าน

ก่อนอื่นฉันต้องแก้ไขโดยสมมติว่าเกมทั้งหมดยุติลงและสิ่งนี้กลับมากัดฉันในระหว่างการทดสอบอีกครั้ง อาร์กิวเมนต์ซ้ายคือจำนวนขั้นตอนอาร์กิวเมนต์ที่ถูกต้องคือตำแหน่งเริ่มต้นซึ่งสามารถกำหนดเป็นตัวเลขหรือสตริงได้

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

นี่มันช่างเกินกว่าจะตีกอล์ฟและโน้มน้าวใจให้ degolf พอใจมากดังนั้นฉันจะพูดแบบนี้:

  • (<@>:@[(' '-.~[:,@":2+/\"."0@]^:)":) ส่วนนี้รันเกมตามจำนวนขั้นตอนที่ระบุ 2+/\มีหน้าที่ในการเพิ่มตัวเลขแต่ละคู่และ<@>:@[ควบคู่กับ^:การควบคุมการจับขั้นตอนกลางของเกม
  • (#\(,': '&,)&":"0,)@}.@({.~,i.0:)@:". ส่วนนี้จัดรูปแบบผลลัพธ์ทั้งหมดเป็น step: resultส่วนนี้ทุกรูปแบบผลเป็น({.~,i.0:)กำลังทำให้แน่ใจว่าเราไม่ได้ทำตามขั้นตอนมากเกินไป#\คือหมายเลขขั้นตอนและ(,': '&,)&":"0บิตเพิ่มโคลอนและช่องว่าง
  • (-@(<.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])}

Ungolfed

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]

และจำนวนเต็มมากเกินไปที่เป็นไปได้คือตกลงมันคือ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

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

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]

Ungolfed:

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

ฉันไม่มีปัญหากับบรรทัดว่างพิเศษ
Matt

@ core1024 ขอบคุณ :) ฉันกำลังจะให้คำแนะนำแก่คุณเช่นกัน แต่คุณได้กำจัดความยาวนั้นเสียแล้ว "เว้นแต่" ส่วนหนึ่ง
ต.ค.

1

Java      524   405 365 ตัวอักษร [414 ไบต์]

รุ่น Golfed: 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 อักขระสำหรับชื่อตัวแปรและฟังก์ชัน
Lex Webb

เสร็จแล้ว ... เปลี่ยนตรรกะเพื่อหยุดการเรียกซ้ำโดยใช้ num <= 9 แทนดิจิตัลความยาว == 1 (เห็นในกระทู้นี้เท่านั้น ... ไม่เคยโดนฉันมาก่อน)
user12345

คุณสามารถลดความยาวของชื่ออาร์กิวเมนต์ในวิธีการหลักของ yout ซึ่งจะให้ 3 chatacters เพิ่มเติม
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'))}

Ungolfed:

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

ปัญหาเดียวคือชื่อฟังก์ชั่นเป็นหนึ่งเดียวกับตัวแปรของคุณ :) แต่เทคนิคนั้นยอดเยี่ยม
Matt

จุดดี! ฉันเปลี่ยนชื่อฟังก์ชั่น;)
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 ฉันสามารถลดรหัสลงได้ 30 ตัวอักษรโดยไม่ต้องแยกสตริงออกเป็น Array โดยใช้ -96 แทน "Integer.valueOf ()


คุณยังสามารถลดอักขระบางตัวได้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 ไบต์

โผอาจเป็นหนึ่งในภาษาที่แย่ที่สุดในการทำสิ่งนี้ใน ... ฉันจะต้องหาวิธีที่ดีกว่าในการทำสิ่งนี้

อย่างไรก็ตามนี่คือรายการของฉัน:

อินพุตผ่านคอนโซล

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 ไบต์

มันมีข้อผิดพลาดเช่นเดียวกับคำตอบของ 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]}

แก้ไข 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 ขั้นตอนสุดท้ายเท่านั้น
Tal

ได้รับการแก้ไข;)
core1024

และคุณยังอยู่ข้างหน้าฉัน 3 ไบต์ ... ระเบิดมัน! : p
Tal

@Tal เรายังคงตอนนี้: 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

ผลลัพธ์ที่ค่อนข้างน่าหดหู่ ... แต่เดี๋ยวก่อนฉันยังคงชนะชวา

มันควรจะมีภูมิคุ้มกันต่อจำนวนเต็มล้นสำหรับกรณีทดสอบภาคปฏิบัติ

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

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

ตัวอย่างการใช้งาน:

λ> 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#50และเปรียบเทียบกับตัวอย่างของ OP มิฉะนั้นฉันก็ดีใจที่มีผู้ชาย Haskell อยู่ที่นี่
core1024

@ core1024 มันทำ! แม้ว่าฉันจะติดป้ายผิดพวกเขาคุณพูดถูก พรุ่งนี้ฉันจะแก้ไข
Flonk

0

Groovy - 191 182 ตัวอักษร

ขึ้นอยู่กับโซลูชันของ Thomas Rüpingส่งไปยัง 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}

การดำเนินการและการส่งออก:

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

Ungolfed:

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

golfed น้อยลงเล็กน้อย (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]));

}

เพียงจัดสรรหน่วยความจำให้เพียงพอเพื่อจัดเก็บห้าผลลัพธ์ วงด้านนอกยังคงดำเนินต่อไปจนกว่าเราจะถึงขีด จำกัด หรือถึงหลักเดียว การวนรอบด้านในเพิ่มตัวเลขสุดท้ายของตัวเลขเป็นตัวเลขสุดท้ายของ 1/10 ของตัวเลขและเพิ่มสิ่งนี้คูณด้วยกำลังที่เกี่ยวข้องของ 10 ถึงผลลัพธ์ แบ่งจำนวนที่คุณก่อนจาก 10 และทำซ้ำเพื่อให้ได้ผลรวม จากนั้นพิมพ์ผลการค้นหาห้ารายการล่าสุด

ความท้าทายต่อไปคือการดูว่าฉันสามารถโกนพอที่จะเอาชนะภาษาสคริปต์ที่กอล์ฟ

แก้ไข: ตอนนี้คอมไพล์ด้วยคำเตือน แต่ตัวละครห้าตัวถูกลบทิ้งโดยการลบการประกาศ "โมฆะ"


เคล็ดลับกอล์ฟ: f (int a, int z) -> f (a, z) และสามารถใช้ t = 10 ประหยัด 2 ตัวอักษรเพิ่มเติม แต่การใช้ a และ / = 10 ในนิพจน์เดียวกันนั้นไม่ได้กำหนด
edc65

0

C # - 309 330 320 306 ไบต์

เวอร์ชั่น Golfed:

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:ขอบคุณ malik สำหรับทิปด้วยสตริง!


.ToCharArray()คุณไม่จำเป็นต้อง สตริง = char array
jzm

โอ้และอีกสิ่งหนึ่งที่คุณสามารถทำได้คือแทนที่จะ.ToString()ทำ+""
jzm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.