Code Golf: 6174 - ค่าคงที่ในตำนานของ Kaprekar


24

ทำไมตัวเลข 6174 ถึงน่าสนใจ ตามที่กำหนดโดย Wikipedia

  1. ใช้ตัวเลขสี่หลักใด ๆ โดยใช้ตัวเลขอย่างน้อยสองหลัก (อนุญาตเลขศูนย์นำหน้า)
  2. จัดเรียงตัวเลขจากน้อยไปหามากจากนั้นเรียงลำดับจากมากไปน้อยเพื่อให้ได้ตัวเลขสี่หลักสองหลักโดยเพิ่มศูนย์นำหน้าถ้าจำเป็น
  3. ลบจำนวนที่น้อยลงจากจำนวนที่มากขึ้น
  4. กลับไปที่ขั้นตอนที่ 2

กระบวนการข้างต้นหรือที่เรียกว่ารูทีนของ Kaprekar จะถึง 6174 ในการทำซ้ำสูงสุด 7 ครั้ง เมื่อถึง 6174 กระบวนการจะดำเนินการต่อไป

เขียนโปรแกรมที่รันรูทีนของ Kaprekar เทียบกับตัวเลขสี่หลักที่กำหนด (ดูคำนิยามด้านบน) พิมพ์แต่ละขั้นตอนของรูทีน

กฎ:

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

ตัวอย่าง:

> 2607
7620 - 0267 = 7353
7533 - 3357 = 4176
7641 - 1467 = 6174
Iterations: 3.

> 1211
2111 - 1112 = 0999
9990 - 0999 = 8991
9981 - 1899 = 8082
8820 - 0288 = 8532
8532 - 2358 = 6174
Iterations: 5.

> 6174
7641 - 1467 = 6174
Iterations: 1.

ยินดีต้อนรับทุกภาษาการเขียนโปรแกรม คะแนนพิเศษสำหรับคนที่มีความลึกลับ + รางวัลเล็ก ๆ

Update 1 : มีอยู่แล้วเป็นคำถามที่คล้ายกัน

อัปเดต 2 : เพิ่มตัวอย่างสำหรับ 6174 เป็นอินพุต ขอบคุณ Peter Taylor สำหรับการแจ้งเตือน


นี่คือข่าวสำหรับฉัน มีคนเรียกโมเดอเรเตอร์ ...

เอ่อ ... ไม่มีปุ่ม "ย้ายข้อมูล" หรือไม่
ดร. Rebmu

ฉันตั้งค่าสถานะนี้เพื่อให้ผู้ดำเนินการโยกย้าย ฉันขอแนะนำให้ปรับเปลี่ยนกฎของอินพุตเอาต์พุตเพื่อยอมรับกับเวอร์ชัน 3 หลักก่อนหน้าได้หรือไม่? และเชื่อมโยงไปยังรุ่นก่อนหน้าในเนื้อหาของคำถาม
dmckee

@dmckee ฉันไม่รู้เกี่ยวกับเว็บไซต์นี้และไม่สามารถรู้ได้ว่ามีคำถามที่คล้ายกันอยู่แล้ว (ใน stackoverflow ไม่มีเลย) อย่างไรก็ตามฉันลังเลที่จะเปลี่ยนแปลงกฎเพื่อให้สอดคล้องกับรุ่น 3 หลักและทำให้ทั้งสองคำถามมีความคล้ายคลึงกันมากขึ้น ไม่มีประโยชน์ที่จะโพสต์คำถามซ้ำหรือมีการเปลี่ยนแปลงเล็กน้อยของคำถามที่มีอยู่ แม้เมื่อทำไปโดยไม่ตั้งใจ
lunohodov

3
โปรดเพิ่ม 6174 เป็นตัวอย่างเพื่อให้เราสามารถดูว่าผลลัพธ์ควรจัดรูปแบบอย่างไร
Peter Taylor

คำตอบ:


9

Perl - 147 143 134 130 129 126 129 128 126

