문자열에서 가장 긴 문자 실행


19

당신의 도전 : 문자열 취하는 함수 쓰기 s, 문자를 c, 그리고 최장의 길이 발견 c의를 s. 실행 길이는입니다 l.

규칙 :

  • 경우 s길이가 0이거나 c비어, l0이어야합니다.
  • 의 인스턴스가없는 경우 c에을 s, l0을해야합니다.
  • 표준 허점표준 I / O 규칙이 적용됩니다.
  • 에 상관없이 s의 실행 c의이 위치는 l동일해야합니다.
  • 인쇄 가능한 ASCII 문자는 s및에 나타날 수 있습니다 c.

테스트 사례 :

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 2016 년

s/에 나타날 수있는 문자 범위는 무엇입니까 c?
Martin Ender 2016 년

6
c비어있을 수 있습니까? 많은 언어에서 문자는 특수 의미 체계를 가진 정수일 뿐이며 실제로 빈 정수도 가질 수 없습니다.
Martin Ender

14
그건 정말 이해가되지 않습니다. 테스트 사례는이를 지원해야한다고 제안합니다. 우리가 그것을 지원 할 필요가 없다면, 필요한 출력을 지정하는 것은 의미가 없습니다. 왜냐하면 항상 솔루션이 다른 경우에 다른 일을 할 경우 지원되지 않는다고 말할 수 있기 때문입니다.
마틴 엔더

답변:


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 바이트라고 생각했습니다.
매직 문어 Urn

8

Mathematica, 35 바이트

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

문자 목록과 다른 문자를 입력으로 사용하여 음이 아닌 정수를 반환하는 순수 함수. 배열을 나누기 전에 특수 문자가 동일한 지 테스트해야한다는 Adnan의 관찰 (govovote!)을 사용하여 첫 번째 노력을 개선했습니다 .

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

온라인으로 사용해보십시오!

obarakon 및 ETH 프로덕션 덕분에 5 바이트 절약


1
나는 내 자신의 솔루션으로 잠시 동안 놀았고 거의 당신의 것이지만 더 짧은 것으로 끝났다. 당신이 사용하는 경우 fV+Vî+)... 나머지를 알아 드리겠습니다 :-)
ETHproductions

@ETHproductions "If s is of length 0 or c is empty, l should be 0", 너무 문자 그대로 받아 들일 수도 있습니다
Tom

오,의 s인스턴스를 포함하지 않을 때마다 실패한다는 것을 깨닫지 못했습니다 c.
ETHproductions

7

파이썬 , 38 바이트

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

온라인으로 사용해보십시오!

Dennis c는 숫자를 곱하기 위해 재귀 적으로 업데이트하는 대신 중복 문자 문자열 로 업데이트 하여 3 바이트를 절약 c했습니다.


1
f=lambda s,c:c in s and-~f(s,c+c[0])6 바이트를 저장합니다 ( False 가 허용되지 않은 경우 3 ).
데니스


4

하스켈, 43 39 바이트

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

온라인으로 사용해보십시오!

문자열을 통해 실행하고 현재 문자를 같 c거나 재설정 0하지 않을 때마다 증가하는 카운터로 바꿉니다 . 목록을 최대한 활용하십시오.

4 바이트에 대한 @xnor 덕분입니다.


할 수 있습니다 sum[n+1|c==k].
xnor

@ xnor : 니스! *fromEnum(c==k)pointfree와 lambda를 모두 실험 했지만 항상 2 또는 3 바이트 더 길었습니다.
nimi

4

C 번호 116 115 바이트

내 첫 번째 코드 골프

초기 제출이 스 니펫이고 정규식에 필요한 네임 스페이스가 없어서 수정되었습니다.

특수 정규식 의미를 가진 문자를 지원하기 위해 Edit # 2 전체 재 작성

System.Linq; s => c => System.Text.RegularExpressions.Regex.Replace (s, "[^"+ c + "]", ++ c + ""). Split (c) .Max (x => 사용 x. 길이);

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 # 모르지만 당신의 코드를 예상하는 변수 모양 cs미리 정의 할 수 있습니다. 이것을 "코드 조각"이라고하며 허용되지 않습니다. 코드를 익명 함수로 재구성하거나 해당 변수를 입력하도록 설정할 수 있습니다. 둘 다 허용됩니다.
밀 마법사

작동합니까? (위의 편집 참조)
Broom

1
다시 한번 나는 C #을 모른다. 그러나 그것은 보인다. C # 에서 보다 숙련 된 조언 을 얻으 려면 여기 C # 에서의 골프 을 확인 하십시오 .
밀 마법사

링크 주셔서 감사합니다! 나는 C # 팁을 확실히 숙지 할 것이다
Broom

3
C #에서 골프에 대한 일반적인 의견은 함수를로 정의 할 수 있습니다 (s,c)=>. System.Text.RegularExpressions.Regex함수 직전에 using 문을 사용 하거나 추가해야합니다.
LiefdeWen

4

자바 스크립트 (ES6), 54 53 51 바이트

@Neil 덕분에 -2 바이트
@apsillers 덕분에 -1 바이트

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

카레 구문으로 입력을 f("foobar")("o")받습니다 : .

테스트 스 니펫

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>

evalfor(54 바이트)를 사용하는 다른 옵션

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

