pengantar
Urutan Gijswijt ( A090822 ) terkenal benar-benar lambat. Menggambarkan:
- 3 pertama muncul dalam istilah ke-9 (baik-baik saja).
- 4 pertama muncul dalam jangka waktu 220 (jauh, tapi layak).
- 5 pertama muncul pada (kurang lebih) istilah 10 ^ (10 ^ 23) (tidak ada).
- Tidak ada yang benar-benar tahu di mana 6 yang pertama ... diduga itu ada di ...
2 ^ (2 ^ (3 ^ (4 ^ 5)))) istilah th.
Anda dapat berasumsi bahwa Anda tidak perlu berurusan dengan nomor dua digit.
Urutannya dibuat seperti ini:
- Istilah pertama adalah 1.
- Setiap istilah setelah itu adalah jumlah "blok" berulang sebelumnya (jika ada beberapa "blok" berulang, jumlah terbesar blok berulang digunakan).
Untuk memperjelas, berikut adalah beberapa istilah pertama.
1 -> 1, 1
(satu blok berulang ( 1
), sehingga digit yang direkam adalah 1
)
1, 1 -> 1, 1, 2
(dua blok berulang ( 1
), sehingga digit yang direkam adalah 2
)
1, 1, 2 -> 1, 1, 2, 1
(satu blok berulang ( 2
atau 1, 1, 2
), sehingga digit yang direkam adalah 1
)
1, 1, 2, 1 -> 1, 1, 2, 1, 1
(Anda mendapatkan ide)
1, 1, 2, 1, 1 -> 1, 1, 2, 1, 1, 2
1, 1, 2, 1, 1, 2 -> 1, 1, 2, 1, 1, 2, 2
(dua blok berulang ( 1, 1, 2
), sehingga digit yang direkam adalah 2
)
Tugas
Tugas Anda adalah, sebagaimana dinyatakan dalam pertanyaan, untuk menghasilkan n digit dari urutan Gijswijt.
Instruksi
- Input akan berupa bilangan bulat
n
. - Kode Anda dapat menampilkan digit dalam bentuk apa pun (daftar, banyak keluaran, dll.).
Ini adalah kode golf, jadi kode terpendek dalam byte menang.
._
fungsi dan fungsi berguna lainnya di Pyth.CJam,
33313027 byteTerima kasih kepada Peter Taylor untuk menghemat 1 byte.
Uji di sini.
Penjelasan
sumber
CJam (
30 29 2724 bytes)Demo online
Ini sangat banyak upaya bersama dengan Martin.
e`
) untuk mengidentifikasi pengulangan adalah milik MartinW$
untuk menyederhanakan manajemen tumpukan$W>+
casing khusus, seperti yang dijelaskan dalam diseksi di bawah iniPendekatan 30 byte pertama saya:
Demo online
Pembedahan
sumber
Haskell, 97 byte
Baris ketiga mendefinisikan fungsi anonim yang mengambil bilangan bulat dan mengembalikan daftar bilangan bulat. Lihat itu dalam aksi.
Penjelasan
Fungsi helper
f
membangun urutan secara terbalik, dengan memeriksa secara berulang apakah urutan sebelumnya dimulai dengan blok yang diulang.k
adalah jumlah pengulangan, danp
panjang blok.sumber
Pyth,
4138 byteCobalah online!
sumber
Retina ,
6660 byteInput adalah bilangan bulat yang digunakan
!
sebagai digit (meskipun itu dapat diubah menjadi karakter non-numerik lainnya). Output hanyalah serangkaian angka.Cobalah online! (Atau, untuk kenyamanan inilah versi yang mengambil input desimal. )
Untuk tujuan pengujian, ini dapat dipercepat banyak dengan modifikasi kecil, yang memungkinkan pengujian input 220 dalam waktu kurang dari satu menit:
Cobalah online! ( Versi desimal. )
Jika Anda ingin menguji angka yang bahkan lebih besar, yang terbaik adalah memberi makan beberapa input besar dan menempatkan
:
setelah awal+
. Ini akan membuat Retina mencetak urutan saat ini setiap kali selesai menghitung digit baru (dengan semua digit off-by-one).Penjelasan
Solusinya terdiri dari substitusi regex tunggal, yang diterapkan pada input berulang kali sampai hasilnya berhenti berubah, yang dalam hal ini terjadi karena regex tidak lagi cocok. The
+
di awal memperkenalkan loop ini. The1
batas yang menceritakan Retina hanya untuk menggantikan pertandingan pertama (ini hanya relevan untuk iterasi pertama). Di setiap iterasi, tahap mengganti satu!
(dari kiri) dengan digit berikutnya dari urutan.Seperti biasa, jika Anda memerlukan primer pada kelompok penyeimbang, saya merujuk Anda ke jawaban SO saya .
Ini adalah versi regex yang beranotasi. Perhatikan bahwa tujuannya adalah untuk menangkap jumlah maksimum blok berulang dalam kelompok
1
.Akhirnya, setelah semua ini dilakukan, kami menulis kembali
$1
(dengan demikian menghapus!
) serta jumlah tangkapan dalam grup$#1
yang sesuai dengan jumlah maksimum pengulangan.sumber
Ruby, 84 byte
Jawaban Retina mengilhami saya untuk melakukan solusi berbasis regex untuk menemukan urutan terbaik alih-alih entah bagaimana menghitung urutan dalam array, tetapi dengan sedikit jenius (tampilan negatif dengan quantifier sepertinya tidak diizinkan di Ruby, jadi saya ragu Saya bisa langsung menjawab jawaban Retina)
Diberikan urutan yang sudah dibuat
s
, memetakan semuai
dari1
kes.length
(n
digunakan dalam kasus ini untuk menyimpan byte sejakn>=s.length
) dan kemudian menggunakan regex ini untuk membantu menghitung jumlah pengulangan suatu urutan dengan panjangi
:Jika kecocokan ditemukan dengan panjang itu, ia menghitung jumlah pengulangan dengan membagi panjang kecocokan yang diberikan
$&
dengani
, panjang dari urutan berikutnya; jika tidak ditemukan kecocokan, itu diperlakukan sebagai1
. Fungsi kemudian menemukan jumlah pengulangan maksimum dari pemetaan ini dan menambahkan nomor itu ke akhir string.sumber