การใช้อักขระในสตริงนานที่สุด


19

ความท้าทายของคุณ: เขียนฟังก์ชั่นที่ใช้สตริงsอักขระcและพบว่าความยาวของระยะที่ยาวที่สุดของในc ความยาวของการทำงานจะได้รับการsl

กฎ :

  • หากsมีความยาว 0 หรือcว่างเปล่าlควรเป็น 0
  • หากมีกรณีของการไม่มีcในs, lควรเป็น 0
  • ช่องโหว่มาตรฐานและI / O มาตรฐานกฎใช้
  • ไม่ว่าที่ใดในsการวิ่งของcs lควรจะเหมือนกัน
  • ใด ๆ ที่ตัวอักขระ ASCII สามารถปรากฏในและsc

กรณีทดสอบ :

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

ผู้ชนะ :

เช่นเดียวกับคำตอบที่สั้นที่สุดในแต่ละภาษาชนะ



คุณสามารถรวมกรณีขอบที่ว่างเปล่าsและcที่ไม่ได้อยู่ในที่ไม่ว่างเปล่าsในกรณีทดสอบของคุณ?
Martin Ender

สิ่งที่อยู่ในช่วงของตัวอักษรที่สามารถปรากฏในs/ c?
Martin Ender

6
cสามารถว่างเปล่า ในหลายภาษาตัวละครเป็นเพียงจำนวนเต็มที่มีความหมายพิเศษและคุณไม่สามารถมีจำนวนเต็มเปล่าได้เช่นกัน
Martin Ender

14
นั่นไม่สมเหตุสมผลเลยสำหรับฉัน กรณีทดสอบของคุณแนะนำว่าเราต้องให้การสนับสนุน หากเราไม่ต้องสนับสนุนมันการระบุผลลัพธ์ที่ต้องการนั้นไม่สมเหตุสมผลเพราะฉันสามารถพูดได้เสมอว่ามันไม่ได้รับการสนับสนุนหากโซลูชันของฉันจะทำอย่างอื่นในกรณีนั้น
Martin Ender

คำตอบ:


12

05AB1E , 5 ไบต์

รหัส:

SQγOM

ใช้การเข้ารหัส05AB1E ลองออนไลน์!

คำอธิบาย:

SQ      # Check for each character if it is equal to the second input
  γ     # Split the list of zeros and ones into groups
   O    # Sum each array in the arrays
    M   # Get the maximum

2
ทางออกที่ดี! ฉันรู้ว่ามีวิธีที่จะทำเช่นนี้ฉันแค่คิดไม่ออก
Riley

γ¢Mไม่ทำงานเหมือนที่ฉันคิดว่ามันน่าจะเป็น 3 ไบต์
Magic Octopus Urn

8

Mathematica, 35 ไบต์

Max[Tr/@Split@Boole@Thread[#==#2]]&

ฟังก์ชั่นบริสุทธิ์การจดรายการของตัวละครและตัวละครอื่นเป็นอินพุทและคืนค่าจำนวนเต็มแบบไม่ลบ ปรับปรุงตามความพยายามครั้งแรกของฉันโดยใช้การสังเกตของ Adnan (ขึ้นไปโหวต!) ว่าควรทดสอบว่าเท่ากับอักขระพิเศษก่อนที่จะแยกอาร์เรย์

Thread[#==#2]ตรวจสอบว่าแต่ละอักขระอินพุตในอาร์กิวเมนต์แรกเท่ากับอักขระที่กำหนดเป็นอาร์กิวเมนต์ที่สอง BooleแปลงTrues และFalses เป็น1s และ0s Splitแยกรายการออกเป็นส่วนต่างๆตามลำดับ Tr/@สรุปผลรวมย่อยแต่ละรายการและMaxค้นหาผู้ชนะ (เนื่องจากวิธีการMaxทำงานถ้าอาร์กิวเมนต์แรกคือรายการว่างฟังก์ชันนี้จะส่งกลับ-∞ดังนั้นคุณก็รู้ว่าอย่าทำเช่นนั้น)

การส่งครั้งแรก (51 ไบต์)

Max[Split@#/.a:{c_String..}:>Boole[c==#2]Length@a]&

Split@#แยกอินพุตให้เป็นจำนวนอักขระต่อเนื่องเช่น{{"t"}, {"h"}, {"r"}, {"e", "e"}, {" ", " ", " "}, {"s"}, {"p"}, {"a"}, {"c"}, {"e"}, {"s"}}กรณีทดสอบที่สี่ /.a:{c_String..}:>แทนที่แต่ละนิพจน์ย่อยaที่เป็นรายการของอักขระซ้ำcโดยLength@aคูณด้วยBoole[c==#2]ซึ่งเท่ากับ1ถ้าcอักขระอินพุตและ0อื่น ๆ จากนั้นMaxแยกคำตอบ


7

Japt , 20 18 15 ไบต์

fV+Vî+)ª0)n o l

ลองออนไลน์!

บันทึก 5 ไบต์ด้วย obarakon และ ETHproductions


1
ฉันเล่นไปกับโซลูชันของตัวเองมาพักหนึ่งแล้วก็จบลงด้วยสิ่งที่เกือบจะเป็นของคุณ หากคุณใช้fV+Vî+)... ฉันจะให้คุณหาส่วนที่เหลือ :-)
ETHproductions

