pengantar
Saya sebelumnya telah menciptakan dua tantangan di mana idenya adalah untuk merekonstruksi objek menggunakan sesedikit mungkin jenis operasi query; ini akan menjadi yang ketiga.
Tugas
Input Anda harus berupa string yang tidak kosong di S
atas alfabet abc
dan panjangnya, dan output Anda akan menjadi S
. Tanpa batasan, ini tentu saja akan menjadi tugas yang sepele; tangkapannya adalah Anda tidak diizinkan mengakses S
secara langsung. Satu-satunya hal yang boleh Anda lakukan S
adalah memanggil fungsi num_occur(T, S)
, di mana T
ada string lain, dan num_occur
menghitung jumlah kemunculan T
di S
. Kejadian yang tumpang tindih dihitung sebagai berbeda, sehingga num_occur(T, S)
benar-benar mengembalikan jumlah indeks i
sedemikian rupa
S[i, i+1, …, i+length(T)-1] == T
Misalnya num_occur("aba", "cababaababb")
akan kembali 3
. Perhatikan juga bahwa num_occur(S, S)
akan kembali 1
. Hasil num_occur("", S)
tidak terdefinisi, dan Anda tidak boleh memanggil fungsi pada string kosong.
Singkatnya, Anda harus menulis fungsi atau program yang mengambil S
dan length(S)
sebagai input, memanggil num_occur
beberapa string yang lebih pendek dan S
beberapa kali, merekonstruksi S
dari informasi itu dan mengembalikannya.
Aturan dan penilaian
Tujuan Anda adalah menulis program yang membuat panggilan sesedikit num_occur
mungkin. Dalam repositori ini , Anda akan menemukan file bernama abc_strings.txt
. File ini berisi 100 string, masing-masing pada barisnya sendiri, antara panjang 50 dan 99. Skor Anda adalah jumlah total panggilan num_occur
pada input ini , skor yang lebih rendah lebih baik. Solusi Anda lebih baik akan melacak nomor ini saat berjalan, dan mencetaknya setelah selesai. String dihasilkan dengan memilih huruf acak seragam dari abc
; Anda diizinkan untuk mengoptimalkan metode menghasilkan string ini, tetapi bukan string itu sendiri.
Tidak ada batasan waktu, kecuali bahwa Anda harus menjalankan solusi Anda pada test case sebelum mengirimkannya. Solusi Anda harus bekerja untuk setiap input yang valid S
, bukan hanya kasus uji.
Anda juga dianjurkan untuk membagikan implementasi Anda num_occur
, jika Anda tidak menggunakan orang lain. Untuk mendapatkan bola yang menggelinding, berikut ini implementasinya dengan Python:
def num_occur(needle, haystack):
num = 0
for i in range(len(haystack) - len(needle) + 1):
if haystack[i : i + len(needle)] == needle:
num += 1
return num
sumber
S
, atau hanya untuk kasus uji?all non-empty strings
berapa pun panjangnya?Jawaban:
Javascript,
1432514311 panggilanKami mulai dengan string kosong dan melanjutkan dengan rekursif dengan menambahkan huruf baru di akhir atau di awal string saat ini sementara kami masih memiliki setidaknya satu kecocokan.
Semua hasil sebelumnya dari
numOccur()
disimpan disym
objek dan kami menggunakan data ini untuk segera menolak string baru yang tidak mungkin menjadi kandidat.EDIT : Karena kita selalu mulai dengan
'a'
, kita selalu tahu jumlah pasti daria
string. Kami menggunakan informasi ini untuk mengakhiri proses lebih awal ketika kami mendeteksi bahwa hanya urutana
yang hilang. Juga memperbaiki ekspresi reguler yang tidak valid di Chrome dan IE.Cuplikan yang dapat dieksekusi penuh di bawah.
Tampilkan cuplikan kode
sumber
Python, 15205 panggilan
Pengajuan ini kemungkinan besar suboptimal, karena hanya digunakan
num_occur
untuk memeriksa apakah string adalah substringS
, dan tidak pernah menggunakannya untuk benar-benar menghitung jumlah substring.Algoritma bekerja dengan menyimpan string
current
yang dibangun agar sama denganS
pada akhirnya. Berikut ini semua langkah dalam algoritme:Kami menetapkan
current
sama dengan''
Telusuri setiap huruf dalam alfabet, dan lakukan hal berikut:
2.1. Buat string baru
current_new
, dan atur sama dengancurrent
diikuti oleh huruf.2.2. Periksa apakah
current_new
disertakanS
dengan menjalankannyanum_occur
dan lihat apakah hasilnya lebih dari satu.2.3. Jika
current_new
termasuk dalamS
, setcurrent
kecurrent_new
dan kembali ke langkah 2. Lain, kita pergi ke surat berikutnya.Jika panjangnya
current
sama dengan panjangnyaS
kita bisa mengatakan bahwa kita sudah selesai. Lain, kita kembali ke langkah 2, tetapi memodifikasi langkah 2.1 untuk membuatcurrent_new
sama dengan huruf diikuti olehcurrent
sebagai gantinya. Ketika kita mencapai langkah ini lagi, kita selesai.sumber
Python 2,
1495214754 panggilanSangat mirip dengan jawaban pertama, tetapi tidak mencoba karakter berikutnya yang menghasilkan substring yang tidak mungkin:
kita tahu
num_occur
bahwa itu tidak terjadi pada target (dari panggilan sebelumnya)kami sudah menggunakan substring lebih sering daripada yang terjadi menurut
num_occur
(akan menambahkan penghitungan substring dalam satu menit)dilakukansumber
Python
12705 12632panggilanSaya menggunakan kerangka fungsi Loovjo. Saya tidak pernah kode dengan Python saya butuh bootsrap
EDIT:
Kode yang ditambahkan untuk satu string karakter
ditambahkan kode untuk menolak pola yang sudah cocok
sumber