Karena angka dan urutan Fibonacci sepertinya merupakan subjek yang populer untuk kode golf, saya pikir itu mungkin merupakan tantangan yang menyenangkan untuk kode golf dengan angka Keith .
Jadi saya mengusulkan tantangan yaitu membuat fungsi yang mengambil bilangan bulat dan memberikan kembali benar atau salah tergantung pada nomor apakah itu nomor Keith atau tidak.
Lebih lanjut tentang nomor Keith
Dalam matematika rekreasional, angka Keith atau angka repfigit (kependekan dari digit mirip Fibonacci berulang) adalah angka dalam urutan bilangan bulat berikut: 14, 19, 28, 47, 61, 75, 75, 197, 742, 1104, 1537, 2208, 2580, ...
Numberphile memiliki video yang menjelaskan cara menghitung nomor Keith. Tetapi pada dasarnya Anda mengambil digit angka. Tambahkan bersama-sama dan kemudian ambil angka terakhir dari nomor asli dan tambahkan ke jumlah perhitungan, bilas dan ulangi. Dan contoh untuk membuatnya jelas.
14
1 + 4 = 5
4 + 5 = 9
5 + 9 = 14
Memasukkan
Bilangan bulat.
Keluaran
Benar jika nomor tersebut adalah nomor Keith. Salah jika tidak ..
true
/false
atau dapatkah itu sesuatu yang benar / salah ?Jawaban:
GolfScript (
3125 karakter)Input sebagai bilangan bulat di atas tumpukan. Output adalah 0 (salah) atau 1 (benar). Demo online yang mencantumkan nomor Keith hingga 100.
sumber
0>
. Sayangnya saya hanya dapat memberi +1 satu kali.Python (
7875)n=n[1:]+[sum(n)]
melakukan semua keajaiban. Dibutuhkan setiap item kecuali item pertaman
, menempel pada jumlahn
(dengan item pertama), lalu mengaturnya menjadin
.Saya berharap Anda bisa memanggil
list
bilangan bulat dan memiliki digit yang terpisah.Mengembalikan
False
semua input di bawah 10. Dapat lebih pendek 8 karakter jika dikembalikanTrue
.sumber
n[0]
bukann[-1]
.print 9<a==n[0]
.n=n[1:]+[sum(n)]
bisa menjadin=n[1:]+sum(n),
GolfScript,
3229 karakterImplementasi GolfScript yang dapat diuji secara online . Input diberikan sebagai elemen teratas pada stack dan mengembalikan masing-masing 0 (mis. Salah) atau 1.
sumber
APL,
36343936332927Keluaran
1
jika Keith,0
jika tidakGolfScript menyerang lagi !!
Edit
Menggunakan Pengurangan Hak (
⊢/
) alih-alih Take minus 1 (¯1↑
), langsung menyimpan 1 char dan secara tidak langsung menghemat 1 dari Disclose (⊃
)Penjelasan
⍎¨⍕x←⎕
mengambil input yang dievaluasi (diperlakukan sebagai angka) dan menetapkannya untukx
. Mengubahnya menjadi array karakter (alias "string" dalam bahasa lain), dan loop melalui masing-masing karakter (digit), mengubahnya menjadi angka. Jadi ini menghasilkan array angka digit.{(∇⍣(x>⊢/⍵))⍵,+/⍵↑⍨-⍴⍕x}
adalah fungsi "loop" utama:+/⍵↑⍨-⍴⍕x
mengambil angka terakhir⍴⍕x
(no. digitx
) dari array dan menjumlahkannya.⍵,
menggabungkannya ke akhir array.(x>⊢/⍵)
periksa apakah angka terakhir pada array (yang belum+/⍵↑⍨-⍴⍕x
digabungkan) lebih kecil darix
dan mengembalikan1
atau0
∇⍣
mengeksekusi fungsi ini pada array baru yang berkali-kali. Jadi jika angka terakhir lebih kecil darix
, fungsi ini berulang. Jika tidak, kembalikan saja array yang baruSetelah menjalankan fungsi, array berisi jumlah sampai ke titik di mana 2 angka lebih besar atau sama dengan
x
(misalnya14
akan menghasilkan1 4 5 9 14 23
,13
akan menghasilkan1 3 4 7 11 18 29
)Akhirnya memeriksa apakah setiap angka sama dengan
x
dan output jumlah dari biner yang dihasilkan Himpunan.Edit
Menambahkan 2 karakter :-( untuk membuat output
0
jika inputnya satu digitSunting lagi
Penjelasan
Fungsi sekarang menjatuhkan angka pertama (
1↓
) dari array alih-alih mengambil yang terakhir⍴⍕x
(↑⍨-⍴⍕x
).Namun, pendekatan ini membuat
1=
tidak memadai untuk menangani angka satu digit. Jadi sekarang menjatuhkan nomor terakhir dari array sebelum memeriksa kesetaraanx
, menambahkan 1 karakterAnda dapat menebaknya: EDIT
Bandingkan
x
dengan item yang baru ditambahkan daripada item terakhir yang lama, jadi jatuhkan item pertama (bukan yang terakhir) sebelum memeriksa kesetaraan kex
sudah mencukupi, menyimpan tanda minus. Menghemat 3 lainnya dengan menggunakan bentuk lain dari operator Power (⍣
)Dan jawaban 25-char gs muncul (Orz)
Sunting terakhir
Tidak percaya saya melewatkan itu.
Tidak bisa bermain golf lagi.
sumber
x∊{1↓⍵,+/⍵}⍣{x≤⊃⍺}⍎¨⍕x←⎕
. Dalam fungsi daya,⍺
adalah nilai "setelah".Common Lisp, 134
CL kadang-kadang bisa sangat tidak bisa dibaca.
Beberapa pemformatan untuk menghindari pengguliran horizontal:
Uji:
sumber
F # - 184 karakter
Saya harap tidak apa-apa bahwa saya akan berpartisipasi dalam tantangan saya sendiri.
Sunting Memperbaiki bug terkait jumlah kecil.
sumber
K, 55
.
sumber
PowerShell:
12012812311111097 97$i=read-host
mengambil input dari pengguna, menyimpannya dalam $ i.$j=(
...)-split''|?{$_}
memecah digit dari $ i ke dalam array dan menyimpannya dalam $ j.While($x-lt$i)
menetapkan loop seperti Fibonnaci berikut untuk dijalankan hingga variabel penjumlahan, $ x, mencapai atau melebihi $ i.$x=0
nol $ x, jadi siap digunakan untuk menjumlahkan (diperlukan ketika loop kembali).$j|%{$x+=$_}
menggunakan ForEach-Object loop untuk menambahkan nilai dari $ j menjadi $ x.$null,$j=$j+$x
menggeser nilai dalam $ j ke kiri, membuang yang pertama, sambil menambahkan $ x.$x-eq$i
setelah loop sementara selesai, menguji apakah nilai penjumlahan, $ x, sama dengan nilai awal, $ i - umumnya menunjukkan Nomor Keith.-and$x-gt9
membatalkan angka satu digit, angka nol, dan angka negatif, yang tidak boleh menjadi Angka Keith.Script ini agak "berantakan". Ini dapat dengan anggun menangani $ i dan $ j yang tersisa, tetapi Anda harus menghapus $ x di antara run.
sumber
-ne''
sehingga adil?{$_}
.$i=read-host;$j=$i-split''|?{$_}'
dengan$j=($i=read-host)-split''|?{$_}
.Ruby, 82
Tersangka Python adalah alat yang lebih baik untuk yang ini.
sumber
C, 123
tes melalui harness:
memberi:
sumber
i=(i+n-1)%n;t=g[i];g[i]=s;s=s*2-t;
dengani+=n-1;t=g[i%n];g[i%n]=s;s+=s-t;
dan menyimpan dua karakter.R, 116
Rip-off Python:
sumber
Perl, 90
Latihan yang menyenangkan! Saya tahu ini posting lama tapi saya perhatikan perl tidak ada!
Saya yakin saya dapat meningkatkan cara saya membangun ini dari mencerna tanggapan lain lebih menyeluruh, jadi saya kemungkinan akan mengunjungi kembali ini!
sumber
Smalltalk - 136 char
Kirim blok ini
value:
sumber
Jawa - 1437
sumber
Python3 104
Dan itu adalah fungsi;)
sumber
Python - 116 karakter
Bukan benar-benar ahli codegolf, jadi begitulah - percobaan pertama saya.
Buat 2 perubahan untuk suatu fungsi:
print
kereturn
x
sebagai parameterPS I second @ beary605- menambahkan built-in untuk memisahkan digit / karakter / apa pun.
sumber
Ruby (dengan OOP)
sumber