@ETHproductions "If s is of length 0 or c is empty, l should be 0"ฉันอาจจะคิดเช่นนั้นเหมือนกัน
ทอม

โอ้ผมไม่ได้ตระหนักว่าเมื่อใดก็ตามที่ล้มเหลวไม่ได้มีกรณีใดsc
ETHproductions

7

Pythonขนาด 38 ไบต์

f=lambda s,c:+(c in s)and-~f(s,c+c[0])

ลองออนไลน์!

เดนนิสบันทึก 3 ไบต์ด้วยการอัปเดตcสตริงของอักขระที่ซ้ำกันแทนที่จะอัปเดตตัวเลขซ้ำเพื่อคูณcด้วย


1
f=lambda s,c:c in s and-~f(s,c+c[0])บันทึก 6 ไบต์ (3 หากไม่อนุญาตให้ใช้False )
Dennis


4

Haskell, 43 39 ไบต์

f c=maximum.scanl(\n k->sum[n+1|c==k])0

ลองออนไลน์!

เรียกใช้ผ่านสายอักขระและแทนที่อักขระปัจจุบันด้วยตัวนับที่เพิ่มขึ้นเมื่อใดก็ตามที่เท่ากับcหรือรีเซ็ตเป็น0ถ้าไม่ ใช้สูงสุดของรายการ

ขอบคุณ @xnor เป็นเวลา 4 ไบต์


sum[n+1|c==k]คุณสามารถทำได้
xnor

@xnor: ดี! ฉันเคยทดลอง*fromEnum(c==k)ทั้งแบบไร้จุดหมายและแลมบ์ดา แต่มันจะยาวกว่า 2 หรือ 3 ไบต์เสมอ
nimi

4

C # 116 115 ไบต์

รหัสกอล์ฟครั้งแรกของฉัน

แก้ไขแล้วเนื่องจากการส่งครั้งแรกเป็นข้อมูลโค้ดและไม่มีเนมสเปซที่จำเป็นสำหรับ regex

แก้ไข # 2 เขียนใหม่ให้เสร็จสมบูรณ์เพื่อรองรับอักขระที่มีความหมายพิเศษ regex

ใช้ System.Linq; s => c => System.Text.RegularExpressions.Regex.Replace (s, "[^" + c + "]", ++ c + "") แบ่ง (c) .Max (x => x.Length);

using System.Linq;s=>c=>{var r=(char)(c-1);return string.Join("",s.Select(x=>x==c?c:r)).Split(r).Max(x=>x.Length)};

3
ฉันไม่รู้ C # แต่ดูเหมือนว่ารหัสของคุณคาดว่าตัวแปรcและsจะถูกกำหนดไว้ล่วงหน้า เราเรียกสิ่งนี้ว่า "โค้ด - ส่วนย่อย" และมันไม่ได้รับอนุญาต คุณอาจจะปรับโครงสร้างรหัสของคุณเป็นฟังก์ชั่นที่ไม่ระบุชื่อหรือตั้งค่าตัวแปรเหล่านั้นเป็นอินพุต ทั้งที่ได้รับอนุญาต
ข้าวสาลีตัวช่วยสร้าง