for($_=<>;$_-6174+!$c;$c++){$_=reverse$d=join'',sort split//,"$_"
|$|x4;printf"$_ - $d = %04d\n",$_-=$d}die"Iterations: $c.\n"

แก้ไข: ตอนนี้สอดคล้องกับกรณี 6174 ค่าใช้จ่ายไม่กี่ตัวอักษร ... ทำงานด้วย echo -n <number> | perl kaprekar.pl

แก้ไข: ในที่สุดกลับไปที่ที่ฉันเคยเป็นมาก่อน: D


10

Ruby 1.9, 122 ตัวอักษร

puts"Iterations: #{(1..7).find{s=$_.chars.sort*"";puts [r=s.reverse,?-,s,?=,$_="%04d"%(r.to_i-s.to_i)]*" ";~/6174/}}."

ตัวอย่างการร้องขอ:

$ echo 1211 | ruby -ln kaprekar.rb

ฉันนับ-lnธงเป็น 4 อักขระ (ความแตกต่างระหว่างการเรียกใช้ปกติruby kaprekar.rbและruby -ln kaprekar.rb)


ฉันบันทึกสคริปต์นี้เป็น kaprekar.rb ruby -lp kaprekar.rbแล้วเรียกมันด้วย ป้อนตัวเลขแล้วกด <Enter> แต่เอาต์พุตเป็นตัวเลขที่ป้อนเอง เห็นได้ชัดว่าฉันขาดอะไรบางอย่าง ... กรุณาแนะนำวิธีการใช้งานสคริปต์
lunohodov

@lunohodov: ฉันได้เพิ่มการอุทธรณ์ตัวอย่าง ตอนนี้มันยังสร้างเอาต์พุตที่ถูกต้องสำหรับ6174เป็นอินพุตซึ่งน่าเสียดายที่โซลูชันนี้มีความยาวสูงสุด 128 อักขระ
Ventero

ใช้ยกคำเตือนและจบลงด้วยข้อผิดพลาดecho 1234 | ruby kaprekar.rb undefined method 'chars' for nil:NilClass (NoMethodError)การดำเนินecho 1234 | ruby -lp kaprekar.rbการแจ้งเตือนเท่านั้นและทำงานตามที่คาดไว้ ผลลัพธ์ไม่เป็นไปตามที่คาดไว้เนื่องจากมีข้อความเตือนkaprekar.rb:3: warning: regex literal in condition
lunohodov

@lunohodov: แก้ไขคำเตือนและตัวอย่างการขอร้อง
Ventero

7

Python 141 ตัวอักษร

n=input()
i=0
while n-6174:a=''.join(sorted("%04d"%n));b=a[::-1];n=int(b)-int(a);print"%s - %s = %04d"%(b,a,n);i+=1
print"Iterations: %d."%i

+1 สำหรับการเติมแผ่นเนียนด้วย% 04d ฉันเรียนรู้บางอย่างวันนี้!
arrdem

3
คำแนะนำเล็กน้อย: ใส่ลูปทั้งหมดในหนึ่งบรรทัดโดยใช้;s while n-6174. ไม่มีที่ว่างระหว่างprintและคำพูด
Keith Randall

@ keith-randall: ขอบคุณลงไปที่ 141 ตอนนี้
Martin Ueding


5

Haskell, 197 192 182 181 ตัวอักษร

import List
p=putStrLn.unwords
"6174"%k|k>0=p["Iterations:",shows k"."]
n%k=p[b,"-",a,"=",c]>>c%(k+1)where a=sort n;b=reverse a;c=take 4$shows(read b-read a)"0"
main=getLine>>=(%0)

การฝังrและการsบันทึก 2 อักขระ นอกจากนี้ "000" ก็ซ้ำซ้อน "0" ก็เพียงพอแล้ว สิ่งนี้ทำให้เรามีอักขระ 188 ตัว ฉันประหลาดใจinteractไม่ได้ช่วยที่นี่ มันมักจะทำ
Rotsor

