Anda mungkin akrab dengan urutan Fibonacci di mana dua istilah pertama adalah 0, 1
(atau kadang-kadang 1, 1
) dan setiap istilah setelah itu adalah jumlah dari dua sebelumnya. Dimulai seperti ini:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
Kadang-kadang, urutan berisi angka-angka yang memiliki pola tertentu yang saya temukan menarik: perbedaan antara setiap pasangan digit yang berdekatan sama dengan pasangan lainnya. Misalnya, dalam urutan yang dimulai dengan 0, 1
, istilah ke 18 adalah 987
. 9-8=1
dan 8-7=1
. Saya agak puas.
Tantangan
Diberi dua nilai awal F(0)
dan F(1)
, output setiap angka dalam urutan yang dihasilkan oleh F(n) = F(n-1) + F(n-2)
yang memenuhi kriteria berikut:
- Perbedaan antara setiap pasangan digit yang berdekatan adalah sama dengan pasangan lainnya
- Paling tidak panjangnya tiga digit (angka 1 dan 2 angka tidak menarik untuk pola ini)
Memasukkan
- Dua bilangan bulat non-negatif kurang dari 10 ** 10 (10 miliar)
Keluaran
- Semua bilangan bulat yang kurang dari 10 ** 10 dan memenuhi kriteria di bagian Tantangan
- Dapat diterima untuk digit keluaran lebih besar dari 10 ** 10 tetapi itu bukan keharusan
- Mengingat bahwa angka berulang memenuhi pola (misalnya
777
), ada kemungkinan bahwa ada angka tak terbatas yang memenuhi kriteria tetapi program Anda tidak diharuskan untuk menghasilkan selamanya - Jika tidak ada bilangan bulat seperti itu, output apa pun yang Anda inginkan asalkan bukan angka (tidak ada, null, array kosong, pesan kesalahan, wajah sedih, dll.)
- Jika angka yang cocok dengan pola muncul lebih dari satu kali dalam urutan, Anda dapat menampilkannya sekali atau sebanyak yang terjadi
- Jika ada input yang memenuhi kriteria, itu harus dimasukkan dalam output
Aturan
- Input dan Output dapat dalam format standar apa pun
- Celah standar dilarang
- Ini adalah kode-golf sehingga kode terpendek dalam byte menang
Contoh / Kasus Uji
Input , Output
[1,10] , []
[0,1] , [987]
[2,1] , [123]
[2,3] , [987]
[61,86] , [147]
[75,90] , [420]
[34,74] , [1234]
[59,81] , [2468]
[84,85] , [7531]
[19,46] , [111]
[60,81] , [222]
[41,42] , [333]
[13,81] , [444]
[31,50] , [555]
[15,42] , [666]
[94,99] , [777]
[72,66] , [888]
[3189,826] , [888888888]
[15,3] , [159,258]
[22,51] , [321,1357]
[74,85] , [159,4444]
[27,31] , [147,11111]
[123,0] , [123,123,123,246,369]
[111,0] , [111,111,111,222,333,555,888]
[111,222] , [111,222,333,555,888]
[33345,692] , [987654321]
[3894621507,5981921703] , [9876543210]
[765432099,111111111] , [111111111,876543210,987654321]
[1976,123] , [123, 2222, 4321, 6543, 45678]
[1976, 123] -> [123, 2222, 4321, 6543, 45678]
,[3189, 826] -> [888888888]
,[33345, 692] -> [987654321]
Jawaban:
MATL , 14 byte
Terima kasih kepada Emigna karena menunjukkan kesalahan, sekarang diperbaiki
Infinite loop yang menampilkan angka ketika ditemukan.
Cobalah online! Perhatikan bahwa dalam juru bahasa online hasilnya ditampilkan setelah batas waktu 1 menit.
Penjelasan
Biarkan
F(n)
danF(n+1)
tunjukkan dua istilah umum berturut-turut dari deret Fibonacci. Setiap iterasi dari loop dimulai dengan stack yang mengandungF(n)
,F(n+1)
untuk beberapan
.sumber
05AB1E ,
171615 byteCobalah online!
Penjelasan
sumber
JavaScript (ES6),
858481 byteCobalah online!
Menguji digit yang berdekatan
Baik x dan d diinisialisasi ke fungsi anonim, yang memaksa
NaN
untuk semua operasi aritmatika mereka terlibat. Iterasi pertamasome()
selalu memberi(d = [function] - n) === NaN
dan(r = [function] - d) === NaN
(falsy). Pada iterasi kedua, kita memilikid = x - n
(bilangan bulat) dan(r = NaN - d) === NaN
(falsy lagi). Mulai dari iterasi ketiga, r diatur ke bilangan bulat yang bukan nol jika perbedaan antara digit # 3 dan digit # 2 tidak sama dengan perbedaan antara digit # 2 dan digit # 1.Angka p memenuhi kriteria yang diperlukan jika dan hanya jika
some()
falsy (semua digit yang berdekatan memiliki perbedaan yang sama) dan nilai akhir r adalah 0 (setidaknya ada 3 iterasi). Ini memberi!false / 0 === true / 0 === Infinity
(kebenaran).Kami mungkin memiliki:
!true / r
dengan r> 0 atau r <0 , yang memberifalse / r === 0
(falsy)!false / NaN
, yang memberitrue / NaN === NaN
(falsy)Kondisi terhenti
Rekursi berhenti ketika
p | q
dievaluasi menjadi 0 . Ini dijamin terjadi ketika p dan q mencapai nilai sekitar 10 25 yang panjangnya 84 bit. Karena JS memiliki 52 bit mantissa, 32 bit terakhir adalah nol. Jadi, bitwise 32-bit ATAU bernilai 0 .Karena laju urutan yang tumbuh cepat, ini terjadi agak cepat.
sumber
Java 8,
151144140136130 byteLoop tak terbatas mengeluarkan angka ketika menemukannya.
Cobalah online (waktu habis setelah 60 detik).
Versi 136 byte dengan menambahkan batas 10 10 (
a<1e10
):Cobalah online.
Penjelasan:
sumber
Jelly ,
20 1918 byteCobalah online!
+ƝḢ;Ɗȷ¡
menghasilkan seribu (ȷ
) istilah pertama dalam seri yang akan selalu mencukupi. Saya pikir mungkin ada cara yang lebih pendek untuk melakukan ini.+ȷ¡
menjadi dekat tetapi hanya berfungsi jika istilah pertama adalah nol.Saya mengasumsikan kita dapat mengambil dua angka secara terbalik yang memungkinkan satu byte
DIE
.Jika kami tidak diharuskan untuk mengeluarkan salah satu dari input:
Jelly , 15 byte
Cobalah online!
sumber
DIEƊ
selama proses golf.Oktaf ,
919083 byteDisimpan 7 byte berkat Luis Mendo!
Cobalah online!
Ya berhasil!
eval
dengan untuk loop di dalam untuk menyimpan beberapa byte. Melewati titik dua dan titik koma untuk menghemat beberapa. Menggunakan fakta bahwa vektor dianggap benar jika semua elemen tidak nol untuk disimpanany
atauall
.Selain itu, ini merupakan implementasi langsung Fibonacci.
sumber
Python 2 ,
10298 byteCobalah online!
Thx untuk 4 byte dari ovs
sumber
Haskell , 105 byte
Menentukan operator
(%)
yang mengembalikan daftar tanpa batas dengan semua solusi. Untuk benar-benar melihat hasilnya di stdout, kita perlu menonaktifkan buffering (atau menjalankannyaghci
dengan atau denganrunhaskell
), coba online!Penjelasan / Tidak Diundang
Fungsi
f
ini hanyalah fungsi pembantu yang mengharapkan fungsi biner dan daftar, itu berlaku fungsig
untuk semua pasangan yang berdekatan. Ini pada dasarnya sama dengan:Operator
(%)
hanyalah pemahaman daftar yang melakukan beberapa penyaringan (memastikan bahwa setidaknya ada 3 digit & bahwa digit yang berdekatan memiliki jarak yang sama):sumber
CJam , 55 byte
Cobalah online!
Pengajuan CJam pertama saya, tidak terlalu pendek tapi sangat menyenangkan. Ada saran dipersilahkan!
sumber
Stax ,
2624 byteJalankan dan debug itu
Penjelasan
Tidak sesingkat yang saya inginkan dan mungkin bisa bermain golf sedikit lebih, tetapi berhasil.
sumber
Ruby , 79 byte
Cobalah online!
sumber
Julia 0,6 ,
8681 byteCobalah online!
Cukup mudah - periksa apakah input memiliki setidaknya 3 digit (
n>99
), lalu ambil perbedaan antara setiap pasangan digit dalam angka (diff(digits(n))
), periksa bahwa panjang (endof
) seperangkat unik (∪
) perbedaan tersebut adalah 1 (yaitu semua perbedaan sama), dan jika demikian cetak nomornya. Lakukan itu untuk kedua nomor yang diberikan, kemudian panggil fungsi secara berulang dengan dua angka berikutnya.(Sayangnya, sepertinyaSekarang membebani±
memiliki prioritas lebih tinggi daripada+
, atau jika panggilan terakhir bisaa+b±a+2b
, menghemat 3 byte.)<
operator, sehingga menghemat pada byte operator dan kurung didahulukan. (Tidak dapat digunakan<
dalam kode kami, jadi atur ulangendof(...)<2
ke2>endof(...)
).Jika beberapa output asing diperbolehkan, kita bisa menyimpan 2 bytes menggunakan
@show
bukannyaprintln
, mencetakn = 987
bukan hanya987
. Kita bahkan bisa menggunakandump
untuk 1 byte lebih rendah dari itu, tetapidump
mencetak informasi jenis bersama dengan nilainya, sehingga output akan menjadiInt64 987
bukan hanya987
.sumber