Deskripsi tantangan
Mari kita ambil bilangan bulat positif n
, balikkan digitnya untuk mendapatkan rev(n)
dan mendapatkan nilai absolut dari perbedaan dua angka ini: |n - rev(n)|
(atau abs(n - rev(n))
).
Contoh:
n = 5067
rev(n) = 7605
|n - rev(n)| = |5067 - 7605| = |-2538| = 2538
Setelah mengulangi operasi ini berkali-kali, sebagian besar angka akan menjadi 0
(sehingga mengakhiri loop) ...
5067 -> 2538 -> 5814 -> 1629 -> 7632 -> 5265 -> 360 -> 297 -> 495 -> 99 -> 0
... meskipun beberapa angka (seperti 1584
) macet di loop tak terbatas:
1584 -> 3267 -> 4356 -> 2178 -> 6534 -> 2178 -> 6534 -> 2178 -> 6534 -> ...
^ infinite loop starts here
Tugas Anda adalah menentukan apakah bilangan bulat yang diberikan macet di loop tak terbatas.
Deskripsi input
Bilangan bulat positif.
Deskripsi keluaran
Nilai kebenaran ( True
, 1
) jika nomor macet dalam infinite loop, nilai palsu ( False
, 0
) sebaliknya.
Catatan
code-golf
number-theory
shooqie
sumber
sumber
Jawaban:
Pyth, 5 byte
4 byte terima kasih kepada FryAmTheEggman
Suite uji.
Nilai kebenaran adalah salah satu angka dalam loop.
Nilai falsey adalah
0
.Penjelasan
sumber
Mathematica,
3937 byteCukup gunakan waktu transformasi mundur / kurangi
n
ke inputn
dan kemudian periksa apakah hasilnya0
. Tidak pernah dapat mengambil lebih dari10n
langkah untuk mencapai satu lingkaran, karena transformasi tidak dapat meningkatkan jumlah digit, dan ada lebih sedikit dari10n
angka dengan tidak ada lebih banyak digit daripadan
. Lihat bukti Dennis tentang cara mengurangi keterikatan inin
.sumber
Jelly ,
65 byteCobalah online!
Latar Belakang
Ini menggunakan @ MartinEnder yang atas terikat dari 10n iterasi dan observasi berikut.
Ada 9 × 10 k - 1 bilangan bulat positif n dengan k digit.
Perbedaan angka dan kebalikannya selalu kelipatan 9 , jadi hanya 10 k - 1 dari mereka dapat terjadi setelah iterasi pertama.
Dari kelipatannya, lebih dari 1/10 akan kehilangan satu digit di iterasi berikutnya (sebagai permulaan, semua yang dimulai dan diakhiri dengan digit yang sama, dan kira-kira dua kali lebih banyak jika digit pertama bukan angka 1 atau angka 9 ), jadi paling banyak dibutuhkan 9 × 10 k - 2 untuk memasukkan satu lingkaran atau kehilangan satu digit.
Menerapkan alasan yang sama pada bilangan bulat k - 1 yang dihasilkan dan seterusnya, dibutuhkan paling banyak 9 × 10 k - 2 + 9 × 10 k - 2 +… ≤ 10 k - 1 ≤ n iterasi untuk memasukkan sebuah loop atau mencapai 0 .
Bagaimana itu bekerja
sumber
Oracle SQL 11.2, 136 byte
Tidak bermain golf
sumber
APL, 26 karakter
Kami menggunakan argumen kiri sebagai akumulator dari nilai yang telah kita lihat. Kami menginisialisasi ke "0", yang merupakan salah satu dari dua kondisi pemutusan. Penjaga
⍵∊⍺:×⍵
itu terbaca: "apakah argumen yang benar sudah pernah kita lihat (dan itu termasuk nol)? Jika demikian kembalikan tanda angka, yaitu 1 atau 0". Kalau tidak, mari kita kambuh dengan menyebut diri kita dengan nilai absolut dari pengurangan setelah memiliki nilai saat ini untuk argumen kiri.Sebuah penyusunan kembali solusi Mathematica oleh Martin Ender akan jam di 21 karakter :
Bunyinya: "apa tanda hasil setelah menerapkan 10n yang diinginkan kali"?
sumber
Python 2, 50 byte
Uji di Ideone .
Latar Belakang
Ini menggunakan @ MartinEnder yang atas terikat dari 10n iterasi dan observasi berikut.
Ada 9 × 10 k - 1 bilangan bulat positif n dengan k digit.
Perbedaan angka dan kebalikannya selalu kelipatan 9 , jadi hanya 10 k - 1 dari mereka dapat terjadi setelah iterasi pertama.
Dari kelipatannya, lebih dari 1/10 akan kehilangan satu digit di iterasi berikutnya (sebagai permulaan, semua yang dimulai dan diakhiri dengan digit yang sama, dan kira-kira dua kali lebih banyak jika digit pertama bukan angka 1 atau angka 9 ), jadi paling banyak dibutuhkan 9 × 10 k - 2 untuk memasukkan satu lingkaran atau kehilangan satu digit.
Menerapkan alasan yang sama pada bilangan bulat k - 1 yang dihasilkan dan seterusnya, dibutuhkan paling banyak 9 × 10 k - 2 + 9 × 10 k - 2 +… ≤ 10 k - 1 ≤ n iterasi untuk memasukkan sebuah loop atau mencapai 0 .
sumber
CJam,
1513 byteUji di sini.
Sama seperti jawaban Mathematica saya.
sumber
Python,
12912096 byteJika pengecualian ditangkap (biasanya satu-satunya pengecualian yang dapat dilemparkan dengan fungsi ini adalah RuntimeError, karena rekursi tak terbatas), cetak 1. Jika tidak, cetak hasilnya, 0.
Terima kasih kepada @LeakyNun
Terima kasih kepada @shooqie
sumber
return a and rev(a)
a=[n-x,x-n][n>x]
def rev(n):a=abs(n-int(str(n)[::-1]));return a and rev(a)
. Juga,r
rev
Python,
10198 byteAlgoritme kura-kura dan kelinci.
Kebenaran adalah nilai dalam loop, falsey adalah
0
.Ide itu!
sumber
Python 2,
858483 byteJawaban Python lainnya. Ia menambahkan n ke daftar untuk setiap iterasi, dan jika n sudah ada dalam daftar, itu menghasilkan
False
. Kalau tidak, ia bekerja ke 0.Terima kasih @NonlinearFruit untuk satu byte.
sumber
print n<1
bekerja (karenan
selalu non-negatif) dan menyimpan bytedef f(n,L=[]):¶ if n<1or n in L:print n<1¶ else:f(abs(n-int(`n`[::-1])),L+[n])
menghemat 5 byte05AB1E,
1186 byteDijelaskan
Nilai kebenaran adalah angka dari loop.
Nilai falsy adalah 0.
Cobalah online
Menggunakan batas atas dijelaskan dalam jawaban Dennis 'Jelly
Disimpan 2 byte berkat @Adnan
Dalam versi 7.9 dari 05AB1E solusi 5-byte berikut berfungsi seperti dicatat oleh @Adnan
sumber
DFÂ-Ä
bekerja di versi 7.9 tetapi tidak di versi saat ini. Dalam versi saat ini, Anda harus mengonversinya menjadi int terlebih dahulu (seperti iniDFÂï-Ä
), tetapi Anda dapat menggunakan versi 7.9 untuk membuatnya 5 byte: p.Java 7, 161 byte
Ini memerlukan impor tetapi saya menulisnya sebagai fungsi. Teriak padaku di komentar jika program lengkap lebih disukai dalam skenario ini. Output 1 jika ada loop tak terbatas dan 0 jika nilainya mencapai 0.
sumber
1
?Brachylog ,
493223 bytePengembalian
true
untuk loop tak terbatas danfalse
sebaliknya.Ini adalah adaptasi yang tidak tahu malu dari algoritma Martin Ender.
Jawaban sebelumnya, 32 byte
Penjelasan dari jawaban sebelumnya
sumber
PowerShell v2 +, 94 byte
Mengambil input
$n
, memulaifor
loop tak terbatas , dengan$a=,0
sebagai kondisi awal (ini menggunakan operator koma untuk mengatur$a
ke array dari satu elemen,0
). Ini$a
adalah susunan nilai yang sudah terlihat.Setiap iterasi loop kami periksa
if
. Kondisi pertama menetapkan nilai berikutnya$n
menggunakan pembalikan string dan[math]::Abs
panggilan .NET, dan memeriksa apakah nilai itu sudah-in
$a
. Jika demikian, kami mengeluarkan$n
danexit
. Jika tidak, kami menambahkan nilai itu ke array dan melanjutkan loop.Output
0
untuk nilai input di mana ia tidak masuk ke infinite loop (yang merupakan falsey di PowerShell) dan output nilai di mana loop ditemui sebaliknya (bilangan bulat nol benar). Misalnya, output2178
untuk input1584
.sumber
Haskell, 65 byte
Returns
0
for False dan1
for True. Contoh penggunaan:([]#) 1584
->1
.Pendekatan yang jelas: buat daftar dengan semua hasil yang terlihat sejauh ini. Hitung nomor berikutnya sampai
0
atau ada dalam daftar.sumber
JavaScript (ES6), 75 byte
n<0?n=-n:n
dann*=n>0||-1
juga bekerja. Algoritma agak menyerupai jawaban PowerShell, meskipun ini adalah formulasi rekursif.sumber
Ruby, 57 byte
Array yang awalnya kosong
h
melacak nilai-nilai sebelumnya. Kami mengulangi angka hingga mencapai nilai sebelumnya, lalu memeriksa nilai pada iterasi terakhir. Karena 0 adalah siklus 1, itu akan menjadi 0 jika dan hanya jika tidak ada siklus yang lebih besar. Saya mengambil tambahan 2 byte untuk mengonversinya menjadi Boolean karena 0 benar di Ruby.sumber
Perl 6
58 53 3330 bytePenjelasan:
(Bergantung pada pengamatan sebelumnya bahwa Anda hanya perlu melakukan transformasi ini paling banyak
n
kali)sumber
Perl 5,
3129 byteIterates
n=|n-rev(n)|
n kali, jadi output adalah 0 jika tidak ada loop,> 0 sebaliknya. Dennis sudah membuktikan ini sudah cukup.Versi baru menggunakan
eval
danx
mengulangi operator, bukanfor
loop.sumber
-p
opsi,-l
tidak perlu untuk input tunggalMatlab,
8984 bytePendekatan sederhana - menumpuk semua angka dan memeriksa apakah suatu angka muncul sebelumnya.
Penjelasan
sumber