แทนที่show x++sด้วยshows x sกำไรเพิ่มเติม 2 ไบต์ 186 ตอนนี้
Rotsor

โดยใช้รูปแบบยาม ( |k>0) fหนึ่งสามารถกำจัด การเปลี่ยนชื่อเพิ่มเติมgเพื่อให้%เราได้รับ 182 อักขระ
Rotsor

4

> <> - 268 308

</&4pff1
v>i86*-:n&1-:&?!
>ao&        v
<v&0pff+1gff
 >&1+:4=   ?v&:a%:}-a,
 v&8[4r::0}~<
 >&1-:?!v&:@@:@(?$}&:&3%1=?}
 v      >~:}}:}@:}$:}
 \:n}:n}:n}:n}' - 'ooo:n}:n}:n}:n}' = 'ooo
 \a*+a*+a*+}a*+a*+a*+-:0&\
 v?       =4&:+1&,a-}:%a:<
/\&~~rnnnnao:29777****=   ?v
voooooooooooo"Iterations: "/
\ffgna'.'oo;

ไม่มากนักสำหรับการแข่งขันกอล์ฟ แต่มันสนุกที่จะเขียน :)

ทำงานด้วย./fish.py kaprekar.fish -v <number>
EDIT: ตอนนี้รับอินพุตจาก STDIN


4

JavaScript, 189 182 165 ตัวอักษร

ให้เครดิตแก่ DocMax:

for(n=prompt(i=o=e='');!i--|n-6174;o+=n+' - '+a+' = '+(n=(p=n-a+e)[3]?p:0+p)+'\n')
  b=n.split(e).sort(),n=b.reverse(a=b.join(e)).join(e);
alert(o+"Iterations: "+~i+'.')

เดิม:

for(n=prompt(i=o=e='');n-6174;o+=(i++?n+"\n":e)+(n=(a=n.split(e).sort().join(e)).split(e).reverse().join(e))+' - '+a+' = ',n=n-a+e)while(!n[3])n=0+n
alert(o+n+"\nIterations: "+i+'.')

Ungolfed:

var i = 0;
var n = prompt();
var out = '';
while (n != 6174) {
    while ((n=''+n).length<4) n='0'+n // pad number
    if(i)out+=n+"\n"

    a = n.split('').sort().join('');
    n = a.split('').reverse().join('');

    out += n + ' - ' + a + ' = '
    n-=a
    i++;
}
console.log(out + "6174\nIterations: " + i + '.');

1
ฉันคิดว่าคุณสามารถเปลี่ยนn != 6174เป็นn-6174เพราะมันจะกลับเป็นศูนย์ซึ่งเป็นเท็จ (อย่างน้อยใน C และ Python)
Martin Ueding

เครดิตควรไปที่ keith-randall ผู้แนะนำสำหรับโซลูชัน Python ของฉัน
Martin Ueding

คุณสามารถบันทึก 5 ตัวอักษรมากขึ้นโดยการแทนที่ด้วยwhile(n.length<4) while(!n[3])
DocMax

1
ฉันไม่สามารถหยุดจ้องมองที่นี่! ต่อไปนี้ a) แก้ไขเอาต์พุตเมื่อ n = 6174, b) จัดเรียงใหม่เมื่อn+'\n'มีการเพิ่มเพื่อหลีกเลี่ยงเงื่อนไขและพิเศษ\nc) ใช้ temp เพื่อหลีกเลี่ยงลำดับการรวมเข้าร่วมแยก d) ใช้ประโยชน์จากข้อเท็จจริงที่ว่าเรา ต้องเพิ่ม '0' เพียงครั้งเดียวสำหรับการขยาย: for(n=prompt(i=0,o=e='');n-6174;i++,o+=(n=(b=n.split(e).sort(),a=b.join(e),b).reverse().join(e))+' - '+a+' = '+(n=('0'+(n-a)).slice(-4))+'\n');alert(o+"Iterations: "+i+'.')ซึ่งควรเป็น 172 ตัวอักษร
DocMax

