The Kata Fibonacci tak terbatas adalah tertentu, urutan yang tak terbatas digit biner, yang dihitung dengan Rangkaian diulang kata-kata biner yang terbatas.
Mari kita mendefinisikan bahwa kata Fibonacci-jenis urutan (atau FTW urutan ) adalah setiap urutan ⟨W n ⟩ yang terbentuk sebagai berikut.
Mulai dengan dua array acak angka biner. Mari kita panggil array ini W -1 dan W 0 .
Untuk setiap n> 0 , misalkan W n ≔ W n-1 ∥ W n-2 , di mana ∥ menunjukkan penggabungan.
Konsekuensi dari definisi rekursif adalah bahwa W n selalu awalan W n + 1 dan, karena itu, semua W k sehingga k> n . Dalam arti, ini berarti urutan ⟨W n ⟩ konvergen untuk kata yang tak terbatas.
Secara formal, misalkan W ∞ menjadi satu-satunya susunan tak hingga sehingga W n adalah awalan W ∞ untuk semua n ≥ 0 .
Kami akan menyebut kata tak terbatas yang dibentuk oleh proses di atas sebagai FTW tak terbatas .
Tugas
Tulis sebuah program atau fungsi yang menerima dua kata biner W -1 dan W 0 sebagai input dan mencetak W ∞ , mematuhi aturan berikut, tambahan, berikut:
Anda dapat menerima kata-kata dalam urutan apa pun; sebagai dua array, array array, dua string, sebuah array string, atau string tunggal dengan pembatas pilihan Anda.
Anda dapat mencetak digit kata tak terbatas baik tanpa pembatas atau dengan pembatas yang konsisten antara setiap pasangan digit yang berdekatan.
Untuk semua tujuan, asumsikan kode Anda tidak akan pernah kehabisan memori, dan bahwa tipe datanya tidak meluap.
Secara khusus, ini berarti bahwa setiap output ke STDOUT atau STDERR yang merupakan hasil dari crash akan diabaikan.
Jika saya menjalankan kode Anda di komputer saya (Intel i7-3770, 16 GiB RAM, Fedora 21) selama satu menit dan mengirimkan hasilnya
wc -c
, harus mencetak setidaknya satu juta digit W dig untuk (W -1 , W 0 ) = (1, 0) .Aturan standar kode-golf berlaku.
Contoh
Misalkan W -1 = 1 dan W 0 = 0 .
Kemudian W 1 = 01 , W 2 = 010 , W 3 = 01001 , W 4 = 01001010 … dan W ∞ = 010010100100101001010… .
Ini adalah yang kata Fibonacci tak terbatas.
Uji kasus
Semua kasus uji berisi 1.000 digit pertama FTW tak terbatas.
Input: 1 0
Output: 0100101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010100100101001001
Input: 0 01
Output: 0100101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010100100101001001
Input: 11 000
Output: 0001100000011000110000001100000011000110000001100011000000110000001100011000000110000001100011000000110001100000011000000110001100000011000110000001100000011000110000001100000011000110000001100011000000110000001100011000000110000001100011000000110001100000011000000110001100000011000110000001100000011000110000001100000011000110000001100011000000110000001100011000000110001100000011000000110001100000011000000110001100000011000110000001100000011000110000001100000011000110000001100011000000110000001100011000000110001100000011000000110001100000011000000110001100000011000110000001100000011000110000001100000011000110000001100011000000110000001100011000000110001100000011000000110001100000011000000110001100000011000110000001100000011000110000001100011000000110000001100011000000110000001100011000000110001100000011000000110001100000011000000110001100000011000110000001100000011000110000001100011000000110000001100011000000110000001100011000000110001100000011000000110001100000011000110000001100000011
Input: 10 010
Output: 0101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010100100101001001010
Input: 101 110
Output: 1101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101101011101011101101011101011101101011101
Jawaban:
Pyth, 8 byte
Masukan dalam formulir
"W-1", "W0"
.Bukti penyelesaian:
Bukti kebenaran:
Ini adalah seri yang dihasilkan secara internal. Itu dicetak dalam rangkaian oleh program.
Bandingkan dengan yang berikut, dicetak dalam penggabungan, yang hanya berupa string yang ditambahkan ke string sebelumnya pada setiap langkah:
Kami ingin membuktikan ini setara.
Jelas, mereka sama melalui beberapa langkah pertama. Mari kita bandingkan setelah sedikit:
Kita melihat bahwa pasangan string bergantian bentuk:
Di mana a dan b adalah urutan arbitrer pada 0s dan 1s. Mari kita lanjutkan urutannya sebentar, untuk membuktikan terus berlanjut dengan induksi:
2 langkah kemudian, itu adalah bentuk yang benar.
2 langkah kemudian, itu adalah bentuk yang benar.
Jadi dengan induksi, senar selalu cocok sekali digabung.
sumber
W0
tetapi bukannya mencetaknyaW1
mencetakW-1 || W0
, yang merupakan urutan gabungan "salah". Saya pikir ini berhasil menjadi setara, tapi saya belum menemukan bukti ...Haskell, 15 byte
Fungsi infix
%
menghasilkan string tanpa batas, yang dicetak Haskell selamanya karena Haskell keren seperti itu.Ide rekursif mirip dengan solusi Zgarb . Menulis
f
untuk fungsi%
, dan+
untuk penggabungan string, ia mengimplementasikan:String output tak terbatas dimulai dengan
w
, dan sisanya adalah hasil untuk string Fibonacci-shiftedw
danv+w
.Ini tidak masalah menghasilkan sejuta karakter dalam satu menit.
sumber
Haskell, 31 byte
Ini mendefinisikan fungsi infix
#
yang mengambil dua string dan mengembalikan string yang tak terbatas. Pemakaian:Jika saya kueri elemen juta urutan yang ditentukan oleh "1" dan "0", bahkan penerjemah online mencetak hasilnya dalam waktu kurang dari satu detik:
Penjelasan
Pada dasarnya, kita tahu itu
w#v == v#(v++w)
danw#v
mulai denganv
, dan menggunakan fakta-fakta ini untuk menentukan hasilnya. Karena Haskell malas, ini "ajaib" hanya berfungsi.sumber
Pip, 8 byte
Hei, diikat dengan Pyth!
Definisi rekursif langsung yang dipinjam dari jawaban Hasnell xnor . Dengan ruang yang ditambahkan untuk kejelasan:
Setiap program di Pip adalah fungsi implisit yang mengambil argumen command-line sebagai argumennya (ditugaskan untuk variabel
a
melaluie
) dan mencetak nilai kembalinya.O
adalah operator yang mengeluarkan dan kemudian mengembalikan operan, sehingga hal pertama yang terjadi di sini adalah argumen kedua ditampilkan (tanpa jejak baris baru).Sekarang, sintaks Lisp-terinspirasi
(f x y)
dalam Pip adalah panggilan fungsi, setara denganf(x,y)
dalam bahasa seperti C Thef
variabel mengacu pada fungsi saat ini - dalam hal ini, program tingkat atas. Dengan demikian, program secara rekursif menyebut dirinya denganb
dana.b
sebagai argumen baru.Saya terkejut menemukan bahwa pendekatan ini sangat cepat:
Diperlukan sekitar 30 detik pada mesin Ubuntu saya untuk program mencapai kedalaman rekursi maksimum, di mana saat itu telah dicetak di suatu tempat lebih dari satu miliar digit.
Solusi iteratif ini sedikit lebih cepat dan lebih sedikit memori, dengan biaya satu byte:
sumber
CJam,
1211 byteIni mengambil dua kata pada baris yang terpisah, dalam urutan yang berlawanan, misalnya
memberi
Penjelasan
Idenya adalah untuk membangun kata secara naif (dengan mengingat kata saat ini dan menambahkan yang sebelumnya ke dalamnya) dan sementara kami melakukan itu, kami mencetak apa pun yang kami tambahkan (agar tidak mengulangi awalan yang sudah dicetak) . Untuk menghindari keharusan menangani titik awal secara terpisah, kita mulai dari kata kosong, sehingga W 0 adalah hal pertama yang kita tambahkan (dan cetak).
sumber
PowerShell,
9776 BytesSunting - Umm, menulis
$e.substring($b.length)
setelah kami baru saja bergabung$a
dan$b
bersama sama dengan menulis hanya$a
... derp.Wow, verbose. PowerShell akan, secara default, mengeluarkan baris baru setiap kali Anda mengeluarkan sesuatu. Sungguh satu-satunya cara untuk menyiasatinya adalah dengan
write-host -n
(kependekan-NoNewLine
), dan itu benar-benar membunuh panjangnya di sini.Pada dasarnya, ini berulang melalui urutan, membangun
$e
sebagai "saat" W n saat kita pergi. Namun, karena kami ingin membuat kata tak terbatas alih-alih urutannya, kami memanfaatkan variabel sebelumnya untuk mencetak akhiran$a
yang terisi di loop sebelumnya. Kemudian kita mengatur variabel kita untuk putaran berikutnya dan mengulangi loop. Perhatikan bahwa ini mengharapkan input untuk secara eksplisit dibatasi sebagai string, jika tidak+
operator akan digunakan untuk aritmatika alih-alih penggabungan.Contoh:
sumber
APL,
2418Menggunakan formulasi xnor diizinkan untuk memangkas beberapa karakter.
Pada mesin infinite dalam waktu tak terbatas itu sebenarnya akan mencetak W ∞ tiga kali — pertama secara bertahap saat menjalankan loop, dan kemudian dua kali sebagai hasil dari seluruh ekspresi ketika
⍣≡
operator fixpoint akhirnya kembali.Ini tidak terlalu cepat tetapi cukup cepat. Di GNU APL:
sumber
⍣≡
; kedengarannya sangat bermanfaat.Bash murni, 58
Saya kehabisan memori sebelum 1 menit, tetapi memiliki banyak digit saat itu - setelah 10 detik saya memiliki 100 juta digit:
sumber
Mathematica, 56 byte
sumber
C, 76 (gcc)
Ini adalah printer rekursif yang cukup mudah, diimplementasikan sebagai fungsi bersarang (ekstensi GNU C tidak didukung oleh dentang) untuk menghindari keharusan berpindah
v
- pindah .p(n)
mencetak W n-2 , di mana W -1 dan W 0 harus disediakan div[1]
danv[2]
. Ini awalnya panggilanp(4)
untuk mencetak W 2 . Kemudian loop: itu panggilanp(3)
untuk mencetak W 1 , membuat output lengkap W 2 W 1 , yaitu W 3 . Kemudian panggilanp(4)
untuk mencetak W 2 , membuat output lengkap W4 , dll. Kinerja sedikit lebih baik daripada jawaban saya sebelumnya: Saya melihat nilai 1875034112 dalam satu menit.C, 81 (dentang)
Ini adalah pendekatan yang sama sekali berbeda dari yang di atas yang saya rasa layak untuk dipertahankan, meskipun skornya lebih buruk.
Ini memiliki semua jenis perilaku yang tidak terdefinisi, terutama untuk bersenang-senang. Ini bekerja dengan dentang 3.6.2 di Linux dan dengan dentang 3.5.2 di Cygwin untuk kasus uji dalam pertanyaan, dengan atau tanpa opsi baris perintah khusus. Itu tidak rusak ketika optimisasi diaktifkan.
Itu tidak bekerja dengan kompiler lain.
Saya menerima kata-kata sebagai argumen baris perintah dalam format string.
Saya menggunakan baris baru sebagai pembatas yang konsisten.
Saya mengakses di
s
luar batas. Ini pasti harus diakhiri dengan segfault atau pelanggaran akses di beberapa titik.s
kebetulan ditempatkan di akhir segmen data, sehingga tidak akan mengganggu variabel lain dan memberikan output yang salah sebelum segfault itu. Semoga.Pengujian menggunakan
{ ./program 1 0 | tr -d '\n' & sleep 60; kill $!; } | wc -c
, saya mendapatkan 1816784896 digit dalam satu menit di mesin saya ketika program dikompilasi-O3
, dan 1596678144 ketika dikompilasi dengan optimisasi diaktifkan.Ungolfed, no UB, dengan penjelasan:
sumber
s[]
Trik jahat Anda bekerja dengan baik dengan dentang (baru saja menginstalnya). Saya cukup terkejut ini benar-benar berfungsi. Untuk semua tujuan, asumsikan kode Anda tidak akan pernah kehabisan memori, dan bahwa tipe datanya tidak meluap. Sayangnya, itu berarti hanya mencetak W97 tidak dianggap valid. Bisakah Anda meneleponp
secara rekursif? Itu akan menghilangkan kebutuhan untukmain
.p
ke dalamp
dirinya sendiri tanpa menambahkan lebih banyak kode, tetapi jika saya menemukan cara saya akan mengedit lagi.Javascript (53 byte)
Input harus berupa string dan bukan angka (
'0'
dan bukan hanya0
).sumber
Perl 5,
455549 byte44 byte, ditambah 1 untuk
-E
bukan-e
Gunakan sebagai contoh
Ini akan mencetak perkiraan berurutan ke W ∞ dan dengan demikian, jika Anda menunggu cukup lama, mencetak, pada baris keluaran terakhir, W ∞ dengan panjang yang diinginkan, seperti yang diperlukan. Digit kata digabungkan tanpa pembatas.
Karena aku pada Windows, saya diuji untuk "setidaknya satu juta digit W ∞ " persyaratan dengan menjalankan dengan output diarahkan ke file dan membunuh itu setelah sekitar 59 detik, kemudian menjalankan GnuWin32 ini
wc -L
, yang dicetak 701.408.733.Memperbarui:
OP mengklarifikasi dalam komentar tentang jawaban ini (dan mungkin saya seharusnya menyadari juga) bahwa output tambahan sebelum W ∞ mendiskualifikasi hal di atas. Jadi alih-alih inilah solusi 55-byte yang hanya mencetak W ∞ :
Digunakan dengan cara yang sama, tetapi dengan argumen dalam urutan terbalik , dan tidak memerlukan
-E
:Tidak diragukan lagi itu bisa di-golf lebih lanjut, tetapi saya tidak tahu bagaimana melakukannya sekarang.
Pembaruan lebih lanjut:
Dennis mencukur lima byte dengan menggunakan
-a
(membaca sehingga<>
menghapussub
) dan menugaskan kembali parameter yang diteruskan keprint
pada akhirredo
blok:Dengan
-ane
dan membaca dari<>
(kedua input pada satu baris, dipisahkan oleh ruang, dalam urutan terbalik); 48 + 2 byte:Dan, berdasarkan itu, saya mencukur satu byte lagi (sama seperti di atas, tetapi sekarang inputnya dalam urutan yang benar); 47 + 2 byte:
sumber
REXX , 48
ftw.rex
exec ftw.rex 0 1
Saat ini tidak dapat menguji kinerja karena saya menggunakan kompiler online untuk menulisnya. "Selamanya" dapat diganti dengan angka apa pun sebagaimana nomor ftw tercetak (angka + 2).
Saya juga menulis solusi kecil (berantakan) di Prolog. Tidak tahu bagaimana cara menguji kinerja dengan yang satu ini, tetapi mungkin itu mengerikan.
sumber
Python 2, 67 byte
Menerima input sebagai pasangan string yang dipisahkan koma:,
"1","0"
untuk contoh dalam pertanyaan.Tidak ada juru bahasa online karena loop tak terbatas itu buruk.
Buffered output membuat saya mendapatkan banyak byte. :(Terima kasih Dennis untuk menunjukkan bahwa 1 digit per baris valid.Pengaturan waktu pada mesin saya (secara signifikan lebih lemah):
sumber
Dyalog APL, 9
Ini digunakan
∇
untuk mendefinisikan fungsi rekursif. Ini adalah terjemahan langsung dari jawaban Python 3 xnor ini . Dibutuhkan W 0 sebagai kanan, dan W −1 sebagai argumen kirinya, keduanya harus vektor karakter.sumber
Minkolang 0,11 , 62 byte
Coba di sini. Mengharapkan input dalam urutan W 0 , W -1 dengan spasi di antaranya.
Penjelasan
Meta-penjelasan untuk yang berikut adalah bahwa pada titik waktu ini, kita memiliki dua angka diikuti oleh string "0" dan "1" tanpa pemisahan. Jika panjang W 0 dan W -1 adalah
a
danb
, masing-masing, maka dua angka di depan tumpukan yang<a+b>
dan<a>
, dalam urutan itu. Kata yang dibentuk dengan menggabungkan W i + 1 dan W i , yaitu W i + 1 + W i , sama dengan 2 * W i + 1 - W i . Jadi kode berikut menduplikasi stack (2 * W i +1 ), muncul di bagian atas<a>
elemen (- W i ), dan kemudian menggantikan<a+b>
dan<a>
dengan penggantinya,<a+2b>
dan<b>
.sumber
Python 3, 32
Ide rekursif yang sama dengan jawaban Haskell saya , kecuali awalannya dicetak karena Python tidak dapat menangani string tanpa batas.
Menggunakan trik dari Sp3000 untuk mencetak tanpa spasi dengan meletakkan string sebagai
end
argumen di Python 3sumber
Perl, 32 byte
Menghitung shebang sebagai dua, input diambil dari stdin, spasi dipisahkan sebagai W 0 , W -1 . Output untuk 1MB kali pada ~ 15 ms, yang sebagian besar dapat dikaitkan dengan peluncuran juru bahasa.
Contoh Penggunaan
sumber
Prolog, 69 byte
Input contoh: p ('1', '0')
Belum menemukan cara untuk menghapus penulisan tambahan.
Harus bisa memperbaiki ini jika saya tahu bagaimana melakukannya.
sumber