The Collatz Urutan (juga disebut 3x + 1 masalah) adalah di mana Anda mulai dengan bilangan bulat positif, untuk contoh ini kita akan menggunakan 10, dan menerapkan set ini langkah-langkah untuk itu:
if n is even:
Divide it by 2
if n is odd:
Multiply it by 3 and add 1
repeat until n = 1
10 adalah genap, jadi kami membaginya dengan 2 untuk mendapatkan 5. 5 adalah ganjil, jadi kami mengalikannya dengan 3 dan menambahkan 1 untuk mendapatkan 16. 16 genap, jadi potong menjadi dua untuk mendapatkan 8. Setengah dari 8 adalah 4, setengah dari 4 adalah 2, dan setengah dari 2 adalah 1. Karena ini membawa kita 6 langkah, kita katakan bahwa 10 memiliki jarak berhenti 6.
Angka Super Collatz adalah angka yang jarak hentinya lebih besar daripada jarak hentinya setiap angka lebih kecil dari itu. Misalnya, 6 adalah nomor Super Collatz karena 6 memiliki jarak berhenti 8, 5 memiliki jarak berhenti 5, 4 memiliki 2, 3 memiliki 7, 2 memiliki 1 dan 1 memiliki 0. ( A006877 di OEIS) Anda harus ambil angka n sebagai input, dan keluarkan semua nomor Super Collatz hingga n .
Aturan
Program atau fungsi penuh dapat diterima.
Anda tidak dapat melakukan precompute atau melakukan hard-code urutan Super Collatz.
Anda dapat mengambil input dalam format apa pun yang masuk akal.
Output dapat dikembalikan sebagai daftar dari fungsi, atau dicetak ke STDOUT atau file. Mana yang paling nyaman.
Input yang tidak valid (bukan angka, desimal, angka negatif, dll.) Menghasilkan perilaku yang tidak jelas.
Contoh python yang tidak dikerami
def collatzDist(n):
if n == 1:
return 0
if n % 2 == 0:
return 1 + collatzDist(n / 2)
return 1 + collatzDist((n * 3) + 1)
n = input()
max = -1
superCollatz = []
for i in range(1, n + 1):
dist = collatzDist(i)
if dist > max:
superCollatz.append(i)
max = dist
print superCollatz
Sampel IO:
#in #out
4 --> 1, 2, 3
50 --> 1, 2, 3, 6, 7, 9, 18, 25, 27
0 --> invalid
10000 --> 1, 2, 3, 6, 7, 9, 18, 25, 27, 54, 73, 97, 129, 171, 231, 313, 327, 649, 703, 871, 1161, 2223, 2463, 2919, 3711, 6171
Juga di sini adalah 44 nomor Super Collatz pertama:
1, 2, 3, 6, 7, 9, 18, 25, 27, 54, 73, 97, 129, 171, 231, 313, 327, 649, 703, 871, 1161, 2223, 2463, 2919, 3711, 6171, 10971, 13255, 17647, 23529, 26623, 34239, 35655, 52527, 77031, 106239, 142587, 156159, 216367, 230631, 410011, 511935, 626331, 837799
Jawaban:
Pyth, 23 byte
Demonstrasi
Ini berfungsi dengan mengambil maks rentang hingga setiap angka dengan jarak berhenti Collatz mereka, dan memeriksa apakah maks itu adalah angka yang dimaksud.
sumber
Python 2, 104 byte
c
adalah fungsi pembantu yang menghitung jarak Collatz untuk bilangan bulat yang diberikan. Lambda yang tidak disebutkan namanya adalah fungsi utama, yang menghitung angka-angka super Collatz hingga (tetapi tidak termasuk) input.sumber
Dyalog APL , 41 byte
Fungsi yang tidak disebutkan namanya. Nama atau tanda kurung untuk diterapkan.
Kasus uji:
0 menghasilkan perilaku yang tidak terdefinisi.
sumber
ES6,
8683 byteSunting: Disimpan 3 byte dengan beralih dari
filter
pemahaman array.sumber
Haskell, 84 byte
Ini sangat lambat, tentu saja, tetapi berhasil!
sumber
Oracle SQL 11.2, 329 byte
Versi tidak golf
Tampilan q adalah tampilan rekursif sejati (bukan kueri hierarkis dengan CONNECT BY) yang menghitung semua langkah menuju 1 untuk setiap integer antara 1 dan: 1.
Tampilan v menghitung jarak berhenti.
Tampilan m menggunakan versi analitik MAX untuk menerapkannya pada setiap baris sebelumnya, tidak termasuk baris saat ini. Dengan begitu untuk setiap bilangan bulat kita tahu itu jarak berhenti dan jarak berhenti terbesar saat ini.
Permintaan akhir memeriksa apakah jarak berhenti lebih besar dari jarak berhenti terbesar. Dan menambahkan beberapa trik untuk menangani 1 dan kasus khusus: 1 memiliki nilai 0.
sumber
MATL , 37 byte
Cobalah online!
sumber
𝔼𝕊𝕄𝕚𝕟, 30 karakter / 38 byte
Try it here (Firefox only).
Satu-satunya alasan saya tidak memposting ini sebelumnya adalah karena saya tidak jelas tentang spesifikasinya. Menggunakan penyandian khusus yang menyandikan karakter 10-bit.
Penjelasan
⩥ïⓜ
membuat rentang[0,input)
untuk dipetakan.МȬ⧺$,a=[])
menghasilkan nomor Collatz dalam array kosong, dan⋎⟮aꝈ-1⟯>ɐ
menggunakan array nomor Collatz untuk mendapatkan jarak berhenti dan memeriksa apakah itu lebih besar dari jarak berhenti maksimum sebelumnya. Jika demikian,⅋(ɐ=Ⅰ,ᵖ$
jadikan jarak pemberhentian saat ini sebagai jarak pemberhentian maksimum dan dorong item saat ini dalam kisaran ke tumpukan. Setelah itu, item tumpukan dicetak secara implisit.sumber
Jelly , 17 byte
Cobalah online!
Mungkin mengejutkan, ini hanya 3 tautan! Mereka
×3‘µHḂ?µÐĿL$€
,<Ṫ$
danẠ
.sumber