1
ที่น่าประทับใจ! ตามสเปคดังกล่าวข้างต้น แต่เมื่อ n = 6174 มันได้ผ่านไปอย่างน้อยหนึ่งซ้ำดังนั้นฉันเพิ่มการตรวจสอบถ้าiเป็น 0 (4) i++แต่รวมกันว่ามี โชคไม่ดีที่ให้ปิดโดยข้อผิดพลาดหนึ่งดังนั้นฉันเปลี่ยนการเพิ่มขึ้นเพื่อลดลงและจากนั้นใช้เล่ห์เหลี่ยม bitwise เล็กน้อยในตอนท้าย (-1) จากนั้นฉันเปลี่ยนi=0,o=e=''เป็นi=o=e=''(-2) ฟอร์แมตforลูปใหม่เพื่อหลีกเลี่ยงวงเล็บพิเศษ (-1), (b=...,a=...,b)บิตขยาย(-2) และแอบa=b.joinเข้าไปในการreverse()โทร (-1) ดังนั้น 169 ไม่เลว!
Casey Chu

3

PowerShell, 125 128 130 131

for($a,$OFS=$input+'';$b-6174;++$i){$a=$b=+($c=''+($x="$a 000"[0..4]|sort)[4..0])-"$x"
"$c-$x = {0:d4}"-f$a}"Iterations: $i."

ผ่านกรณีทดสอบทั้งหมดจากคำถาม


2

จาวาสคริปต์, 260 ไบต์

function z(c){for(u=c+y;u.length<4;)u=0+u;return u}for(p=prompt(i=0,r=y="");;)
if(s=(p+y).split(y).sort(),t=s.concat().reverse(),a=s.join(y),b=t.join(y),q=a<b?b:a,
w=a<b?a:b,p=z(q-w),i++,r+=z(q)+" - "+z(w)+" = "+p+"\n",p==6174)break;alert(r+
"Iterations: "+i+".")

2

Clojure 256 ตัวอักษร