ใช้งานได้หรือไม่ (ดูการแก้ไขด้านบน)
Broom

1
ฉันไม่รู้ C # อีกครั้ง แต่ดูเหมือนว่าจะเป็นเช่นนั้น คุณอาจต้องการเช็คเอาต์เคล็ดลับของเราสำหรับการเล่นกอล์ฟใน C # ที่นี่สำหรับคำแนะนำที่มีประสบการณ์เพิ่มเติมใน C #
ข้าวสาลีตัวช่วยสร้าง

ขอบคุณสำหรับลิงค์! ฉันจะอ่านเคล็ดลับ C # แน่นอน
Broom

3
Hi เพียงบางส่วนแสดงความคิดเห็นทั่วไปสำหรับการเล่นกอล์ฟใน C # (s,c)=>คุณสามารถกำหนดฟังก์ชั่นของคุณเป็น คุณต้องใช้ System.Text.RegularExpressions.Regexหรือเพิ่มคำสั่งการใช้ก่อนฟังก์ชั่นของคุณ
LiefdeWen

4

JavaScript (ES6), 54 53 51 ไบต์

-2 ไบต์ขอขอบคุณ @Neil
-1 ไบต์ขอบคุณ @apsillers

s=>c=>[...s].map(x=>j=(i=x==c&&i+1)>j?i:j,i=j=0)&&j

จะเข้าในไวยากรณ์ f("foobar")("o")currying:

ตัวอย่างการทดสอบ

f=
s=>c=>[...s].map(x=>j=(i=x==c&&i+1)>j?i:j,i=j=0)&&j
String: <input id=I> Letter: <input id=J maxlength=1 size=1> <button onclick='O.innerHTML+=`f("${I.value}")("${J.value}") = ${f(I.value)(J.value)}\n`'>Run</button><pre id="O"></pre>

ตัวเลือกอื่นที่ใช้evalและfor(54 ไบต์)

s=>c=>eval("i=j=0;for(x of s)i=x==c&&i+1,i>j?j=i:0;j")

คำตอบเก่าโดยใช้ Regex (85 ไบต์)

s=>c=>c?Math.max(...s.match(eval(`/${/\w/.test(c)?c:"\\"+c}*/g`)).map(x=>x.length)):0

1
ผมคิดว่าx==c?i++:i=0เพียงแค่สามารถi=x==c&&i+1ตั้งแต่falseผลในx==cการเปรียบเทียบจะได้รับการปฏิบัติในฐานะที่เป็น0สำหรับการเปรียบเทียบตัวเลขและการเพิ่มขึ้น (และจะไม่เป็นค่าตอบแทนเนื่องจากจำนวนใด ๆ รวมทั้ง0ในjมักจะมีความสำคัญมากกว่าศูนย์เหมือนfalseในi)
apsillers

@apsillers ขอบคุณอัปเดต แต่คุณหมายถึงอะไรเกี่ยวกับเรื่องนี้โดยที่ไม่ได้เป็นค่าตอบแทน
Justin Mariner

ขอโทษสำหรับความสับสน; ผมก็อธิบายว่าการเปลี่ยนแปลงจะไม่ทำให้ผลตอบแทนที่โปรแกรมของคุณfalse(ตั้งแต่ท้าทายมักจะต้องมันจะกลับตัวเลข)
apsillers

1
s=>c=>[...s].map(x=>j=(x!=c?i=0:++i)>j?i:j,i=j=0)&&jดูเหมือนว่าจะบันทึกสองสามไบต์
Neil

1
ขออภัยฉันโพสต์รหัสผิดฉันตั้งใจจะโพสต์f=s=>c=>[...s].map(x=>j=(i=x==c&&i+1)>j?i:j,i=j=0)&&jซึ่งสั้นกว่าไบต์
Neil

4

JavaScript (Firefox 30-57), 75 72 ไบต์

