Ini adalah dugaan Collatz (OEIS A006577 ):
- Mulai dengan bilangan bulat n > 1.
- Ulangi langkah-langkah berikut:
- Jika n adalah genap, bagilah dengan 2.
- Jika n ganjil, kalikan dengan 3 dan tambahkan 1.
Terbukti bahwa untuk semua bilangan bulat positif hingga 5 * 2 60 , atau sekitar 576400000000000000000 , n pada akhirnya akan menjadi 1 .
Tugas Anda adalah untuk mengetahui berapa banyak iterasi yang dibutuhkan (untuk membagi dua atau tiga kali lipat-plus-satu) untuk mencapai 1 .
Xkcd relevan :)
Aturan:
- Kode terpendek menang.
- Jika angka <2 adalah input, atau non-integer, atau non-angka, output tidak menjadi masalah.
Uji kasus
2 -> 1
16 -> 4
5 -> 5
7 -> 16
1+
adalah kasus khusus)
.C -
5047 karakterSayangnya, si C kecil yang malang membutuhkan sejumlah besar kode untuk I / O dasar, jadi menyingkat semua itu membuat UI sedikit tidak intuitif.
Kompilasi dengan misalnya
gcc -o 1 collatz.c
. Inputnya unary dengan digit yang dipisahkan oleh spasi, dan Anda akan menemukan jawabannya di kode keluar. Contoh dengan angka 17:sumber
return~-a?
menghemat 1. Juga pindahb++
ke?
kasing harus menyimpanb--
.Perl 34 (+1) karakter
Menyalahgunakan
$\
untuk hasil akhir, seperti biasa. Jalankan dengan-p
opsi baris perintah, input diambil daristdin
.Disimpan satu byte karena Elias Van Ootegem . Secara khusus, pengamatan bahwa dua berikut ini setara:
Meskipun satu byte lebih lama, ia menghemat dua byte dengan memperpendek
$_/2
menjadi hanya.5
.Penggunaan sampel:
PHP 54 byte
Arkeologi Javascript untuk Penghargaan Sendok Kayu tampaknya telah gagal dalam tantangan ini. Namun, tidak ada banyak ruang untuk kreativitas dengan masalah ini. Input diambil sebagai argumen baris perintah.
Penggunaan sampel:
sumber
$_
di terner tampaknya boros, Anda bisa mencukur habis karakter lain dengan menggunakan*=
seperti ini:$\++,$_*=$_&1?3+1/$_:.5while$_>1}{
. Mengalikan dengan1/$_
memiliki efek yang sama dengan+1
, jadi$_*=3+1/$_
berfungsi dengan baik$_*=3+1/$_
brilian, terima kasih!Mathematica (35)
Pemakaian:
sumber
Seperti yang biasa saya lakukan, saya akan memulai jawaban dengan jawaban saya sendiri.
JavaScript,
4644 karakter (berjalan di konsol)sumber
Java,
165, 156, 154,134,131,129,128, 126 (bahasaverbal jugabutuh cinta)Semua dilakukan di dalam untuk
Itu pria cantik yang menakutkan. Terima kasih kepada Pater Taylor !!!, dan gagasan menggunakan for for dicuri dari ugoren
Saya mengganti Integer untuk Short.
sumber
i(,++y)
. Anda dapat menyimpan dua lagi dengan menggunakan<
bukan==
.class a{public static void main(String[]a){for(int x=new Short(a[0]),y=0;x>1;System.out.println(++y))x=x%2<1?x/2:x*3+1;}}
Perubahan yang dilakukan: 1) DigantiShort.valueOf(...)
dengannew Short(...)
untuk -4 byte dan 2) saya sudah menempatkanx=x%2<1?x/2:x*3+1;
di tubuhfor
-loop untuk menyingkirkan koma untuk -1 byte .Rebmu : 28
Pada masalah yang singkat dan matematis ini, GolfScript kemungkinan akan menang beberapa persen terhadap Rebmu (jika tidak diharuskan untuk mengatakan, baca file dari internet atau hasilkan file JPG). Namun saya pikir sebagian besar akan setuju bahwa logika Golfscript tidak mudah untuk diikuti, dan total stack yang dapat dieksekusi menjalankannya lebih besar.
Meskipun pencipta Rebol sendiri Carl Sassenrath mengatakan kepada saya bahwa dia menemukan Rebmu "tidak dapat dibaca", dia sibuk, dan tidak punya waktu untuk benar-benar mempraktikkan transformasi seperti babi-latin melalui tanpa penyaringan . Ini benar-benar hanya ditransformasikan menjadi:
Perhatikan bahwa ruang diperlukan untuk mendapatkan a: bukan a . Ini adalah "set-word!" dan evaluator memperhatikan jenis simbol yang memicu tugas.
Jika ditulis dalam bahasa yang tidak disatukan (Rebol yang ditulis dengan canggung), Anda akan mendapatkan:
Rebol, seperti Ruby, mengevaluasi blok ke nilai terakhirnya. Loop UNTIL adalah bentuk loop aneh yang tidak memerlukan kondisi loop, itu hanya berhenti loop ketika bloknya mengevaluasi sesuatu yang tidak SALAH atau TIDAK. Jadi pada titik bahwa
1 ==
hasil penugasan A (argumen untuk rebmu) ke hasil persyaratan Collatz (baik adalah IF-ELSE yang mengevaluasi ke cabang yang dipilihnya) ... loop terputus.J dan K diinisialisasi ke nilai integer nol di Rebmu. Dan seperti yang disebutkan di atas, semuanya mengevaluasi ke nilai terakhir. Jadi referensi J di akhir program berarti Anda mendapatkan jumlah iterasi.
Pemakaian:
sumber
Ulangi Python, 48
Saya tidak yakin bahwa tidak ada ekspresi yang lebih pendek daripada
n=3*n+1;n/=1+n%2*5;
. Saya mungkin menemukan selusin ekspresi berbeda dengan panjang yang sama ...sunting: Saya telah menemukan solusi lain yang tidak akan pernah bersaing, tetapi terlalu menyenangkan untuk tidak dibagikan.
sumber
(n//2,n*3+1)[n%2]
lebih pendek.n/2
berfungsi sebaik yang kita tahu itu genap?APL (31)
sumber
{1=⍵:0⋄2|⍵:1+∇1+3×⍵⋄1+∇⍵÷2}
{1=⍵:0⋄1+∇⊃⍵⌽0 1+.5 3×⍵}
J, 30 karakter
Ternyata sedikit lebih lama dari yang diinginkan
pemakaian:
-:`(1+3&*)`]
adalah gerund yang terdiri dari tiga kata kerja, digunakan pada tiga kesempatan.-:
berarti "membagi dua",(1+3&*)
atau(1+3*])
mengkodekan langkah multiplikasi dan]
(identitas) bantuan pemutusan.2&|+1&=
membentuk indeks ke gerund. secara harfiah, "sisanya setelah pembagian dengan dua ditambah apakah sama dengan satu".#verb^:a:
iterates fungsi sampai hasilnya stabil (di sini, dipaksa secara eksplisit), sambil mengumpulkan langkah-langkah, lalu hitung. Dicuri dari @JB .<:
mengurangi hitungan langkah dengan satu untuk menyelaraskan dengan persyaratan pertanyaan.sumber
<:
,#-:
,:`(
,&*)
,=)
,)^:
.<:
berarti "pengurangan" atau "kurang atau sama",#
berarti "hitungan" atau "n kali",-:
berarti "membagi dua" atau "kesetaraan epsilon",:`(
berarti pada akhirnya akhir kata "membagi dua", ikatan antara dua kata kerja dalam gerund dan tanda kurung kiri (digunakan untuk pengelompokan).&*)
berarti "sth. terikat dengan perkalian" (3 terikat dengan perkalian menciptakan "kali tiga" operator) dan akhir pengelompokan.=
melakukan pemeriksaan kesetaraan atau, dalam arti unary, klasifikasi diri.^:
adalah kekuatan konjungsi (iterasi kata kerja). Karena banyak kata kerja J diakhiri dengan tanda titik dua, ... :-)<:#a:2&(<*|+|6&*%~)
19 byte (-11)Skema Gambit,
10698 karakter, 40 tanda kurung(let((f(lambda(x)(cond((= x 1) 0)((odd? x)(+ 1(f(+ 1(* 3 x)))))(else(+ 1(f(/ x 2))))))))(f(read)))
9189 karakter dengan define secara langsung(define(f x)(cond((= x 1)0)((odd? x)(+ 1(f(+ 1(* 3 x)))))(else(+ 1(f(/ x 2))))))(f(read))
sumber
PowerShell:
7774717061Kode golf:
Catatan:
Saya awalnya mencoba mengambil input pengguna tanpa memaksanya ke integer, tapi itu pecah dengan cara yang menarik. Setiap input aneh akan diproses secara tidak akurat, tetapi bahkan input akan bekerja dengan baik. Butuh satu menit untuk menyadari apa yang sedang terjadi.
Saat melakukan penggandaan atau penambahan, PowerShell memperlakukan input yang tidak diketik sebagai string terlebih dahulu. Jadi,
'5'*3+1
menjadi '5551' alih-alih 16. Input genap berperilaku baik karena PowerShell tidak memiliki aksi default untuk pembagian terhadap string. Bahkan input genap yang akan maju melalui angka ganjil bekerja dengan baik karena, pada saat PowerShell sampai ke angka ganjil dalam loop, variabel itu tetap dipaksa menjadi bilangan bulat oleh operasi matematika.Tip PowerShell Golfer: Untuk beberapa skenario, seperti ini,
switch
ketukanif/else
. Di sini, perbedaannya adalah 2 karakter.Tidak ada kesalahan memeriksa nilai-nilai non-integer, atau integer kurang dari dua.
Jika Anda ingin mengaudit skrip, letakkan
;$i
sesaat sebelum kurung tutup terakhir pada skrip.Saya tidak yakin persis seberapa baik PowerShell menangani angka yang berkembang menjadi nilai yang sangat besar, tetapi saya berharap akurasi hilang di beberapa titik. Sayangnya, saya juga berharap tidak banyak yang bisa dilakukan tentang hal itu tanpa serius membengkak skrip.
Kode tidak dikunci, dengan komentar:
Kasus uji:
Berikut adalah beberapa sampel dengan audit yang diaktifkan. Saya juga mengedit output untuk kejelasan, dengan menambahkan label pada input dan jumlah akhir dan menempatkan jarak untuk memisahkan nilai-nilai Collatz.
Bit menarik tentang nomor input yang bukan dari kasus uji pertanyaan:
14
dan197
adalah Nomor Keith31
adalah Perdana Mersenne6174
adalah Konstan Kaprekar8008135
. Dan Numberphile , tentu saja.sumber
switch
dengan$i=(($i/2),($i*3+1))[$i%2]
read-host
ke angka - cukup ubah$i*3
ke3*$i
.$i*3
- mengapa saya belum memikirkan itu?param($i)for(;$i-ne1;$x++){$i=(($i/2),(3*$i+1))[$i%2]}$x
- menukar read-host dengan parameter, untuk mendapatkan 56 byte . Tautan Try It Online80386 unit, 16 byte
Contoh ini menggunakan sintaks AT&T dan konvensi pemanggilan cepat, argumennya menjadi
ecx
:Berikut adalah 16 byte kode mesin yang dihasilkan:
sumber
Brachylog , 16 byte
Cobalah online!
Penjelasan
Solusi alternatif pada jumlah byte yang sama:
Cobalah online!
sumber
GolfScript (23 karakter)
Tes online
sumber
F # - 65 karakter
sumber
Python
68585452 karakterf=lambda n:1+(n-2and f((n/2,3*n+1)[n%2]));f(input())
Terima kasih kepada Bakuriu dan Stanby untuk tipsnya :)
sumber
n%2and 3*n+1or n/2
untuk menyimpan 5 karakter. Juga di python2 Anda dapat menghapus panggilan keint
, mengurangi ukuran hingga 58 byte.[n/2,3*n+1][n%2]
.unsupported operand type(s) for -: 'str' and 'int'
Retina , 43 byte
Mengambil input dan mencetak output secara unary.
Setiap baris harus menuju ke file sendiri. 1 byte per file tambahan ditambahkan ke byte-count.
Anda dapat menjalankan kode sebagai satu file dengan
-s
bendera. Misalnya:Algoritme adalah loop untuk melakukan langkah Collatz dengan angka unary dan menambahkan penanda langkah baru
x
di akhir string jika angkanya bukan 1.Ketika loop berakhir dengan
1
, kami mengonversi marker ke nomor unary (menghapus yang memimpin1
) yang merupakan output yang diinginkan.sumber
Jelly , tidak bersaing
12 byte Jawaban ini tidak bersaing, karena tantangan mendahului pembuatan Jelly.
Cobalah online!
Bagaimana itu bekerja
sumber
dc, 27 karakter
Menerapkan ilmu hitam booth :
Saya tidak begitu yakin apakah saya mengerti bagaimana - atau itu - itu berhasil.
Pemakaian:dc, 36 karakter
Ciptaan saya sendiri; pendekatan yang agak lebih tradisional, bahkan saya harus bertengkar dengan bahasa yang adil untuk mengatasi kurangnya
else
bagian untukif
pernyataan:Secara internal ia menghasilkan semua nomor urutan dan menyimpannya di tumpukan, lalu muncul final
1
dan menampilkan ketinggian tumpukan.sumber
2<x
dan menyingkirkank
. Kalau-kalau Anda ingin byte kembali setelah empat tahun. : Dbrainfuck ,
5956 byteCobalah online! (Sedikit dimodifikasi untuk kemudahan penggunaan)
Input dan output sebagai kode karakter. Ini lebih berguna dengan sel berukuran sewenang-wenang, tetapi masih dapat bekerja dengan nilai kecil dalam ukuran sel terbatas.
Bagaimana itu bekerja
sumber
Hexagony ,
4844 byteCobalah online!
Diperluas:
Perhatikan bahwa ini gagal1
karena uhh ... alasan . Jujur, saya tidak begitu yakin bagaimana ini bekerja lagi. Yang saya tahu adalah bahwa kode untuk angka ganjil dijalankan mundur untuk angka genap? Entah bagaimana?Versi baru jauh lebih bersih dari yang sebelumnya, tetapi memiliki beberapa arah lebih banyak dalam perbandingan dan juga berakhir dengan kesalahan divide-by-zero. Satu-satunya kasus itu tidak kesalahan adalah ketika itu benar-benar menangani
1
dengan benar.sumber
If a number < 2 is input ... output does not matter.
: o)C,
7069 karakterCukup sederhana, tidak ada trik.
Membaca input dari stdin.
sumber
Q, 46
sumber
(#)1_(1<){(1+3*x;x%2)0=x mod 2}\
Ruby 1.9, 49 karakter
Rubyfied Valentin CLEMENT's menjawab Python , menggunakan sintaks lambda yang stabby. Sqeezed itu menjadi satu pernyataan untuk menambah keterbacaan.
Beberapa overhead karena Ruby, tidak seperti Python, tidak senang mencampur angka dengan boolean.
sumber
C ++ (
5148)Ini adalah fungsi rekursif yang melakukan ini; masukan bacaan datang secara terpisah.
Saya yakin saya bisa melakukan semacam "dan / atau" trik dengan
== 0
barang - barang itu, tetapi saya tidak tahu caranya.sumber
==0
dan menukar sisi kondisionaln==1
karena saya tentukan dalam pertanyaan bahwa jumlahnya selalu lebih besar dari 1n==1
adalah kasus rekursi dasar. Menempatkan din==2
sana tidak akan meningkatkan skor apa pun.return~-n?
dan menukar sisi bersyaratn==1
==n<2
.~ - ~! (Tidak Ada Komentar) -
7153Bahasa ini jelas bukan yang terbaik untuk bermain golf karena tidak memiliki banyak fungsi asli, tetapi itulah keindahannya.
Pertama, atur
'''
input Anda. Fungsi''
tersebut kemudian dapat dipanggil dengan%
input dan akan mengembalikan jawabannya, seperti:'''=~~~~~:''&%:
Ini akan kembali
~~~~~
. Ini sebenarnya berfungsi untukn==1
(itu loop selamanya dengann==0
).Seperti biasa dengan bahasa ini, tidak diuji.
sumber
JavaScript (ES6) - 29 Karakter
Membuat fungsi
f
yang menerima argumen tunggal dan mengembalikan jumlah iterasi.JavaScript - 31 Karakter
Mengasumsikan bahwa input berada dalam variabel
n
dan membuat variabelc
yang berisi jumlah iterasi (dan juga akan outputc
ke konsol sebagai perintah terakhirnya).sumber
Perl 6, 40 byte
Metode fungsi rekursif, sesuai Valentin CLEMENT dan daniero : 40 karakter
Metode daftar malas: 32 karakter
sumber
> <>,
27 2623 byteSeperti jawaban>> lainnya, ini membangun urutan pada tumpukan. Setelah urutan mencapai 2, ukuran tumpukan adalah jumlah langkah yang diambil.
Berkat @Hohmannfan, tersimpan 3 byte dengan metode komputasi yang sangat cerdas secara langsung. Rumus yang digunakan untuk menghitung nilai selanjutnya dalam urutan adalah:
Fraksi memetakan angka genap menjadi 0,5, dan angka ganjil menjadi 3. Mengalikan dengan
n
dan menambahkann%2
melengkapi perhitungan - tidak perlu memilih nilai berikutnya sama sekali!Sunting 2: Ini versi pre- @ Hohmannfan:
Kuncinya di sini adalah bahwa keduanya
3n+1
dann/2
dihitung pada setiap langkah dalam urutan, dan yang akan dihapus dari urutan dipilih sesudahnya. Ini berarti bahwa kode tidak perlu di-branch sampai 1 tercapai, dan perhitungan urutannya bisa hidup pada satu baris kode.Sunting: Memotong karakter lain setelah menyadari bahwa satu-satunya bilangan bulat positif yang dapat mengarah ke 1 adalah 2. Karena output dari program tidak masalah untuk input <2, pembuatan urutan dapat berakhir ketika 2 tercapai, meninggalkan ukuran tumpukan menjadi jumlah persis langkah yang diperlukan.
Versi sebelumnya:
sumber
\::2%:@5*1+2,*+:2=?