정규식을 사용하는 이전 답변 (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 감사합니다. 업데이트되었지만 반환 값이 아닌 것은 무엇을 의미합니까?
저스틴 마리너

혼란을 드려 죄송합니다; 난 그냥 변화가 프로그램 반환하지 않습니다 않을 것이라고 설명했다 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

자바 스크립트 (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 런뿐만 아니라 빈 문자열과 단일 문자를 반환하지만 결과에는 영향을 미치지 않습니다.


3

마이크로 , 112 바이트

{T l m 1+:Q # T Q T l~:r}:Z{T[0]+}:X
{i s m:n
n p = if(Z,X)
i L=if(,a)}:a
0\\:C:s:i"":p"":n[0]:T
s l:L
a
T l m:\


2

펄 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

자바 스크립트, ES6, 52

문자열 입력을 배열로 취급하고 (주 : 초기 입력은 여전히 ​​문자열 임) 재귀 솔루션은 왼쪽에서 오른쪽으로 문자를 소비합니다 C.

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

현재 t및 현재 최고 실적을 추적합니다 T.

설명:

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`

설정 tfalse할 때마다 때문에 비 경기에서 것은 작동 t증가, false로 처리됩니다 0(즉 false + 1이다 1), 그리고 false글로벌 최대의 값보다 강판을 비교하지 않습니다 T.


1
좋은 해결책, 나는 [C,...s]구문 에 익숙하지 않았다 . slice()내 게시물에서 바이트를 해제 하는 데 도움이 됩니다.
Rick Hitchcock

2

젤리 , 5 바이트

=ŒgṀS

이것은 문자열과 문자를 취하는 2 차원 링크 / 함수입니다. 명령 줄 인수의 입력은 Python 구문을 사용하고 Jelly와 달리 Python은 단일 문자열을 문자와 구분하지 않으므로 전체 프로그램으로 작동 할 수 없습니다.

온라인으로 사용해보십시오!

작동 원리

=Œ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,≢¨⊂⍨⎕=⎕

온라인으로 사용해보십시오!

⎕=⎕ 두 입력 간의 동등성을위한 부울

⊂⍨ 자체 파티션 (제로가 아닌 요소가 이전 요소보다 큰 파티션 시작)

≢¨ 각각 집계

0, 0을 추가합니다 (빈 입력의 경우)

⌈/ 최대


오래된 솔루션

먼저 s 를 입력 한 다음 c 를 입력하라는 프롬프트

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

온라인으로 사용해보십시오!

 s 프롬프트

 그에 대한

(... )⎕S 1PCRE S는 의 발생의 길이에 대한 earch

'+' 더하기 기호 (하나 이상의 의미)

 의 각 요소에 추가

 프롬프트 c

0, 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 바이트 @

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

67 바이트 버전은 정규 표현식 특수 문자 (및 #물론)에 대해 실패합니다 .
Titus

... 및 ~실패 할 수 있습니다 chr(207).
Titus

@Titus는 완료 및 입력은 ASCII 문자 만 할 수 있습니다
요 르그 Hülsermann에게

좋은 눈 ++$n! 인쇄 가능한 아스키를 의미했습니다. ;)
Titus

1
echo$r?max($r):0;바이트 1 개 절약
Titus

2

자바 스크립트 (ES6), 47 40 38 바이트

(@Neil 덕분에 7 바이트, @HermanLauenstein 덕분에 2 바이트가 절약되었습니다.)

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

설명:

아무것도 찾을 때까지 재귀 적으로 더 긴 실행을 검색합니다.

단편:


1
너무 간단합니다! 훌륭한!
apillers

당신은 할 수 없습니까 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=단지 내측 재귀 함수이기 때문에, 카레 버전의 일부가 아니다.
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€Ṁ.
데니스


1

하스켈 , 66 바이트

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

온라인으로 사용해보십시오!

약간 읽기 쉬운 버전-포인트 프리가 아님 :

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

문자열을 문자별로 그룹화 한 다음 올바른 문자를 포함하는 그룹별로 필터링 한 다음 길이를 찾고 길이가 나타나지 않는 경우 길이 목록에 0을 추가하고 마지막으로 최대 값을 찾습니다.


1

수학, 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))}

s에 입력해야합니다 A1.
c에 입력해야합니다 A2.
수식은 중괄호를 추가 하는 배열 수식 ( Ctrl+ Shift+ Enter) 이어야합니다{ } .

기술적으로, 이것은 가장 긴 실행이 1,048,576 (2 ^ 20) 미만인 경우에만 처리 ​​할 수 ​​있습니다. 이것이 현재 Excel에서 행을 워크 시트에 허용하는 방법이기 때문입니다. 다시 계산할 때마다 백만개 이상의 값을 메모리에로드하기 때문에 빠른 공식 이 아닙니다 .


1

MATL , 15 바이트

0i0v=dfd1L)0hX>

온라인으로 사용해보십시오!

기본 알고리즘은 (분할 사용하지 않음!) 매우 간단합니다,하지만 난에 던져했다 0i0v0h가장자리의 경우 허용 할 수 있습니다. 아직도, 나는 그 접근법이 훌륭하다고 생각했고 아마도 여전히 대소 문자를 처리하는 또 다른 기술을 찾을 수 있습니다. 알고리즘은 문자열 중간에서 가장 긴 실행을 찾지 만 단일 문자 또는 빈 문자열은 아닙니다. 더 나은 결과를 위해 더 나은 곳에서 변수를 '채울 수'있는지 여전히 테스트 중입니다.

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 바이트

BLT 및 MickyT 덕분에 -8 바이트

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

익명 함수를 반환합니다. TIO는 el설명 할 수없는 이유로 작동하지 않기 때문에 1 바이트 차이 가 있습니다.

온라인으로 사용해보십시오!


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

자바 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;}

@ OlivierGrégoire 덕분에 -2 바이트

입력 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.