(let[i #(Integer/parseInt%)f #(format"%04d"%)a #(->>% f sort(apply str)i)d #(->>% f sort reverse(apply str)i)k #(let[u(d %)l(a %)n(- u l)](println(f u)"-"(f l)"="(f n))n)](while true(println"Iterations:"(count(take-while #(not=% 6174)(iterate k(read)))))))

2

สกาลา 2.9, 194 ตัวอักษร

object K extends App{var(c,s)=(0,args(0));do{var d=s.sorted;var e=d.reverse.toInt-d.toInt;s="%04d".format(e);println(d.reverse+" - "+d+" = "+s);c+=1}while(s!="6174");print("Iterations: "+c+".")}

ใช้คุณลักษณะของแอพจาก Scala 2.9

แก้ไข:ให้เอาต์พุตที่ถูกต้องสำหรับอินพุตเริ่มต้นของ 6174


2

PHP, 215 259 276 ตัวละคร

<?php echo">";$n=str_split(str_pad(trim(fgets(STDIN)),4,0,0));for($k=0,$z=0;$k-6174;$z++){sort($n);$a=implode($n);$b=strrev($a);$k=str_pad($b-$a,4,0,0);echo"$b - $a = $k\n";$n=str_split($k);}echo"Iterations: $z\n";

Ungolfed:

<?php
echo ">";
$n = str_split(str_pad(trim(fgets(STDIN)),4,0,0));
for($k=0, $z=0; $k-6174; $z++) {
    sort($n);
    $a = implode($n);
    $b = strrev($a);
    $k = str_pad($b-$a,4,0,0);
    echo "$b - $a = $k\n";
    $n = str_split($k);
}
echo "Iterations: $z\n";

ผมไม่คิดว่าคุณต้องการabs, maxและminฟังก์ชั่นตั้งแต่การจัดเรียงมักจะหมายความว่ามีค่ามากกว่า$b $aที่สามารถช่วยคุณประหยัดอักขระ 20ish นอกจากนี้ฉันคิดว่าการเรียงลำดับภายในลูปที่ด้านบนจะหมายถึงคุณจะต้องมีมันในโค้ดของคุณเพียงครั้งเดียวซึ่งจะช่วยให้คุณประหยัดอีก 9
Gareth

ว้าวฉันเดาว่าฉันถูกวอกแวกโดยคำแนะนำ "ลบจำนวนที่น้อยกว่าจากคำสั่งที่ใหญ่กว่า" ขอบคุณ
rintaun

<?function k($c){echo"> $c\n";$n=str_split(str_pad($c,4,0,0));for(;$k-6174;$z++){sort($n);$a=join($n);$b=strrev($a);$k=str_pad($b-$a,4,0,0);echo"$b - $a = $k\n";$n=str_split($k);}echo"Iterations: $z\n";} คุณสามารถบันทึก 12 ตัวโดยการเปลี่ยนforคำสั่งเรียกนี้เป็นหน้าที่และใช้แทนjoin implode
TwoScoopsofPig

นอกจากนี้ฉันเกลียดมินิมาร์คดาวน์
TwoScoopsofPig

2

CoffeeScript, 233 225 ตัวอักษร

o=e='';i=0;n=prompt()
while n!=6174
  n=e+n;q=(n='0'+n if !n[3]) for x in [0..2];n?=q;o+=n+"\n" if i;a=n.split(e).sort().join(e);n=a.split(e).reverse().join(e);o+=n+' - '+a+' = ';n-=a;i++
alert(o+"6174\nIterations: "+i+'.')

ลองมันนี่หรือมีคำแนะนำที่นี่


เบราว์เซอร์ของฉันค้าง - ต้องยกเลิกการเรียกใช้สคริปต์
lunohodov

คุณป้อนหมายเลขใด ฉันลองใน Firefox และ Chrome สำหรับ 4711 และ 1 และอีกสองคน
Jonas Elfström

การใช้0(ตามคำแนะนำของพรอมต์) หรือคลิกปุ่มยกเลิกจะทำให้ Safari หยุดการทำงาน
lunohodov

ฉันไม่รู้ว่าทำไมมันถึงแนะนำ คุณต้องป้อนตัวเลขระหว่าง 1 ถึง 9998 ซึ่งตัวเลขไม่เหมือนกันทั้งหมด 0 เหมือนกับ 0000 และจะทำให้เกิดการวนซ้ำไม่สิ้นสุด ดูเหมือนว่าโซลูชันส่วนใหญ่ที่นี่ข้ามการตรวจสอบความถูกต้องของอินพุตเพื่อลดจำนวนอักขระลง
Jonas Elfström

ดูi56.tinypic.com/bhhoqe.pngผลลัพธ์ของคุณลงท้ายด้วย "ใช้เวลา 5 ครั้งในการเข้าถึงค่าคงที่ของ Kaprekar" ซึ่งไม่เป็นไปตามข้อกำหนด
lunohodov

2

สกาลา 276

object o{var i=0;def a(v:String){val c=v.toList.sortWith(_>_).mkString;val b=c.reverse;val d=c.toInt-b.toInt;val e="0"*(4-(d+"").length)+d;val p=c+" - "+b+" = "+e;if(d!=6174){println(p);i=i+1;a(e)}else{println(p+"\nIterations: "+(i+1)+".")}};def main(s:Array[String])=a(s(0))}

สกาล่า 283

object o{var i=0;def a(v:String){val c=v.toList.sortWith(_>_).mkString;val b=c.reverse;val d=c.toInt-b.toInt;val e="0"*(4-(d+"").length)+d;val p=c+" - "+b+" = "+e;if(d!=6174){println(p);i=i+1;a(e)}else{println(p);println("Iterations: "+(i+1)+".")}};def main(s:Array[String])=a(s(0))}

diff:

else{println(p);println("Iterations: "+(i+1)+".")}};
// to
else{println(p+"\nIterations: "+(i+1)+".")}};

