Palindrome Reversal-Addition
Proses Reversal-Addition adalah di mana angka ditambahkan ke terbalik sampai angka yang dibuat adalah palindrome. Misalnya, jika kita mulai dengan 68, prosesnya adalah:
68 + 86 => 154 + 451 => 605 + 506 => 1111
Seperti yang Anda lihat, ini membutuhkan 3 tambahan untuk mendapatkan nomor palindromic. Jika kita memulainya 89
, kita akan membutuhkan 24 langkah (yang dapat Anda lihat rinciannya di sini ).
Rekor dunia untuk langkah terbanyak yang diambil sebelum palindrome tercapai adalah 261, yang terjadi untuk angka tersebut 1186060307891929990
, menghasilkan angka yang lebih besar dari 10 118 . Namun, ada beberapa angka yang belum bisa kita dapatkan palindrom. Ini disebut nomor Lychrel .
Karena kami bekerja di basis 10, kami benar-benar hanya dapat memanggil mereka kandidat, karena tidak ada bukti bahwa angka-angka ini tidak pernah mencapai palindrom. Sebagai contoh, kandidat Lychrel basis-10 terkecil adalah 196, dan telah melewati lebih dari satu miliar iterasi. Jika palindrom memang ada, itu jauh lebih besar dari 10 10 8,77 . Sebagai perbandingan, jika banyak 1s itu ditorehkan pada atom, kita akan membutuhkan 2.26772 × 10 588843575 nilai alam semesta atom untuk menuliskannya, dengan asumsi itu ada.
Tugas Anda
Buat program atau fungsi yang mengambil input integer dan mengembalikan atau mencetak jumlah langkah yang diperlukan untuk mencapai palindrome. Anda tidak akan diharuskan untuk berurusan dengan kandidat Lychrel (yaitu program Anda, ketika diberi kandidat Lychrel, diizinkan untuk melakukan kesalahan atau menjalankan selamanya).
Kasus uji:
f(0) => 0
f(11) => 0
f(89) => 24
f(286) => 23
f(196196871) => 45
f(1005499526) => 109
f(1186060307891929990) => 261
Aturan
Bonus
- Jika Anda mencetak setiap langkah penambahan, diformat
n + rev(n) = m
, Anda dapat mengalikan skor Anda dengan 0,75 . Jumlahnya harus dicetak sebelum jumlah langkah. - Jika kode Anda dapat mendeteksi jika suatu angka adalah kandidat Lychrel, Anda dapat mengalikan skor Anda dengan 0,85 . Dalam hal ini cukup untuk mengasumsikan apa pun yang membutuhkan lebih dari 261 iterasi adalah kandidat Lychrel. Entah tidak mengembalikan apa pun, atau apa pun yang bukan angka yang dapat salah untuk jawaban yang benar (dll: string apa pun atau angka yang tidak berada dalam kisaran 0-261). Kesalahan apa pun tidak dihitung sebagai output yang valid (mis. Kedalaman rekursi maksimum terlampaui) dan tidak dapat digunakan dalam deteksi.
- Jika Anda menyelesaikan kedua bonus, kalikan dengan 0,6 .
Ini adalah kode-golf , jadi paling sedikit jumlah byte yang menang.
Cuplikan kode ini menunjukkan contoh solusi dalam Python 3 dengan kedua bonus.
def do(n,c=0,s=''):
m = str(n)
o = m[::-1]
if c > 261:
return "Lychrel candidate"
if m == o:
print(s)
return c
else:
d = int(m)+int(o)
s+="%s + %s = %s"%(m,o,str(d))
return do(d,c+1,s)
sumber
*0.6
bonus di atas yang lain? Atau hanya itu?10 + 01 = 11
atau10 + 1 = 11
terserah kita?262
?Jawaban:
Pyth, 12 byte
Cobalah secara online: Demonstrasi atau Uji harness
Ini menggunakan fitur yang cukup baru (hanya 17 jam).
Penjelasan
edit:
Mengubah kode sedikit. Versi lama adalah
Jumlah byte yang sama, tetapi yang baru lebih keren.
sumber
Python, 51
Untuk Python 2, backticks tidak dapat menggantikan
str()
karenaL
melekat padalong
literal.Ini versi alternatif dengan skor 64 * 0.85 = 54.4 :
Dan versi alternatif untuk Python 3 dengan skor 88 * 0,6 = 52,8 :
sumber
CJam,
232220,4 byteKode panjangnya 24 byte dan mencetak -1 untuk kandidat Lychrel.
Cobalah online.
Bagaimana itu bekerja
Jika
{}#
berhasil, indeks juga merupakan jumlah langkah. Jika, di sisi lain, array tidak mengandung palindrome,{}#
akan mendorong -1 .sumber
Java, 200 * 0,6 = 120
Ini adalah loop sederhana yang tidak hanya apa yang tertulis di kotak, tetapi dengan beberapa golf ditambahkan. Pengembalian
1000
untuk kandidat Lychrel untuk mendapatkan bonus deteksi. Ternyata saya bisa mencetak untuk karakter yang tidak terlalu banyak (setidaknya untuk Java) dan mendapatkan bonus itu juga. Yang terbaik yang bisa saya lakukan tanpa kode bonus adalah 156, jadi itu sangat berharga.Dengan beberapa jeda baris:
Jawaban Lama: 171 * 0,85 = 145,35 byte
sumber
s++<999
Ruby, (80 + 2) * 0.6 = ~ 49.2
Dengan bendera
-nl
, jalankanOutputnya seperti
Jika diberikan 196, ia mencetak 261 langkah penambahan pertama dan kemudian
nil
.Tidak ada yang terlalu rumit di sini. Kami memeriksa apakah
$_
(yang diinisialisasi ke input) berisi kebalikannya, yang hanya mungkin jika mereka sama karena ukurannya sama. Jika ya, kami mencetak nomor langkah dan keluar, jika tidak, kami menampilkan dan mengeksekusi langkah tambahan, menyimpan nilai baru di$_
(sayangnya saya tidak bisa hanyaeval
string yang saya tampilkan karena menafsirkan angka yang dibalik dengan trailing 0 sebagai oktal literal).puts
mengembalikan nilai falsey sehingga loop berlanjut.sumber
" + #{b} = "
menghemat satu byte.-l
jika kita memasukkan nomor ke file tanpa baris baru dan pipa itu?Pyth - 19 byte
Menggunakan while dan counter. Mungkin ada algoritma yang lebih kecil dari ini, tetapi ini cukup singkat.
Cobalah online di sini .
sumber
K, 25 byte
Tidak terlalu elegan. Bentuk keseluruhan (
{monad 1}{monad 2}\x
) adalah ekuivalen K dari loop umum "sementara", di mana monad pertama adalah kondisi penghentian dan yang kedua adalah fungsi yang diterapkan secara iteratif pada argumenx
. Monad pertama ({~x~|x}
) adalah negasi dari frasa klasik "is xa palindrome". Monad kedua menyatukan string yang mewakili x ditambah kebalikan dari x, mengevaluasinya dan kemudian melemparkan hasilnya kembali ke string dengan$
.Contoh dijalankan menunjukkan hasil antara:
Melakukan output yang diformat seperti yang diminta untuk bonus akan sangat canggung dan menambahkan sejumlah kode.
sumber
CJam, 23 byte
Masih hanya beberapa hari ke CJam, jadi saya cukup senang berada di kisaran yang sama dengan beberapa pro. :) Saya memang menggunakan trik perbandingan string Martin yang juga diposting di petunjuk CJam. Saya juga mengintip solusi Dennis untuk mengetahui cara membalikkan string.
Penjelasan:
Uji secara online
sumber
Julia,
129120 byte * 0,6 = 72Ini menciptakan fungsi tanpa nama yang mengambil integer sebagai input dan mengembalikan integer, sementara itu mencetak setiap langkah. Kandidat Lychrel memiliki nilai kembali 262. Untuk memanggil ini, beri nama, misalnya
f=i->...
.Perhatikan bahwa menghilangkan kode yang hanya berkaitan dengan bonus, solusi ini akan menjadi 84 byte.
Penjelasan + tidak dikumpulkan:
Contoh:
Disimpan 2 byte berkat Geobits!
sumber
CJam, 24 byte
Uji di sini.
Penjelasan
Untuk informasi lebih lanjut tentang mengapa
#
dapat digunakan untuk memeriksa ketimpangan string, lihat tip ini .sumber
#
.Haskell,
6653 byteContoh penggunaan:
sumber
r=reverse x
? Itu akan mengubah baris kedua Anda menjadif x|x==r=0|1<2=1+f(show$read x+read(r))
, dan menghemat 2 byte.x
tidak akan berada dalam ruang lingkup. Namun, ituf x|x==r=0 .... read(r)) where r=reverse x
akan berhasil, tetapi lebih lama.Clojure, 94 byte
Ini adalah upaya pertama saya untuk kode golf, jadi tolong beri tahu saya jika saya melakukan sesuatu yang salah.
Dengan beberapa ruang:
Rekursi sederhana dari fungsi bagian dalam. Dibutuhkan dua argumen, bilangan bulat
%1
dan indeks%2
. Jika%1
palindrom, indeks akan dikembalikan. Jika tidak, fungsi memanggil dirinya sendiri dengan jumlah dan indeks yang ditambahkan. Fungsi luar menginisialisasi indeks dengan nol.Sebuah sampel:
sumber
Boost.Build, 304 byte
Bukan bahasa. Masih asik.
Cukup mudah, selain hack berbasis regex yang rumit saya gunakan untuk membalikkan string.
sumber
Ruby, 44
Membutuhkan Ruby 1.9 atau lebih tinggi untuk
->
sintaks lambda.sumber