(s,c)=>Math.max(0,...(for(s of s.split(/((.)\2*)/))if(s[0]==c)s.length))

ตัวอย่างที่รองรับ ES6:

f=
(s,c)=>Math.max(0,...s.split(/((.)\2*)/).filter(s=>s[0]==c).map(s=>s.length))
<div oninput=o.textContent=f(s.value,c.value)><input id=s><input id=c maxlength=1 size=1><pre id=o>0

split ส่งคืนสตริงว่างและอักขระเดี่ยวจำนวนมากรวมถึงการรัน แต่จะไม่มีผลต่อผลลัพธ์




2

Perl 6 ,  45 43  42 ไบต์

->$_,$c {$c&&$_??.comb(/$c+/)».chars.max!!0}

ทดสอบมัน

->$_,$c {$c&&$_??.comb(/$c+/).max.chars!!0}

ทดสอบมัน

->$_,$c {$c&$_??.comb(/$c+/).max.chars!!0}

ทดสอบมัน

ขยาย:

-> $_, $c {       # pointy block lambda

    $c & $_       # AND junction of $c and $_
                  #   empty $c would run forever
                  #   empty $_ would return 4 ( "-Inf".chars )

  ??              # if True (neither are empty)

    .comb(/$c+/)  # find all the substrings
    .max          # find the max
    .chars        # get the length

  !!              # if False (either is empty)

    0             # return 0
}

2

JavaScript, ES6, 52

โซลูชันแบบเรียกซ้ำที่ปฏิบัติต่ออินพุตสตริงเป็นอาร์เรย์ (หมายเหตุ: อินพุตเริ่มต้นยังคงเป็นสตริง) และใช้จากซ้ายไปขวาในอักขระC:

f=([C,...s],c,t=0,T=0)=>C?f(s,c,C==c&&++t,t>T?t:T):T

แทรคการทำงานในปัจจุบันและระดับโลกที่ดีที่สุดในtT

คำอธิบาย:

f=            // function is stored in `f` (for recursion)
  ([C,...s],  // turn input string in first-char `C` and the rest in `s`
   c,         // argument `c` to search for
   t=0,T=0)   // current total `t`, best total `T`
     =>
        C?             // if there is still any char left in the string
          f(s,c,       // recursively call `f`
            C==c&&++t, // increment `t` if char is match, or set `t` to `false`
            t>T?t:T)   // set global `T` to max of `t` and `T`
          :T           // when string is depleted, return `T`

การตั้งค่าtไปfalseที่ไม่ตรงกับ-ทำงานเพราะเมื่อใดก็ตามที่tจะเพิ่มขึ้น, falseจะถือว่าเป็น0(เช่นfalse + 1เป็น1) และfalseจะไม่เปรียบเทียบกระต่ายขูดกว่าค่าใด ๆ Tในโลกสูงสุด


1
วิธีแก้ปัญหาที่ดีฉันไม่คุ้นเคยกับ[C,...s]ไวยากรณ์ ควรช่วยฉันslice()ปิดไบต์จากโพสต์ของฉันเอง
Rick Hitchcock

2

เยลลี่ 5 ไบต์

=ŒgṀS

นี่คือลิงก์ / ฟังก์ชัน dyadic ที่รับสตริงและอักขระ โปรดทราบว่ามันไม่สามารถทำงานเป็นโปรแกรมเต็มรูปแบบได้เนื่องจากอินพุตจากอาร์กิวเมนต์บรรทัดคำสั่งใช้ไวยากรณ์ Python และ Python - ซึ่งแตกต่างจาก Jelly - ไม่แยกสตริงเดี่ยวจากอักขระ

ลองออนไลน์!

มันทำงานอย่างไร

=ŒgṀS  Main link. Left argument: s (string). Right argument: c (character)

=      Compare all characters in s with c, yielding 1 for c and 0 otherwise.
 Œg    Group adjacent, equal Booleans in the resulting array.
   Ṁ   Take the maximum. Note that any array of 1's will be greater than any array
       of 0's, while two arrays of the same Booleans are compared by length.
    S  Take the sum, yielding the length for an array of 1's and 0 otherwise.


