Tantangan Anda: Tulis fungsi yang mengambil string s
, karakter c
, dan temukan jangka waktu terpanjang c
dalam s
. Panjang run akan l
.
Aturan :
- Jika
s
panjangnya 0 atauc
kosong,l
harus 0. - Jika tidak ada contoh
c
dis
,l
harus 0. - Celah standar dan Aturan I / O Standar berlaku.
- Tidak masalah di mana dalam
s
menjalankanc
s terletak,l
harus sama. - Setiap karakter ASCII yang dapat dicetak dapat muncul di
s
danc
.
Kasus uji :
s,c --> l
"Hello, World!",'l' --> 2
"Foobar",'o' --> 2
"abcdef",'e' --> 1
"three spaces",' ' --> 3
"xxx xxxx xx",'x' --> 4
"xxxx xx xxx",'x' --> 4
"",'a' --> 0
"anything",'' --> 0
Pemenang :
Seperti halnya kode-golf , jawaban terpendek dalam setiap bahasa menang.
s
danc
yang tidak terkandung dalam non-kosongs
dalam kasus pengujian Anda?s
/c
?c
dapat kosong? Dalam banyak bahasa, karakter hanyalah bilangan bulat dengan semantik khusus, dan Anda juga tidak bisa memiliki bilangan bulat kosong.Jawaban:
05AB1E , 5 byte
Kode:
Menggunakan penyandian 05AB1E . Cobalah online!
Penjelasan:
sumber
γ¢M
tidak berkinerja seperti yang saya pikir akan, pikir itu akan menjadi 3-byte.Mathematica, 35 byte
Fungsi murni mengambil daftar karakter dan karakter lain sebagai input dan mengembalikan bilangan bulat negatif. Ditingkatkan pada upaya pertama saya menggunakan pengamatan Adnan (go upvote!) Yang harus diuji untuk menyamakan karakter khusus sebelum memisahkan array.
Thread[#==#2]
memeriksa apakah setiap karakter input dalam argumen pertama sama dengan karakter yang diberikan sebagai argumen kedua.Boole
mengkonversiTrue
s dan s yang dihasilkanFalse
menjadi1
s dan0
s.Split
membagi daftar menjadi beberapa elemen berturut-turut;Tr/@
menjumlahkan setiap sublist, danMax
menemukan pemenang. (Karena caraMax
kerjanya, jika argumen pertama adalah daftar kosong, maka fungsi ini kembali-∞
. Jadi, Anda tahu, jangan lakukan itu.)pengiriman pertama (51 byte)
Split@#
membagi input menjadi karakter berturut-turut, seperti{{"t"}, {"h"}, {"r"}, {"e", "e"}, {" ", " ", " "}, {"s"}, {"p"}, {"a"}, {"c"}, {"e"}, {"s"}}
untuk kasus uji keempat./.a:{c_String..}:>
mengganti setiap subekspresia
yang merupakan daftar karakter yang diulangc
denganLength@a
dikalikan denganBoole[c==#2]
, yaitu1
jikac
sama dengan karakter input dan0
sebaliknya. KemudianMax
ekstrak jawabannya.sumber
Japt ,
20 1815 byteCobalah online!
Disimpan 5 byte berkat obarakon dan produk ETH
sumber
fV+Vî+)
... Saya akan membiarkan Anda mencari tahu sisanya :-)"If s is of length 0 or c is empty, l should be 0"
, saya mungkin menganggap itu terlalu harfiahs
tidak mengandung contohc
.Python , 38 byte
Cobalah online!
Dennis menyimpan 3 byte dengan memperbarui
c
ke serangkaian karakter yang digandakan daripada memperbarui secara berulang nomor untuk dikalikanc
.sumber
f=lambda s,c:c in s and-~f(s,c+c[0])
menghemat 6 byte (3 jika False tidak diizinkan).05AB1E ,
116 byte-5 byte berkat carusocomputing
Cobalah online!
sumber
γvy²¢M
untuk 6-byte, ide yang sama.Haskell,
4339 byteCobalah online!
Jalankan melalui string dan ganti char saat ini dengan penghitung yang meningkat setiap kali sama
c
atau setel ulang0
jika tidak. Ambil maksimum daftar.Terima kasih kepada @xnor untuk 4 byte.
sumber
sum[n+1|c==k]
.*fromEnum(c==k)
, baik pointfree dan lambda, tapi itu selalu 2 atau 3 byte lebih lama.C #
116115 byteGolf kode pertama saya
Diedit karena pengiriman awal adalah cuplikan dan tidak ada namespace yang diperlukan untuk regex
Edit penulisan ulang lengkap # 2 untuk mendukung karakter dengan makna regex khusus
menggunakan System.Linq; s => c => System.Text.RegularExpressions.Regex.Replace (s, "[^" + c + "]", ++ c + ""). Split (c) .Max (x => x.Panjang);sumber
c
dans
telah ditentukan sebelumnya. Kami menyebutnya "snipet kode" dan tidak diizinkan. Anda mungkin dapat merestrukturisasi kode Anda sebagai fungsi anonim atau untuk mengatur variabel-variabel itu untuk dimasukkan. Keduanya diizinkan.(s,c)=>
. Anda harus menggunakanSystem.Text.RegularExpressions.Regex
atau menambahkan pernyataan menggunakan tepat sebelum fungsi Anda.JavaScript (ES6),
545351 byte-2 byte terima
kasih kepada @Neil -1 byte terima kasih kepada @apsillers
Mengambil input dalam sintaks currying:
f("foobar")("o")
.Cuplikan Tes
Opsi lain menggunakan
eval
danfor
(54 byte)Jawaban Lama menggunakan Regex (85 byte)
sumber
x==c?i++:i=0
bisa sajai=x==c&&i+1
karenafalse
hasilx==c
perbandingan akan diperlakukan sebagai0
perbandingan numerik dan kenaikan (dan tidak akan pernah menjadi nilai pengembalian, karena angka apa pun, termasuk0
,j
akan selalu mengambil prioritas di atas seperti nolfalse
dii
)false
(karena tantangan selalu mengharuskannya untuk mengembalikan nomor)s=>c=>[...s].map(x=>j=(x!=c?i=0:++i)>j?i:j,i=j=0)&&j
tampaknya menghemat beberapa byte.f=s=>c=>[...s].map(x=>j=(i=x==c&&i+1)>j?i:j,i=j=0)&&j
, yang merupakan byte lebih pendek.JavaScript (Firefox 30-57),
7572 byteCuplikan yang kompatibel dengan ES6:
split
mengembalikan sekelompok string kosong dan karakter tunggal serta menjalankan tetapi ini tidak mempengaruhi hasilnya.sumber
Mikro , 112 byte
sumber
C (gcc) , 63 byte
Cobalah online!
sumber
Perl 6 ,
45 4342 byteMenguji
Menguji
Menguji
Diperluas:
sumber
JavaScript, ES6, 52
Solusi rekursif yang memperlakukan input string sebagai array (catatan: input awal masih berupa string) dan menggunakan karakter karakter kiri-ke-kanan
C
:Lacak run saat ini
t
dan global terbaik diT
.Penjelasan:
Pengaturan
t
untukfalse
non-pertandingan bekerja karena setiap kalit
bertambah,false
diperlakukan sebagai0
(yaitu,false + 1
adalah1
), danfalse
tidak akan pernah membandingkan parutan daripada nilai dalam dunia-maxT
.sumber
[C,...s]
sintaks. Haruskah saya membantuslice()
byte dari posting saya sendiri.Jelly , 5 byte
Ini adalah tautan / fungsi diad yang mengambil string dan karakter. Perhatikan bahwa ini tidak dapat berfungsi sebagai program penuh, karena input dari argumen baris perintah menggunakan sintaksis Python, dan Python - tidak seperti Jelly - tidak membedakan string tunggal dari karakter.
Cobalah online!
Bagaimana itu bekerja
sumber
Retina , 25 byte
Cobalah online!
Karakter pertama adalah karakter yang akan diperiksa.
sumber
APL (Dyalog) ,
1811 byteMembutuhkan swapping
⊂
dengan⊆
dalam Versi 16.0 atau memiliki⎕ML←3
(default pada banyak sistem).Cobalah online!
⎕=⎕
Boolean untuk kesetaraan antara dua input⊂⍨
partisi mandiri (mulai partisi di mana elemen non-nol lebih besar dari pendahulunya)≢¨
tally masing-masing0,
tambahkan nol (untuk kasus input kosong)⌈/
maks merekaSolusi lama
Anjuran pertama untuk s , lalu untuk c
Cobalah online!
⎕
meminta s⊢
untuk itu(
...)⎕S 1
PCRE S earch untuk panjang kejadian'+'
simbol plus (artinya satu atau lebih),¨
ditambahkan ke masing-masing elemen⎕
diminta untuk c0,
tambahkan nol (untuk kasus input kosong)⌈/
maks merekac harus diberikan sebagai vektor 1-elemen dari string yang terlampir jika perlu melarikan diri.
sumber
PHP,
7067 bytetiga versi:
mengambil input dari argumen baris perintah; jalankan dengan
-r
atau uji secara online .sumber
PHP , 70 byte
Cobalah online!
PHP , 75 byte
Cobalah online!
PHP , 83 byte
Cobalah online!
+8 Bytes yang harus dihindari
@
sumber
#
tentu saja).~
mungkin gagal untukchr(207)
.++$n
! Anda berarti ascii yang dapat dicetak. ;)echo$r?max($r):0;
menghemat satu byteJavaScript (ES6),
474038 byte(Disimpan 7 byte berkat @Neil, dan 2 byte berkat @HermanLauenstein.)
Penjelasan:
Secara rekursif mencari jangka yang lebih panjang sampai tidak ada yang ditemukan
Potongan:
Tampilkan cuplikan kode
sumber
f=(s,c)=>c&&s.includes(c)&&1+f(s,c+c[0])
?s=>g=c=>c&&s.includes(c)&&1+g(c+c[0])
.||0
, yang masih lebih pendek dari solusi saya.f=
bukan bagian dari versi kari, karena hanya fungsi bagian dalam yang bersifat rekursif.Jelly,
109 bytePenjelasan:
Cobalah online!
sumber
Œgf€L€Ṁ
.Python 3 , 71 byte
Cobalah online!
sumber
Haskell , 66 byte
Cobalah online!
Versi yang sedikit lebih mudah dibaca - bukan pointfree:
Mengelompokkan string dengan huruf, lalu memfilter menurut grup yang berisi karakter yang tepat, lalu menemukan panjang, menambahkan 0 ke daftar panjang jika tidak muncul, dan akhirnya menemukan nilai maksimum.
sumber
Mathematica, 109 byte
memasukkan
sumber
Python 2 , 69 byte
Cobalah online!
sumber
CJam ,
20191816 byteCobalah online!
Penjelasan
sumber
Excel, 56 byte
s
harus menjadi inputA1
.c
harus menjadi inputA2
.Formula harus berupa rumus array ( Ctrl+ Shift+ Enter) yang menambahkan tanda kurung keriting
{ }
.Secara teknis, ini hanya dapat menangani di mana jangka waktu terpanjang kurang dari 1.048.576 (yaitu 2 ^ 20) karena itulah bagaimana baris Excel saat ini akan membiarkan Anda miliki di lembar kerja. Karena memuat jutaan nilai ke dalam memori setiap kali dihitung ulang, ini bukan formula cepat .
sumber
MATL , 15 byte
Cobalah online!
Algoritma dasar sangat sederhana (tidak menggunakan split!), Tapi saya harus melempar masuk
0i0v
dan0h
mengizinkan kasus tepi. Namun, saya pikir pendekatannya bagus, dan mungkin saya masih bisa menemukan teknik lain untuk menangani kasus tepi: algoritme menemukan jangka terpanjang di tengah-tengah string baik-baik saja, tetapi tidak untuk karakter tunggal atau string kosong; Saya masih menguji apakah saya bisa 'pad' variabel di tempat yang lebih baik untuk hasil yang lebih baik.Tidak berfungsi saat kosong
c
. Kemudian lagi, saya kira setiap string berisi deretan kosong kosong di antara setiap karakter :)sumber
R ,
6658 byte-8 byte berkat BLT dan MickyT
mengembalikan fungsi anonim. TIO memiliki perbedaan 1 byte karena
el
tidak berfungsi di sana karena alasan yang tidak dapat dijelaskan.Cobalah online!
sumber
r=rle(el(strsplit(s,'')))
function(s,c)max((r=rle(el(strsplit(s,''))))$l*(r$v==c),0)
el
tidak bekerja pada TIO (tidak tahu mengapa) dan saya hanya menyalin dan menempelkannya dari kode kerja di sana jadi saya harus ingat untuk memasukkannya kembali ke @MickyT sangat pintar! Terima kasih!Java 8,
6765 byte-2 byte terima kasih kepada @ OlivierGrégoire
Mengambil input
s
sebagaichar[]
, danc
sebagaichar
Penjelasan:
Coba di sini.
sumber
m=m>(t=x==c?t+1:0)?m:t;
lebih pendek dari{t=x==c?t+1:0;m=m>t?m:t;}
.s->c->java.util.Arrays.stream(s.split("[^"+c+"]")).mapToInt(z->z.length()).max().orElse(0)
Ruby, 40 byte
->s,c{s.split(%r{[^#{c}]}).max&.size||0}
Cobalah online!
sumber