2

GAWK - 152 ตัวอักษร

นี่เป็นรุ่น GNU awk มันอาจไม่ทำงานกับเวอร์ชันที่ไม่ใช่ gnu อื่น ๆ

{for(z=$1;z-6174+!c;++k){split(z,a,"");asort(a);for(b=c=i=0;i<4;z=c-b){c+=a[i+1]*10^i;b=b*10+a[++i]}printf c" - %.4d = "z"\n",b}print"Iterations: "k"."}

$ awk -f k.awk <<< 9992
2999 - 9992 = 6993
3699 - 9963 = 6264
2466 - 6642 = 4176
1467 - 7641 = 6174
Iterations: 4

awk: calling undefined function asortฉันจะได้รับ Awk เวอร์ชั่น 20070501 ทำงานบน OSX 10.6.7 อย่าลืม.จำนวนซ้ำหลังจากนั้น
lunohodov

lunohodov @: เพิ่มจุดหายไป นอกจากนี้ฉันยังใช้ gnu awk (gawk) และนั่นอาจอธิบายถึงฟังก์ชั่นที่หายไป
Dan Andreatta

ตัวเลขการลบคือทางที่ผิด: เช่นควรเป็น 9992 - 2999 = 6993
Chris Degnen

2

ทับทิม 179 ตัวอักษร แต่โพสต์ต่อไป

s=gets.chomp
n=0
begin
  s=s.to_s.chars.sort.reduce{|s,c|s+c}.rjust(4,'0')
  a=s.reverse
  puts"#{a} - #{s} = #{'%04d'%(s=a.to_i-s.to_i)}"
  n+=1
end while s!=6174
puts"Iterations: #{n}."

ทับทิมเย็นมาก
ดอนสดใส

1

PERL