2

APL (Dyalog) , 18 11 ไบต์

ต้องการการสลับกับในเวอร์ชัน 16.0 หรือมี⎕ML←3(ค่าเริ่มต้นในหลาย ๆ ระบบ)

⌈/0,≢¨⊂⍨⎕=⎕

ลองออนไลน์!

⎕=⎕ บูลีนเพื่อความเท่าเทียมกันระหว่างสองอินพุต

⊂⍨ self-partition (เริ่มพาร์ติชันที่องค์ประกอบที่ไม่ใช่ศูนย์มีค่ามากกว่ารุ่นก่อน)

≢¨ นับแต่ละ

0, เติมศูนย์ (สำหรับกรณีอินพุตว่าง)

⌈/ สูงสุดของเหล่านั้น


วิธีการแก้ปัญหาเก่า

พร้อมรับคำแรกสำหรับsจากนั้นสำหรับc

⌈/0,(⎕,¨'+')⎕S 1⊢⎕

ลองออนไลน์!

 แจ้งให้

 สำหรับการที่

()⎕S 1PCRE S earch สำหรับความยาวของการเกิดขึ้น

'+' เครื่องหมายบวก (หมายถึงหนึ่งหรือมากกว่า)

 ผนวกเข้ากับแต่ละองค์ประกอบของ

c-  พร้อมท์สำหรับ

0, เติมศูนย์ (สำหรับกรณีอินพุตว่าง)

⌈/ สูงสุดของเหล่านั้น

cจะต้องได้รับเป็นเวกเตอร์ 1 องค์ประกอบของสตริงที่ล้อมรอบหากจำเป็นต้องมีการหลบหนี


2

PHP, 70 67 ไบต์

สามรุ่น:

while(~$c=$argv[1][$i++])$x=max($x,$n=($c==$argv[2])*++$n);echo+$x;
while(~$c=$argv[1][$i++])$x=max($x,$n=$c==$argv[2]?++$n:0);echo+$x;
for(;++$n&&~$c=$argv[1][$i++];)$x=max($x,$n*=$c==$argv[2]);echo+$x;

รับอินพุตจากอาร์กิวเมนต์บรรทัดรับคำสั่ง ทำงานด้วย-rหรือทดสอบพวกเขาออนไลน์


2

PHP , 70 ไบต์

for(;~$c=$argv[1][$i++];)$r[]=$argv[2]==$c?++$n:$n=0;echo$r?max($r):0;

ลองออนไลน์!

PHP , 75 ไบต์

for(;~$s=substr($argv[1],$i++);)$r[]=strspn($s,$argv[2]);echo max($r?:[0]);

ลองออนไลน์!

PHP , 83 ไบต์

<?=@preg_match_all("<".preg_quote($argv[2])."+>",$argv[1],$t)?strlen(max($t[0])):0;

ลองออนไลน์!

+8 Bytes เพื่อหลีกเลี่ยง @

<?=($a=$argv[2])&&preg_match_all("<".preg_quote($a)."+>",$argv[1],$t)?strlen(max($t[0])):0;

เวอร์ชัน 67 ไบต์จะล้มเหลวสำหรับอักขระพิเศษ regex (และ#แน่นอน)
ติตัส

... และอาจจะล้มเหลว~ chr(207)
ติตัส

@Titus Done และอินพุตต้องเป็นอักขระ Ascii เท่านั้น
JörgHülsermann

ตาดีสำหรับ++$n! คุณหมายถึง ascii ที่พิมพ์ได้ ;)
Titus

1
echo$r?max($r):0;บันทึกหนึ่งไบต์
Titus

2

JavaScript (ES6), 47 40 38 ไบต์

(บันทึกแล้ว 7 ไบต์ขอบคุณ @Neil และ 2 ไบต์ขอบคุณ @HermanLauenstein)

s=>g=c=>c&&s.includes(c)?1+g(c+c[0]):0

คำอธิบาย:

ค้นหาการเรียกใช้ซ้ำ ๆ อีกต่อไปจนกว่าจะไม่พบ

ตัวอย่างข้อมูล:


1
ง่ายมาก! ยอดเยี่ยม!
apsillers

คุณทำไม่ได้f=(s,c)=>c&&s.includes(c)&&1+f(s,c+c[0])เหรอ
Neil

s=>g=c=>c&&s.includes(c)&&1+g(c+c[0])หรือดีกว่ายังคงแกงมัน
Neil

เกือบจะใช้งานได้ แต่จะส่งกลับ "false" และสตริง null สำหรับสองกรณี แก้ไขแล้วโดยต่อท้าย||0ซึ่งยังคงสั้นกว่าโซลูชันของฉัน
Rick Hitchcock

f=ไม่เป็นส่วนหนึ่งของรุ่นแกงกะหรี่เพราะเพียงฟังก์ชั่นด้านในเป็น recursive
Neil

2

เยลลี่, 10 9 ไบต์

f⁴L
ŒgÇ€Ṁ

คำอธิบาย:

f⁴L
f⁴      -Filter by the character argument.
  L     -Return Length of filtered String.

ŒgÇ€»/
Œg      -Group string by runs of characters.
  ǀ    -Run above function on each group.
    Ṁ   -Return the largest in the list.

ลองออนไลน์!


Œgf€L€Ṁคุณสามารถบันทึกคู่ของไบต์ด้วย
Dennis


1

Haskell , 66 ไบต์

import Data.List
((maximum.(0:).map length).).(.group).filter.elem

ลองออนไลน์!

รุ่นที่อ่านง่ายขึ้นเล็กน้อย - ไม่ใช่ pointfree:

f c s = maximum (0:(map length (filter (elem c) (group s))))

จัดกลุ่มสตริงตามตัวอักษรแล้วกรองตามกลุ่มที่มีอักขระที่ถูกต้องจากนั้นค้นหาความยาวต่อท้าย 0 เข้ากับรายการความยาวในกรณีที่ไม่ปรากฏขึ้นและในที่สุดค้นหาค่าสูงสุด


1

Mathematica, 109 ไบต์

(s=Differences[First/@StringPosition[#,#2]];k=t=0;Table[If[s[[i]]==1,t++;If[k<t,k=t],t=0],{i,Length@s}];k+1)&


อินพุต

["xxx xxxx xx", "x"]



1

CJam , 20 19 18 16 ไบต์

0q~e`f{~@=*}$+W=

ลองออนไลน์!

คำอธิบาย

0                 e# Push 0. We'll need it later.
 q~               e# Read and eval input. Pushes c and s to the stack.
   e`             e# Run-length encode s: turns it into an array of [length, char] pairs.
     f{           e# Map over these pairs using c an extra parameter:
       ~          e#  Dump the pair to the stack.
        @=        e#  Bring c to the top, check equality with the char, pushing 0 or 1.
          *       e#  Multiply the length by the result.
           }      e# (end map)
            $     e# Sort the resulting list in ascending order.
             +    e# Prepend the 0 from before, in case it's empty.
              W=  e# Get the last element.

1

Excel, 56 ไบต์

{=MAX(IFERROR(FIND(REPT(A2,ROW(A:A)),A1)^0*ROW(A:A),0))}

sA1ควรจะใส่ ควรจะใส่
c สูตรต้องเป็นสูตรอาร์เรย์ ( + +A2
CtrlShiftEnter ) { }ซึ่งจะเพิ่มวงเล็บปีกกา

ในทางเทคนิคสิ่งนี้สามารถจัดการได้เฉพาะที่การรันที่ยาวที่สุดน้อยกว่า 1,048,576 (ซึ่งคือ 2 ^ 20) เพราะนั่นคือวิธีที่แถวปัจจุบันของ Excel จะช่วยให้คุณมีในแผ่นงาน เนื่องจากมันโหลดค่าล้าน + ลงในหน่วยความจำทุกครั้งที่คำนวณใหม่นี่จึงไม่ใช่สูตรที่รวดเร็ว


1

MATL , 15 ไบต์

0i0v=dfd1L)0hX>

ลองออนไลน์!

อัลกอริทึมพื้นฐานนั้นง่ายมาก (ไม่ใช้การแยก!) แต่ฉันต้องโยน0i0vและ0hอนุญาตให้ใช้กับเคสขอบ ถึงกระนั้นฉันคิดว่าวิธีนี้ดีและบางทีฉันก็ยังสามารถหาเทคนิคอื่นเพื่อจัดการกับกรณีขอบ: อัลกอริทึมพบว่าการรันที่ยาวที่สุดในช่วงกลางของสตริงนั้นใช้ได้ แต่ไม่ใช่สำหรับตัวอักษรเดี่ยวหรือสตริงว่าง ฉันยังคงทดสอบว่าฉันสามารถ 'วาง' ตัวแปรที่ตำแหน่งที่ดีกว่าเพื่อผลลัพธ์ที่ดีกว่าได้ไหม

0i0v % Prepends and appends a zero to the (implicit) input.
   = % Element-wise equality with the desired char (implicit input)
   d % Pairwise difference. Results in a 1 at the start of a run, and -1 at the end.
   f % Get indices of 1's and -1's.
   d % Difference to get length of the runs (as well as length of non-runs)
 1L) % Only select runs, throw out non-runs. We now have an array of all run lengths.
  0h % 'Find' (`f`) returns empty if no run is found, so append a zero to the previous array.
  X> % Maximum value.

cไม่ทำงานบนที่ว่างเปล่า จากนั้นอีกครั้งฉันคิดว่าแต่ละสตริงมีการทำงานที่ไม่มีที่สิ้นสุดของสตริงว่างระหว่างตัวละครแต่ละตัว :)


