Urutan Kuznetsov
(I made the name up, don't bother with Wikipedia or Google)
Diberi nomor apa pun n > 0
, mari kita r
wakili kebalikan dari angka tersebut n
. Ulangi sampai hasil akhir adalah nol, dengan meneruskan hasil setiap iterasi kembali ke fungsi menggunakan rekursi atau metodologi pilihan Anda dengan melakukan operasi di bawah ini:
- Jika
r > n
untuk iterasi hasilnya adalahr % n
. - Jika
n > r
untuk iterasi hasilnya adalahn % r
. - Jika
n % r = 0
ataur % n = 0
, Anda mengakhiri iterasi.
Ambil hasil antara dari setiap eksekusi dan simpan dalam array untuk jawaban akhir. Nomor awal n
bukan bagian dari urutan, juga bukan 0
; contoh-contohnya harus membuat segalanya sedikit lebih jelas.
Mari kita telusuri contoh di mana n=32452345
.
54325423 % 32452345 = 21873078 # r > n, uses r % n
87037812 % 21873078 = 21418578 # r > n, uses r % n
87581412 % 21418578 = 1907100 # r > n, uses r % n
1907100 % 17091 = 9999 # n > r, uses n % r
9999 % 9999 = 0 # r % n = n % r = 0, terminated
Result: [21873078, 21418578, 1907100, 9999]
Contoh lain n=12345678
:
87654321 % 12345678 = 1234575 # r > n, uses r % n
5754321 % 1234575 = 816021 # r > n, uses r % n
816021 % 120618 = 92313 # n > r, uses n % r
92313 % 31329 = 29655 # n > r, uses n % r
55692 % 29655 = 26037 # r > n, uses r % n
73062 % 26037 = 20988 # r > n, uses r % n
88902 % 20988 = 4950 # r > n, uses r % n
4950 % 594 = 198 # n > r, uses n % r
891 % 198 = 99 # r > n, uses r % n
99 % 99 = 0 # r % n = n % r = 0, terminated
Result: [1234575, 816021, 92313, 29655, 26037, 20988, 4950, 198, 99]
Contoh terakhir n=11000
:
11000 % 11 = 0 # n % r = 0, terminated
Result: []
Ini adalah kode-golf kemenangan byte-count terendah.
Jawaban:
05AB1E , 11 byte
Menggunakan pengkodean CP-1252 . Cobalah online!
sumber
PowerShell v2 +, 89 byte
Solusi berulang. Panjang karena tidak ada cara mudah untuk membalikkan array, jadi kami meringkasnya dan mengindeksnya ke belakang untuk menyimpannya
$r
. Kemudian pseudo-ternary untuk menarik modulo yang sesuai dan menyimpannya kembali$n
untuk putaran berikutnya. Namun, jika hasilnya nol, itu berarti!($n...)
akan$true
, jadi kamiexit
bukan$n
. Angka-angka dibiarkan pada pipa dan (secara implisit) dikembalikan sebagai array, tetapi tanpa pipa enkapsulasi atau menyimpan hasilnya ke dalam variabel, defaultWrite-Output
menempel baris baru di antara.Cobalah online! (Ya, sangat serius.)
PowerShell sekarang di TIO! Anda harus memberikannya satu atau dua detik, karena PowerShell adalah binatang untuk startup, tetapi sekarang Anda, ya Anda , dapat memverifikasi kode PowerShell tepat di browser Anda!
sumber
Perl,
4338 + 1 = 39 byteJalankan dengan
-n
benderaCobalah online! Termasuk dua contoh tidak kosong.
Bagan penjelasan
-n
: Membungkus seluruh program dalamwhile(<>){ ... ;}
. Ini ternyata kode di atas ke baris berikut:while(<>){say while$_=($;=reverse)>$_?$;%$_:$_%$;}
. Perhatikan, titik koma telah ditambahkan ke trailing$
, jadi sekarang menjadi instance dari variabel$;
. Dalam kondisiwhile
loop,<>
secara otomatis membaca satu baris input dan menyimpannya dalam$_
variabel. Jadi sekarang mari kita lihat apa yang dibaca penerjemah di dalamwhile
lingkaran luar :Kode asli, disimpan untuk anak cucu: 43 + 1 = 44 byte
sumber
$%>$_?$%%$_:$_%$%
Apakah Anda memilih$%
variabel dengan sengaja hanya untuk baris ini?Pyth,
1312 byteTerima kasih kepada @TheBikingViking.
Cobalah online: Demonstrasi
Kode lama saya:
Cobalah online: Demonstrasi
Penjelasan:
sumber
t.u|%F_S,s_<backtick>
. UjiJelly ,
15 1413 byteTryItOnline
Bagaimana?
sumber
Jelly ,
1312 byteIni adalah tautan / fungsi monadik yang mencetak ke STDOUT.
Cobalah online!
Bagaimana itu bekerja
sumber
Python 2,
9287817361 byteSolusi rekursif:
Cobalah online
Solusi berulang: (juga 61 byte )
Cobalah online
sumber
while n:
. Kalau tidak, Anda bisa melakukannya dengan 61 byte .MATL , 16 byte
Cobalah online!
Penjelasan
sumber
PHP, 78 byte
sumber
Batch, 140 byte
Mengambil input pada STDIN dan mengeluarkan urutan pada baris yang berbeda. Batch memiliki pernyataan kondisional (yang agak verbose) tetapi tidak ada ekspresi kondisional sehingga lebih mudah (meskipun harus mengutip
%
s) untuk menghitungr%n%r
(yang sama denganr%n
jikan<r
atau nol jikan>r
) dann%r%n
(yang sama dengann%r
jikan>r
atau nol jikan<r
) dan menambahkan mereka bersama.sumber
Mathematica, 68 byte
Terima kasih kepada Greg Martin karena menyarankan saya menggunakan
FixedPointList
daripadaNestWhileList
:Terpendek saya bisa mendapatkan solusi asli saya dengan
FixedPointList
73 byte:sumber
11000
). Anda bisa menyiasatinya dengan beralih ke teknik yang dijelaskan dalam paragraf terakhir Anda. Tetapi saya tidak melihat bagaimana cara menyingkirkanRest
atauMost
dengan cara ini. Di sisi lain,FixedPointList[ Mod[(r = IntegerReverse@#)~Max~#, r~Min~#] &, #][[2 ;; -4]] &
hanya 68 byte setelah spasi dihapus (melempar beberapa kesalahan, nbd).{a,b,c,d}[[2;;-4]]
akan memberikan kesalahan daripada daftar kosong (saya mungkin menggunakan koma daripada;;
). Belajar sesuatu.Sort
:FixedPointList[-Mod@@Sort@-{#,IntegerReverse@#}&,#][[2;;-4]]&
JavaScript,
7270 byteDiedit:
-2 byte : Operator spread menunggu penggabungan string.
sumber
R,
126117 byteSayangnya, membalikkan angka (
as.double(paste(rev(el(strsplit(c(x,""),""))),collapse="")))
) cukup bertele-tele. Beristirahat cukup mudah. Penggunaansort
untuk memeriksa secara tidak langsung mana yang lebih tinggi.Sisanya mudah, terus berputar sampai
x=0
, dan mencetak semua langkah.sumber
C, 87 byte
t
bersifat sementara untuk membalikkan. Loop dalam menggeserr
1 digit ke kiri dan menambahkan digit terakhirt
hingga habis. Output adalah setelah iterasi pertama dan hanya jika tidak nol untuk mencegah item pertama dan terakhir ditampilkan.Tidak digabungkan dan digunakan:
sumber
Mathematica, 64 byte
Kode di atas mewakili fungsi murni yang mengambil input tunggal, dan mengembalikan urutan kuznetsovs. Hal yang sangat indah tentang Mathematica adalah bahwa Anda dapat menempatkan lapisan demi lapisan fungsi murni ... Izinkan saya menjelaskan kode;)
Setiap istilah dalam urutan itu sendiri dihitung dengan fungsi di bawah ini, yang mengambil satu input dan mengembalikan istilah berikutnya.
Kode
IntegerReverse@#
hanya menghasilkan r, nilai terbalik. Kode#2~If[#<=#2,Mod,#0]~#&
adalah fungsi yang mengambil dua input dan melakukan operasi mod, atau membalikkan input dan memanggil dirinya lagi. Cara penulisan lainnya adalahIf[#<=#2, Mod, #0][#2, #]&
, atau dapat ditulis sebagai fungsi reguler seperti ini:k[a_, b_] := If[a <= b, Mod, k][b, a]
sumber
Racket 180 byte
Tidak Disatukan:
Pengujian:
Ouput:
sumber