The Collatz dugaan postulat bahwa jika Anda mengambil setiap bilangan bulat positif, kemudian ulangi algoritma berikut cukup kali:
if number is odd, then multiply by three and add one
if number is even, then divide by two
Anda akhirnya akan berakhir pada 1. Tampaknya selalu berfungsi, tetapi tidak pernah terbukti bahwa selalu berhasil.
Anda telah bermain golf menghitung berapa lama untuk sampai ke 1 , jadi saya pikir saya akan sedikit beralih.
Dimulai dengan bilangan bulat positif yang diberikan, hitung berapa lama untuk mencapai 1 ("waktu berhenti"). Kemudian menemukan bahwa waktu berhenti nomor ini.
Ulangi sampai Anda mencapai 1, atau sampai Anda mencapai batas 100 iterations sepenuhnya sewenang-wenang. Dalam kasus sebelumnya, cetak berapa banyak iterasi yang diperlukan. Dalam kasus terakhir, cetak "Gagal" atau output konsisten pilihan Anda, selama itu bukan bilangan bulat 1≤n≤100
. Anda tidak boleh mengeluarkan string kosong untuk opsi ini. Akan tetapi, menghasilkan bilangan bulat di luar kisaran [1, 100].
Contoh:
Input: 2
2->1
Output: 1
Input: 5
5->5->5->5->5->...
Output: Fail
Input: 10
10->6->8->3->7->16->4->2->1
Output: 8
Input: 100
100->25->23->15->17->12->9->19->20->7->16->4->2->1
Output: 13
Input: 10^100
10^100->684->126->108->113->12->9->19->20->7->16->4->2->1
Output: 13
Input: 12345678901234567890
12345678901234567890->286->104->12->9->19->20->7->16->4->2->1
Output: 11
Input: 1
--Depending on your code, one of two things may happen. Both are valid for the purposes of this question.
1
Output: 0
--Or:
1->3->7->16->4->2->1
Output: 6
Saat saya menghitung 10^100
dan 12345678901234567890
menggunakan bahasa yang hanya mendukung real untuk ukuran itu, jika bahasa Anda lebih akurat, Anda mungkin mendapatkan hasil berbeda untuk itu.
Mencetak gol
Karena ini adalah kode-golf , jawabannya dengan jumlah byte terpendek akan menang.
sumber
Jawaban:
Jelly , 24 byte
Cobalah online!
sumber
³
bukanȷ2
yang diperbolehkan ).Python 2 , 70 byte
Mengembalikan 199 untuk seratus atau lebih iterasi.
Cobalah online!
sumber
Attache , 40 byte
Cobalah online!
Ini adalah bahasa baru yang saya buat. Saya ingin berkeliling untuk membuat bahasa infiks yang tepat, dan ini adalah hasilnya: sebuah matematik knock-off. Hore?
Penjelasan
Ini adalah komposisi dari beberapa fungsi. Fungsi-fungsi ini adalah:
PeriodicSteps[CollatzSize@Max&1]
Ini menghasilkan fungsi yang menerapkan argumennya hingga hasilnya berisi elemen duplikat. Fungsi ini,,CollatzSize@Max&1
diterapkanCollatzSize
pada input yang lebih besar dan1
, untuk menghindari input yang tidak valid0
ke CollatSize.`#
adalah operator yang dikutip; ketika diterapkan secara monadik dalam pengertian ini, ia memperoleh ukuran argumennya`-&3
adalah fungsi terikat, yang mengikat argumen3
ke fungsi`-
, yang berbunyi "minus 3". Ini karena aplikasi PeriodicSteps menghasilkan0
, yang perlu dipertanggungjawabkan. (Ini juga dengan rapi menangani angka di luar batas seperti5
, yang dipetakan ke-1
.)sumber
J ,
4945 byte-4 byte berkat kode Sequence Collatz yang lebih pendek yang diambil dari komentar @ randomra di sini .
Output
101
untuk hasil yang tidak valid.Cobalah online!
Penjelasan
Tidak mengherankan, penjelasan ini menjadi cepat usang. Saya akan meninggalkannya dalam hal jawaban 49 byte lama yang saya miliki, yang saya sertakan di bawah ini. Jika Anda ingin pembaruan, beri tahu saya. Cara menemukan panjang urutan rekursif tetap sama, saya baru saja menggunakan metode Urutan Collatz pendek.
Menemukan panjang Urutan Collatz
Bagian kode ini adalah sebagai berikut
Inilah penjelasannya:
Sayangnya, kata kerja yang berlaku (
^:
) saat disuruh menyimpan hasil menyimpan nilai awal juga, jadi itu berarti kami (seperti biasa) tidak aktif satu per satu. Karenanya mengapa kita mengurangi 1.Menemukan panjang urutan rekursif
sumber
*i.~(<101)1&(#@}.a:2&(<*|{%~,*+1+])])]
harus samaC (gcc) , 75 byte
Pengembalian
-1
untukn>=100
iterasi.Cobalah online!
C (gcc) , 73 byte
Pengembalian
0
untukn>=100
iterasi.Cobalah online!
sumber
JavaScript (ES6), 57 byte
Kembali
true
ketika gagal. Pengembalian0
untuk1
.Uji kasus
Tampilkan cuplikan kode
sumber
APL (Dyalog Unicode) ,
3960535249 byte-3 byte terima kasih kepada @ngn
Cobalah online!
Menggunakan kode @ngn untuk Collatz, tetapi sebelumnya menggunakan kode @ Uriel.
Inilah versi lama yang tidak memenuhi spesifikasi:
sumber
2|⍵:1+∇1+3×⍵⋄1+∇⍵÷2
->1+∇⊃⍵⌽0 1+.5 3×⍵
Perl 6 , 56 byte
Cobalah online!
Kembali
101
untuk urutan yang tidak berakhir.sumber
Sekam , 21 byte
Cobalah online! Pengembalian
-1
saat gagal,0
saat input1
.Penjelasan
sumber
C (gcc) ,
7073 byteCobalah online!
Kembali
101
ketika jumlah iterasi melebihi 100.sumber
m=0
ke dalam Andaf
(bahkan mungkin menggunakanfor
intiailiser yang saat ini kosong untuk menyimpan satu a;
).Bersih ,
146... 86 byte-11 byte berkat Ørjan Johansen
Sebagai fungsi parsial literal.
Cobalah online!
Batalkan dengan
hd of []
jika jumlah iterasi melebihi 100.Keluar dengan
Heap Full
untuk input di atas ~2^23
kecuali jika Anda menentukan ukuran tumpukan yang lebih besar.sumber
j f l n=hd[u\\1<-iterate f n&u<-l]
.\a=...a
bagian, itu kari. (Atau mengurangi eta.)Python 2 ,
999897 bytec and t or f
alih-aliht if c else f
.-1
alih-alihf
atau'f'
untuk input yang tidak berhenti.Cobalah online!
sumber
BiwaScheme , 151 karakter
Anda bisa mencobanya di sini .
sumber
R ,
119107 byteSebagian menggunakan kode collatz Jarko Dubbeldam dari sini . Pengembalian
0
untuk> 100 iterasi (kegagalan).Cobalah online!
sumber
APL NARS, 115 byte, 63 karakter
Mungkin menggunakan loop itu akan lebih jelas ... Ada 4 fungsi, 2 bersarang dan retorif, dan yang pertama hanya untuk mendefinisikan dan menginisialisasi ke = 0, variabel d, dilihat dari fungsi ke-2 sebagai penghitung variabel global.
Fungsi ke-3 ini, akan menjadi fungsi yang mengembalikan berapa banyak panggilan yang ada untuk menyelesaikan dugaan Collatz untuk argumennya
Ini adalah fungsi ke-2, jika memiliki arg = 1, hentikan rekursi dan kembalikan jumlah waktu yang disebut dengan dirinya sendiri-1; lain jika itu sendiri disebut lebih dari 99 kali menghentikan rekursi dan mengembalikan -1 (gagal) lain menghitung dugaan Collatz untuk argumennya, dan menyebut dirinya untuk nilai panjang urutan Collatz. Bagi saya bahkan jika semua ini tampaknya berjalan bisa menjadi masalah besar jika didefinisikan sebagai variabel global dan satu variabel dalam fungsi dengan nama yang sama, ketika programmer melihatnya hanya sebagai variabel lokal.
sumber
(Emacs, Common, ...) Lisp, 105 byte
Pengembalian t untuk iterasi> 100
Diperluas:
sumber