pengantar
Saya ingin mencari substring dengan yang paling banyak 1
dalam urutan 0
's dan 1
' s.
Memasukkan
Program Anda memiliki dua input , urutan dan panjang substring.
The urut adalah sejumlah 0
's dan 1
' s:
01001010101101111011101001010100010101101010101010101101101010010110110110
The panjang substring adalah setiap positif non-zero integer:
5
Keluaran
Program Anda harus menampilkan indeks awal substring pertama dari panjang yang diberikan yang berisi paling banyak 1
. Dengan input di atas, outputnya adalah:
10
Karakter pertama dalam string dimulai pada indeks 0
.
Mencetak gol
Kode terpendek menang!
Aturan
- Program Anda harus selalu menampilkan indeks yang benar untuk setiap input yang valid.
- Anda dapat memilih metode input / output dari jawaban apa pun dengan skor positif pada opsi default . Silakan tentukan metode yang Anda pilih dalam jawaban Anda.
1
, Anda output substring pertama yang Anda temukan. Anda mengidentifikasi substring dengan indeks karakter pertama dalam substring itu. Apakah itu membantu?Jawaban:
Dyalog APL, 11
Coba di sini. Pemakaian:
Penjelasan
Ini adalah fungsi diad (artinya biner) yang mengambil panjang substring dari kiri, dan urutan dari kanan. Strukturnya adalah sebagai berikut:
Penjelasan demi ledakan:
Sebagai contoh, mari kita ambil
4
dan0 1 1 0 1 1 1 0
sebagai input. Pertama, kita terapkan fungsi itu+/
pada mereka dan dapatkan2 3 3 3 3
. Kemudian,+
dan⌈/
diterapkan ke array ini memberikan dirinya sendiri dan3
, dan2 3 3 3 3 ⍳ 3
mengevaluasi2
, sejak3
pertama terjadi sebagai elemen kedua. Kami kurangi1
dan dapatkan1
sebagai hasil akhir.sumber
m
orang-orang, di manam
adalah maksimal.Ruby, 42
Mengambil input dengan memanggilnya, mis
f['01001010101101111011101001010100010101101010101010101101101010010110110110',5]
Ini membandingkan substring menggunakan nilai ASCII total dan mengembalikan indeks maksimum. Saya tidak yakin apakah
max_by
diperlukan oleh spesifikasi Ruby agar stabil tetapi tampaknya dalam implementasi C.sumber
Python 2, 56
Menerima array bilangan bulat, lalu panjangnya.
sumber
[int(s) for s in "010010...0"]
f(ss, 999)
akan mengembalikan 0 (bukan Tidak ada). Bisakah kamu memperbaikinya? Ini bisa dibilang melanggar aturan 1.ss
?None
bagaimanapun juga tidak pernah merupakan output yang diinginkan karena jawabannya adalah integer.Gelombang - 222
Batch jelas merupakan bahasa yang sempurna untuk operasi semacam ini.
Tidak golf / dibedah:
Pengaturan awal. Variabelnya
s
adalah string input, danl
akan menjadi panjang string input, dikurangi panjang sub-string (diinisialisasi pada negatif di%2
mana%2
panjang sub-string yang diberikan).Dapatkan panjang input sebagai
l
, menggunakan solusi panjang Batch string murni - ini mangles variabel yangs
berisi string input, jadi kami kemudian mengaturnya lagi.Nilai
x
digunakan untuk memeriksa sub-string mana yang memiliki jumlah terbesar 1's. Mulai loop dari 0 hingga panjang string, minus panjang sub-string (variabell
). Dapatkan sub-string mulai dari titik saat ini di loop (%%a
),c
ditetapkan sebagai string input mulai dari%%a
, dan mengambil%2
(panjang sub-string yang diberikan) karakter. Apa pun0
yang dihapus daric
, maka nilaic
dibandingkan denganx
- yaitu111
adalah jumlah yang lebih besar daripada11
jadi kita bisa menggunakan 'string' untuk melakukan yang lebih besar daripada perbandingan.y
kemudian diatur ke lokasi saat ini di string - yang akhirnya dikeluarkan.Menggunakan contoh OPs -
sumber
C # (Regex), 196
Regex sebenarnya tidak terlalu panjang, tetapi semua bulu yang dibutuhkan untuk program C # untuk mengkompilasi dua kali lipat ukuran kode.
Regex yang sebenarnya, atur panjangnya menjadi 5:
(?=((?<o>1)|0){5})
: Lihat ke depan untuk membaca 5 karakter tanpa mengkonsumsi, dan dorong semua1
ke dalam "tumpukan"o
.(?=[10]{5})(?!((?<-o>1)|0){5})
: Pada posisi yang memiliki 5 karakter di depan, tidak ada item yang cukup di "tumpukan"o
untuk muncul, yaitu substring memiliki lebih1
dari apa yang kita miliki di posisi saat ini.(?!.+(?=[10]{5})(?!((?<-o>1)|0){5}))
: Posisi seperti yang dijelaskan di atas tidak dapat ditemukan untuk sisa string, yaitu semua posisi memiliki jumlah kurang dari atau sama1
.Mengambil hasil pertama memberikan jawaban, karena semua substring di depannya memiliki beberapa substring di depan dengan lebih banyak
1
, dan kami telah memeriksa bahwa setiap indeks lebih besar dari indeks saat ini memiliki kurang dari atau sama dengan jumlah1
.(Dan saya belajar sesuatu yang bagus: "stack" dikembalikan pada backtracking).
sumber
Pyth , 12
Ini mendefinisikan fungsi
g
, yang memerlukan daftar angka dan angka sebagai input. MisalnyaAnda dapat mengujinya di sini: Pyth Compiler / Executor
Penjelasan:
Alternatif:
sumber
ho/<>zNQ\0Uz
Sedihnya, mengandalkan string tidak secara otomatis mengubah apa yang Anda cari ke string :(J,
1514 karaktersumber
Matlab (42)
Biarkan
s
menunjukkan string dann
panjang substring. Hasilnya adalahr
.Hitung konvolusi
s
dengan urutann
yang, kemudian temukan maksimum. Konvolusi dilakukan dengan mudahconv
, danmax
fungsi mengembalikan posisi maksimum pertama . Ini perlu untuk mengurangi1
indeks yang dihasilkan, karena pengindeksan Matlab dimulai pada1
, bukan0
.Golf:
sumber
Haskell,
6462 BytesPemakaian:
sumber
n#l=...
p
. juga, saya pikir0
itu berlebihan (meskipun tanda kurung tidak, dan Anda mungkin membutuhkan ruang, bukan itu0
).JavaScript (ES6) 73
Fungsi mengembalikan nilai yang diminta. Loop for memindai string input yang menjaga total berjalan, menyimpan posisi nilai maks.
Tidak disatukan
Uji di konsol FireFox / FireBug
Keluaran
10
sumber
x
danr
. Ini harus mengurangi 4 byte, menjadi panjang akhir 69 byte. Juga, Anda mungkin bisa menggantikannya&&
dengan&
. Tapi yang bagus dengan~~
triknya!t > x
. Anda perlu init r: cobaF("00000")
. Dan && diperlukan untuk meniru danif
(x=t, r=i-n+1)
jikat
lebih rendah atau sama denganx
. Itu penggunaan evaluasi malas yang bagus! Saya berharap itu bisa dipotong di suatu tempat, tapi saya kira Anda melakukan semua pekerjaan.PHP (96)
for($a=$b=$c=0;(($d=@substr_count($s,1,$a,$n))>$c&&($b=$a)&&($c=$d))||$a++<strlen($s););echo $b;
http://3v4l.org/J4vqa
variabel
$s
dan$n
harus didefinisikan pada baris perintah ke string pencarian dan panjang substring, masing-masing.Ini juga akan berfungsi dalam bahasa seperti-C dengan fungsi yang sesuai untuk
substr_count()
danstrlen()
.sumber
Mathematica,
3836Contoh:
Keluaran:
sumber
C # (Linq), 148 byte
Diformat:
Mengambil input sebagai params metode.
Apa fungsinya:
sumber
Scala - 70 Bytes
Tetapi dengan nama fungsi selama zipWithIndex saya kira Scala bukan pilihan terbaik untuk kode golf.
sumber
C,
245185Diformat:
Pemakaian:
sumber
CJam,
2521 byteUji di sini.
Mengambil input sebagai bilangan bulat untuk panjang substring, dan array nol dan yang sebagai urutan:
Penjelasan
Hasilnya dicetak secara otomatis di akhir program.
Perhatikan bahwa saya juga mempertimbangkan irisan yang mulai lebih dekat ke akhir daripada panjang substring yang diinginkan, tetapi tidak apa-apa, karena mereka adalah substring dari substring valid terakhir dan karenanya tidak akan pernah memiliki lebih
1
dari substring valid terakhir.sumber
Java 329 byte
akan menanamkan .matches (regex), tetapi itu akan menjadi identik dengan solusi python di atas, jadi saya mencoba jendela geser sebagai gantinya. baru di sini, jadi jika ada yang punya petunjuk senang mendengarnya.
}
sumber
i
di baris ketiga. Sebagian besar ruang putih dapat dihapus. GunakanSystem.out.print(
(tidak perlu baris baru). Alih-alihInteger.valueOf(
, Anda bisa menggunakannew Integer(
.