1

R , 66 58 ไบต์

-8 ไบต์ขอบคุณ BLT และ MickyT

function(s,c)max((r=rle(el(strsplit(s,''))))$l*(r$v==c),0)

ส่งคืนฟังก์ชั่นที่ไม่ระบุชื่อ TIO มีความแตกต่าง 1 ไบต์เนื่องจากelใช้งานไม่ได้ด้วยเหตุผลที่อธิบายไม่ได้

ลองออนไลน์!


บันทึกไบต์ด้วยr=rle(el(strsplit(s,'')))
BLT

1
ละเว้นความคิดเห็นก่อนหน้าของฉันหากคุณเห็น มีหนึ่งที่ดีกว่าสำหรับคุณfunction(s,c)max((r=rle(el(strsplit(s,''))))$l*(r$v==c),0)
MickyT

@BLT elไม่ทำงานบน TIO (ไม่รู้เลยว่าทำไม) และฉันเพิ่งคัดลอกและวางจากรหัสการทำงานที่นั่นดังนั้นฉันจะต้องจำไว้ว่าต้องนำกลับมาที่ @MickyT ฉลาดมาก! ขอบคุณ!
Giuseppe

1

Java 8, 67 65 ไบต์

s->c->{int t=0,m=0;for(char x:s)m=m>(t=x==c?t+1:0)?m:t;return m;}

-2 ไบต์ต้องขอบคุณ@ OlivierGrégoire

รับอินพุตsเป็น a char[]และcachar

คำอธิบาย:

ลองที่นี่

s->c->{          // Method with char[] and char parameters and int return-type
  int t=0,       //  Temp counter-integer
      m=0;       //  Max integer
  for(char a:s)  //  Loop over the characters of the input
    m=m>(
     t=x==c?     //   If the current character equals the input-character:
      t+1        //    Raise `t` by 1
      :          //   Else:
       0)        //    Reset `t` to 0
    ?m:t;        //   If `t` is now larger than `m`, put `t` as new max into `m`
                 //  End of loop (implicit / single-line body)
  return m;      //  Return the resulting max
}                // End of method

1
m=m>(t=x==c?t+1:0)?m:t;{t=x==c?t+1:0;m=m>t?m:t;}จะสั้นกว่า
Olivier Grégoire

แม้ว่าจะนานกว่านี้อีกแล้วฉันชอบความคิดแรกของฉัน: s->c->java.util.Arrays.stream(s.split("[^"+c+"]")).mapToInt(z->z.length()).max().orElse(0);)
Olivier Grégoire

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.