chomp($n=<STDIN>);
    do{
       $t++;
       $desc=join('',reverse sort split(//,$n));
       $asc=join('', sort split(//,$n));
       $n=($desc - $asc);
       for($i=4;$i>length $n;$i--){
          $n="0".$n;
       }
       print $desc." - ".$asc." = ".$n."\n";
       $n="6174" if $n eq "0000";
    }while($n ne "6174");
    print "Iterations: $t.\n";

Thats ~ 310 chars ...
Aman ZeeK Verma

1

K, 104

{b::();{b,:,k," = ",r:"0"^(-:4)$$. k:(x@>x)," - ",x@<x;r}\[$x];-1'c,,"Iterations: ",$#c:$[1=#b;b;-1_b];}

กรณีทดสอบ

k){b::();{b,:,k," = ",r:"0"^(-:4)$$. k:(x@>x)," - ",x@<x;r}\[$x];-1'c,,"Iterations: ",$#c:$[1=#b;b;-1_b];}'2607 1211 6174;
7620 - 0267 = 7353
7533 - 3357 = 4176
7641 - 1467 = 6174
Iterations: 3
2111 - 1112 = 0999
9990 - 0999 = 8991
9981 - 1899 = 8082
8820 - 0288 = 8532
8532 - 2358 = 6174
Iterations: 5
7641 - 1467 = 6174
Iterations: 1

1

มาติกา 314 291 ตัวอักษร

นี่คือโปรแกรม, kaprekar.m: -

SetOptions[$Output,FormatType->OutputForm];
x=$ScriptCommandLine[[2]];
f[x_]:=(a=Characters@x;
b=Sort@ToExpression@a;
c=Sort[FromDigits/@{#,Reverse@#}&@b];
{c,{b,a}}=IntegerString[{#2-#&@@c,c},10,4];
Print[a," - ",b," = ",c];c)
x=f@x;
e=NestWhileList[f,x,#!="6174"&];
Print["Iterations: ",N@Length@e]

การตั้งค่าเส้นทางก่อนที่จะทำงาน: -

$ PATH=${PATH}:/Applications/Mathematica.app/Contents/MacOS ; export PATH

ใช้งานโปรแกรม: -

$ MathematicaScript -script kaprekar.m 2607
7620 - 0267 = 7353
7533 - 3357 = 4176
7641 - 1467 = 6174
Iterations: 3.
$ MathematicaScript -script kaprekar.m 1211
2111 - 1112 = 0999
9990 - 0999 = 8991
9981 - 1899 = 8082
8820 - 0288 = 8532
8532 - 2358 = 6174
Iterations: 5.
$ MathematicaScript -script kaprekar.m 6174
7641 - 1467 = 6174
Iterations: 1.

0

PHP , 160 ไบต์

function k($n,$d=1){$o=str_split($n);sort($o);echo$q=strrev($r=join($o))," - $r = ",$n=str_pad($q-$r,4,0,0),"
",$n==6174?"Iterations: $d.":k($n,++$d);}k($argn);

ลองออนไลน์!

โปรแกรมที่สมบูรณ์, การป้อนข้อมูลจะถูกเรียกใช้ด้วยSTDINphp -nF

เอาท์พุต

> echo 2607|php -nF kap.php
7620 - 0267 = 7353
7533 - 3357 = 4176
7641 - 1467 = 6174
Iterations: 3.

> echo 1211|php -nF kap.php
2111 - 1112 = 0999
9990 - 0999 = 8991
9981 - 1899 = 8082
8820 - 0288 = 8532
8532 - 2358 = 6174
Iterations: 5.

> echo 6174|php -nF kap.php
7641 - 1467 = 6174
Iterations: 1.

0

สนิม - 375 ไบต์

use std::io::{self,BufRead};fn main() {let mut x=io::stdin().lock().lines().next().unwrap().unwrap().parse::<i16>().unwrap();let mut n=0;println!("Iterations: {}.",loop {let mut v=[x/1000%10,x/100%10,x/10%10,x%10];v.sort();let j=v.iter().fold(0,|a,i|a*10+i);let k=v.iter().rev().fold(0,|a,i|a*10+i);x=k-j;n+=1;println!("{:04} - {:04} = {:04}",k,j,x);if x==6174{break n};});}

ฉันนำเสนอสิ่งนี้ว่าเป็น "ขอบเขตบน" ที่เป็นไปได้ฉันขอท้าให้ทุกคนหาภาษาที่มีการใช้ภาษานี้อย่างเหมาะสมอีกต่อไป - เนื่องจากไม่มีสิ่งใดที่ไม่จำเป็น แต่ยังไม่มีอะไรชัดเจนแม้กระทั่งจากระยะไกล สิ่งที่เกี่ยวกับ Rust คือมันใช้เวลาประมาณ 120 ตัวอักษรเพื่ออ่านจาก stdin และแยกเป็นจำนวนเต็ม "โอ้ แต่แล้วเพียงแค่ใช้การเป็นตัวแทนสตริง" ... แต่ฉันมั่นใจ 99% ว่าจะนานขึ้น


0

Perl 6 -n flag, 105 ไบต์

say "Iterations: "~+.&{{{say $!=.flip~" - $_"," = ",($/=$!.EVAL.fmt("%04d"));$/}([~] .comb.sort)}...6174}

ลองออนไลน์!

ในที่สุดฉันก็ต้องใช้{}...*เล่ห์เหลี่ยมของฉันเนื่องจากเราต้องมีการวนซ้ำอย่างน้อยหนึ่งครั้งสำหรับ 6174 ฉันไม่แน่ใจว่าทำไมฉันจึงต้องการการพัน.&{ }รอบลำดับตามลำดับ

คำอธิบาย:

    .&{                         } # Call a function on the input
       {                }...6174  # Create a sequence that goes until 6174
        {           }([~] .comb.sort) # Get the sorted digits of the number
         say $!=.flip~" - $_"," = "~($/=$!.EVAL.fmt("%04d"))  # Print the iteration
                        ;$/  # Return the result
say "Iterations: "~+.&{      }     # Print the number of iterations
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.