Dimulai dengan string ABC
, pertimbangkan hasil berulang kali menambahkan bagian terakhir dari dirinya sendiri (menggunakan bagian yang lebih besar jika panjangnya aneh).
Kami mendapatkan perkembangan:
ABC
ABCBC
ABCBCCBC
ABCBCCBCCCBC
ABCBCCBCCCBCBCCCBC
etc...
Biarkan S
mewakili string tak terbatas yang dihasilkan (atau urutan) yang dihasilkan karena prosedur ini diulang selamanya.
Tujuan
Tujuan dalam tantangan kode ini adalah untuk menemukan indeks kemunculan pertama kali proses C
di S
.
Awalnya gampang: C
pertama kali terjadi pada index 2
, CC
at 4
, CCC
at 7
, CCCC
at 26
, tetapi CCCCC
sudah pasti indeks 27308
! Setelah itu ingatanku habis.
Pemenangnya adalah pengiriman yang benar menghasilkan indeks paling banyak dijalankan (dalam urutan, mulai dari C
). Anda dapat menggunakan segala jenis algoritma tetapi pastikan untuk menjelaskannya jika Anda tidak menggunakan kekuatan kasar dasar. Input dan output dapat dalam format yang mudah dimengerti.
Catatan Penting: Saya tidak secara resmi tahu apakah S
benar-benar berisi semua proses C
. Pertanyaan ini berasal dari yang ini di Pertukaran Matematika , di mana penulis belum menemukan CCCCCC
keduanya. Saya ingin tahu apakah ada orang di sini yang bisa. (Pertanyaan itu pada gilirannya berdasarkan pertanyaan awal saya pada topik .)
Jika Anda dapat membuktikan bahwa tidak semua proses C
terjadi S
maka Anda akan menang secara otomatis karena pertanyaan ini tidak lagi valid. Jika tidak ada yang bisa membuktikan itu atau menemukan CCCCCC
maka pemenangnya adalah orang yang bisa mendapatkan batas bawah tertinggi pada indeks CCCCCC
(atau apa pun yang tidak terpecahkan adalah jika CCCCCC
ditemukan).
Pembaruan: pujian besar untuk isaacg dan res yang ditemukan CCCCCC
pada indeks astronomi 2.124 * 10 ^ 519. Pada tingkat ini aku tidak bisa membayangkan menemukan CCCCCCC
dengan metode apa pun yang bergantung pada kekerasan. Kerja bagus kawan!
sumber
CCCCC
di indeks 27308, tetapi nanti sepertinya Anda tidak tahu di mana itu pertama kali terjadi. Apakah maksud AndaCCCCCC
?Jawaban:
CCCCCC ditemukan di 2.124 * 10 ^ 519.
Indeks Precise adalah 2124002227156710537549582070283786072301315855169987260450819829164756027922998360364044010386660076550764749849261595395734745608255162468143483136030403857241667604197146133343367628903022619551535534430377929831860918493875279894519909944379122620704864579366098015086419629439009415947634870592393974557860358412680068086381231577773140182376767811142988329838752964017382641454691037714240414750501535213021638601291385412206075763857490254382670426605045419312312880204888045665938646319068208885093114686859061215
Ditemukan oleh res, menggunakan kode (versi lama) di bawah, setelah 3,5 jam pencarian.
Di sekitar indeks itu, stringnya adalah:
...BCCBCBCCCBCCCCCCBCCB...
Untuk memverifikasi, ubah baris yang ditunjukkan dalam kode di bawah ini untuk mulai pada 2946, bukan 5. Verifikasi membutuhkan 20 detik.
Pembaruan: Program yang ditingkatkan. Program lama mencari ~ 10x lebih banyak lokasi daripada yang diperlukan.
Versi baru menemukan
CCCCCC
hanya dalam 33 menit.Cara kode bekerja: Pada dasarnya, saya hanya melihat daerah yang sesuai dengan ujung string tambahan, dan menghitung huruf dengan melihat secara rekursif kembali ke string asli. Perhatikan bahwa ia menggunakan tabel memo, yang dapat mengisi memori Anda. Letakkan penutup pada panjang meja memo jika perlu.
Maks saat ini dicari ke: 4000 iterasi
CCCCCC
ditemukan di iterasi: 2946sumber
sys.setrecursionlimit(4000)
danULIMIT=4000
, menemukan (dalam sekitar 3,5 jam pada sistem saya) kemunculan pertama dari CS pada indeks = 2.124 * 10 ^ 519. Indeks persisnya ada di komentar berikutnya ...CCCCCC ditemukan di 2.124 * 10 ^ 519.
Kode ruby berikut digunakan untuk mencari
CCCCCC
.Indeksnya sama dengan jawaban @isaacg .
Runtime dari kode di atas untuk 6 dalam urutan sepuluh detik di komputer saya. Namun demikian, masih mencari jawaban untuk
CCCCCCC
(jika Anda ingin mencobanya sendiri tetapkan konstanSEARCH
ke7
).Anda dapat menggunakan
getc
untuk menemukan karakter pada posisi tertentui
seperti yang dilakukan pada baris terakhir di mana string di sekitar indeks dicetak.sumber
(Bukan jawaban, tapi terlalu lama untuk komentar.)
Berikut ini adalah terjemahan Python dari program @ Howard's Ruby (dipercepat oleh faktor dekat 3 dengan hanya memiliki satu
getc
di loop pencarian). Di sistem saya, ini menemukan C ^ 6 pertama dalam 3 detik. Dalam 93 jam, ia tidak menemukan C ^ 7 dalam 231.000 iterasi, sehingga C ^ 7 pertama (jika ada) harus terjadi setelah posisi 10 ^ 40677 paling kiri dalam string tak terbatas.sumber