Mengapa angka 6174 begitu menarik? Seperti yang didefinisikan oleh Wikipedia
- Ambil angka empat digit, menggunakan setidaknya dua digit berbeda. (Angka nol diijinkan.)
- Aturlah digit dalam urutan naik dan kemudian turun untuk mendapatkan dua angka empat digit, tambahkan angka nol di depan jika perlu.
- Kurangi angka yang lebih kecil dari angka yang lebih besar.
- Kembali ke langkah 2.
Proses di atas, yang dikenal sebagai rutinitas Kaprekar, akan selalu mencapai 6174 di paling banyak 7 iterasi. Setelah 6174 tercapai, proses akan terus menghasilkan itu.
Tulis program yang menjalankan rutinitas Kaprekar terhadap angka empat digit yang diberikan (lihat definisi di atas) untuk mencetak setiap langkah rutin.
Aturan:
- Pengajuan harus merupakan program yang lengkap.
- Input harus dibaca dari input standar. Pemipaan dari echo tidak masalah.
- Masukan harus dalam bentuk angka.
- Diperlukan angka nol di depan. (Lihat contoh di bawah.)
- Baris terakhir harus mengatakan berapa banyak iterasi yang dibutuhkan. Tanda baca diperlukan.
Contoh:
> 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.
Setiap bahasa pemrograman dipersilahkan. Poin ekstra untuk poin esoterik + hadiah kecil.
Pembaruan 1 : Sudah ada pertanyaan serupa .
Pembaruan 2 : Contoh yang ditambahkan untuk 6174 sebagai input. Terima kasih kepada Peter Taylor untuk pemberitahuannya.
code-golf
repeated-transformation
sequence
lunohodov
sumber
sumber
Jawaban:
Perl -
147143134130129126129128126EDIT: Sekarang sesuai dengan kasus 6174, dengan biaya beberapa karakter ... dijalankan bersama
echo -n <number> | perl kaprekar.pl
EDIT: Akhirnya kembali ke tempat saya sebelumnya: D
sumber
Ruby 1.9, 122 karakter
Doa contoh:
Saya telah menghitung
-ln
bendera sebagai 4 karakter (perbedaan antara doa normalruby kaprekar.rb
danruby -ln kaprekar.rb
).sumber
ruby -lp kaprekar.rb
. Masukkan nomor dan tekan <Enter> tetapi outputnya adalah nomor yang dimasukkan itu sendiri. Jelas saya kehilangan sesuatu ... Mohon saran bagaimana menggunakan skrip.6174
input, yang sayangnya membawa solusi ini hingga 128 karakter.echo 1234 | ruby kaprekar.rb
memunculkan peringatan dan diakhiri dengan kesalahanundefined method 'chars' for nil:NilClass (NoMethodError)
. Melaksanakanecho 1234 | ruby -lp kaprekar.rb
masalah hanya peringatan dan berperilaku seperti yang diharapkan. Outputnya tidak seperti yang diharapkan, karena mengandung pesan peringatankaprekar.rb:3: warning: regex literal in condition
Python, 141 karakter
sumber
;
s.while n-6174
. Tidak ada ruang antaraprint
dan kutipan.Golfscript, 74 karakter
sumber
Haskell,
197192182181 karaktersumber
r
dans
menyimpan 2 karakter. Juga, "000" berlebihan. "0" sudah cukup. Ini membawa kita ke 188 karakter. Saya terkejutinteract
tidak membantu di sini. Biasanya begitu.show x++s
denganshows x s
mendapatkan 2 byte lebih banyak. 186 sekarang.|k>0
) seseorang dapat menyingkirkanf
. Mengubah nama lebih lanjutg
untuk%
membuat kita menjadi 182 karakter.> <> -
268308Tidak banyak pesaing untuk golf, tetapi menyenangkan untuk menulis. :)
Jalankan dengan./fish.py kaprekar.fish -v <number>
EDIT: Sekarang ambil input dari STDIN.
sumber
JavaScript,
189182165 karakterKredit ke DocMax:
Asli:
Tidak Disatukan:
sumber
n != 6174
ken-6174
karena akan kembali nol, yang palsu (setidaknya dalam C dan Python).while(n.length<4)
denganwhile(!n[3])
.n+'\n'
ditambahkan untuk menghindari persyaratan dan tambahan\n
, c) menggunakan temp untuk menghindari urutan join-split-join, d) mengambil keuntungan dari fakta bahwa kami hanya perlu menambahkan satu '0' untuk padding: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+'.')
yang seharusnya 172 karakter.i
0 (+4) tetapi dikombinasikan dengani++
. Sayangnya, itu menghasilkan kesalahan satu kali, jadi saya mengganti selisih menjadi penurunan dan kemudian menggunakan sedikit tipu daya tipuan di akhir (-1). Kemudian saya mengubahi=0,o=e=''
kei=o=e=''
(-2), memformat ulangfor
loop untuk menghindari tanda kurung tambahan (-1),(b=...,a=...,b)
bit diperluas (-2), dan menyelinapa=b.join
di dalamreverse()
panggilan (-1). Jadi 169, tidak buruk!PowerShell, 125
128130131Lewati semua kasus uji dari pertanyaan.
sumber
JavaScript, 260 byte
sumber
Clojure, 256 karakter
sumber
Scala 2.9, 194 karakter
Memanfaatkan sifat Aplikasi dari Scala 2.9.
Sunting: memberikan output yang benar untuk input awal 6174.
sumber
PHP, 215
259276karakterTidak Disatukan:
sumber
abs
,max
danmin
fungsi, karena pengurutan akan selalu berarti$b
lebih besar dari$a
. Itu bisa menghemat 20 karakter. Juga, saya pikir menempatkan semacam itu di dalam loop di atas akan berarti Anda hanya perlu memilikinya dalam kode Anda sekali yang akan menyelamatkan Anda lagi 9.<?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";}
Anda dapat menyimpan 12 karakter dengan mengubahfor
pernyataan Anda , menyebutnya sebagai fungsi dan menggunakanjoin
alih-alihimplode
.CoffeeScript,
233225 karakterCobalah di sini atau dengan instruksi di sini .
sumber
0
(seperti yang disarankan oleh prompt) atau mengklik tombol batal menyebabkan Safari membeku.Scala 276
Scala 283
beda:
sumber
GAWK - 152 karakter
Ini adalah versi awk GNU. Ini mungkin tidak bekerja dengan versi non-gnu lainnya.
sumber
awk: calling undefined function asort
. Versi awk adalah 20070501 berjalan pada OSX 10.6.7. Jangan lupa.
setelah jumlah iterasi.9992 - 2999 = 6993
Ruby, 179 karakter tetapi tetap memposting
sumber
PERL
sumber
K, 104
Uji kasus
sumber
Mathematica,
314291 karakterIni adalah programnya, kaprekar.m: -
Mengatur jalur sebelum menjalankan: -
Menjalankan program: -
sumber
PHP , 160 byte
Cobalah online!
Program lengkap, input
STDIN
, jalankan denganphp -nF
.Keluaran
sumber
Karat - 375 byte
Saya menyajikan ini sebagai "batas atas" yang mungkin, saya menantang siapa pun untuk menemukan bahasa di mana implementasi yang masuk akal dari ini lebih lama - karena di sana tidak ada yang berlebihan, tetapi juga tidak ada yang jelas bahkan jauh yang akan menyusut secara signifikan. Hal tentang Rust adalah dibutuhkan sekitar 120 karakter hanya untuk membaca dari stdin dan mengurai menjadi integer. "Oh, tapi kemudian gunakan representasi string" ... tapi aku yakin 99% itu akan lebih lama
sumber
Perl 6Bendera -n, 105 byte
Cobalah online!
Saya akhirnya bisa menggunakan
{}...*
trik , karena kita harus memiliki setidaknya satu iterasi untuk 6174. Saya tidak yakin mengapa saya membutuhkan pembungkus tambahan di.&{ }
sekitar urutan, yang agak menyebalkan.Penjelasan:
sumber