최대 시퀀스 길이 찾기


29

문자열이 있고 모든 문자의 최대 반복 시퀀스를 찾고 싶다고 가정하십시오.

예를 들어, 샘플 입력이 주어지면 :

"acbaabbbaaaaacc"

샘플 입력의 출력은 다음과 같습니다.

a=5
c=2
b=3

규칙 :

  • 코드는 기능 또는 프로그램 일 수 있습니다.
  • stdin, 파일 또는 함수 매개 변수로 입력 가능
  • 출력은 입력에 나타나는 문자 만 포함해야합니다
  • 입력 최대 길이는 1024입니다
  • 출력 순서는 중요하지 않지만 [char] = [최대 반복 시퀀스] [구분 기호] 형식으로 인쇄해야합니다.
  • 문자열은 모든 문자를 포함 할 수 있습니다

대회는 목요일 3시 23 분 59 초 (UTC)에 종료됩니다.


입력 문자열의 길이에 최대 값이 있습니까?
sigma

2
출력값이 정확하게 주어져야합니까? 나타나지 않는 문자에 대해 0이라고 말할 수 있습니까? 가장 높은 글자까지 모든 글자가 적어도 한 번 표시됩니까?
xnor

1
출력물이 질문에 예시 된대로 정확하게 형식화되어야하는지 명확히하십시오. 현재 16 개 답변 중 10 개 이상이 다른 형식을 사용하고 3 개가 다른 두 가지 버전을 제공합니다.
Dennis

1
@Joey 아마도 골프에 대해 벌을 받아야합니다. 당신이 그것을 용서함으로써, 나는 l:S_&{'=L{2$+_S\#)}g,(N}/생산 시스템에서 보게 될 것입니다 ! 그리고 나는 당신의 이름을 저주합니다.
Cruncher 2016 년

답변:


22

8086 기계 코드, 82 80

x.com파일 내용 :

B7 3D 89 DF B1 80 F3 AA 0D 0A 24 B4 01 CD 21 42
38 D8 74 F7 38 17 77 02 88 17 88 C3 31 D2 3C 0D
75 E9 BF 21 3D B1 5E 31 C0 F3 AE E3 EE 4F BB 04
01 8A 05 D4 0A 86 E0 0D 30 30 89 47 02 3C 30 77
04 88 67 03 43 89 3F 89 DA B4 09 CD 21 47 EB D7

최대 99 자의 반복 만 지원합니다.

debug.com주석이 있는 소스 코드 ( 어셈블러의 입력으로 제공됨)!

a
    mov bh, 3d         ; storage of 128 bytes at address 3d00
    mov di, bx
    mov cl, 80
    rep stosb          ; zero the array
    db 0d 0a 24
; 10b
    mov ah, 1
    int 21             ; input a char
    inc dx             ; calculate the run length
    cmp al, bl         ; is it a repeated character?
    je  10b
    cmp [bx], dl       ; is the new run length greater than previous?
    ja  11a
    mov [bx], dl       ; store the new run length
; 11a
    mov bl, al         ; remember current repeating character
    xor dx, dx         ; initialize run length to 0
    cmp al, d          ; end of input?
    jne 10b            ; no - repeat
    mov di, 3d21       ; start printing run lengths with char 21
    mov cl, 5e         ; num of iterations = num of printable characters
; 127
    xor ax, ax
    repe scasb         ; look for a nonzero run length
    jcxz 11b           ; no nonzero length - exit
    dec di
    mov bx, 104        ; address of output string
    mov al, [di]       ; read the run length
    aam                ; convert to decimal
    xchg al, ah
    or  ax, 3030
    mov [bx+2], ax
    cmp al, 30         ; was it less than 10?
    ja  145
    mov [bx+3], ah     ; output only one digit
    inc bx             ; adjust for shorter string
; 145
    mov [bx], di       ; store "x=" into output string
    mov dx, bx         ; print it
    mov ah, 9
    int 21
    inc di
    jmp 127            ; repeat
; 150

rcx 50
n my.com
w
q

여기에 내가 생각했던 재미난 골프 기술이 있습니다 :

  • 배열의 주소는입니다 3d00. 여기서 3dascii 코드는 =입니다. 이런 식으로, 문자에 대한 배열 항목의 주소 x3d78입니다. 2 자 문자열로 해석하면 x=입니다.
  • 출력 버퍼가 주소에 있습니다 104. 더 이상 필요없는 초기화 코드를 덮어 씁니다. 라인 끝 시퀀스 0D 0A 24는 무해한 코드로 실행됩니다.
  • aam지침은 골프를 제공하지는 않지만 ...
  • 먼저 숫자가 10보다 크다고 가정하고 숫자가 더 작은 경우 수정하십시오.
  • 종료 명령어는 불명확 한 주소 11b에 있으며, 여기에는 C3운 좋게 필요한 기계 코드 가 들어 있습니다 .

재미있는 접근법. 그러나 99 반복의 제한으로 인해 1024 aaaa의 입력이 제공되는 경우는 처리하지 않습니다.
Homer6

14

CJam, 27 26 25 바이트

l:S_&{'=L{2$+_S\#)}g,(N}/

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

$ cjam maxseq.cjam <<< "acbaabbbaaaaacc"
a=5
c=2
b=3

작동 원리

l:S       " Read one line from STDIN and store the result in “S”.                   ";
_&        " Intersect the string with itself to remove duplicate characters.        ";
{         " For each unique character “C” in “S”:                                   ";
  '=L     " Push '=' and ''.                                                        ";
  {       "                                                                         ";
    2$+_  " Append “C” and duplicate.                                               ";
    S\#)  " Get the index of the modified string in “S” and increment it.           ";
  }g      " If the result is positive, there is a match; repeat the loop.           ";
  ,       " Retrieve the length of the string.                                      ";
  (       " Decrement to obtain the highest value that did result in a match.       ";
  N       " Push a linefeed.                                                        ";
}/        "                                                                         ";

9

J-52 바이트

다시 간단한 접근 방식입니다.

f=:([,'=',m=:":@<:@#@[`(]m~[,{.@[)@.(+./@E.))"0 1~~.

설명:

f=:([,'=',m=:":@<:@#@[`(]m~[,{.@[)@.(+./@E.))"0 1~~.
                                                 ~~. Create a set of the input and apply it as the left argument to the following.
   ([,'=',m=:":@<:@#@[`(]m~[,{.@[)@.(+./@E.))"0 1    The function that does the work
                                             "0 1    Apply every element from the left argument (letters) with the whole right argument (text).
                                  @.(+./@E.)         Check if the left string is in right string.
                       (]m~[,{.@[)                   If yes, add one letter to the left string and recurse.
             ":@<:@#@[                               If not, return (length of the left string - 1), stringified.
    [,'=',                                           Append it to the letter + '='

예:

   f 'acbaabbbaaaaacc'
a=5
c=2
b=3
   f 'aaaabaa'
a=4
b=1

자유 형식 출력이 허용되면 (다른 많은 답변과 마찬가지로) 45 바이트 버전도 있습니다. 이 상자는 상자 목록을 나타냅니다 (예, SE의 줄 높이가 줄을 지어도 인쇄됩니다).

   f=:([;m=:<:@#@[`(]m~[,{.@[)@.(+./@E.))"0 1~~.
   f 'acbaabbbaaaaacc'
┌─┬─┐
│a│5│
├─┼─┤
│c│2│
├─┼─┤
│b│3│
└─┴─┘
   f 'aaaabaabba'
┌─┬─┐
│a│4│
├─┼─┤
│b│2│
└─┴─┘

8

루비, 72

(a=$*[0]).chars.uniq.map{|b|puts [b,a.scan(/#{b}+/).map(&:size).max]*?=}

이것은 명령 행 인수에서 출력을 stdout으로 가져옵니다.


chars보다 약간 짧습니다 split("").
Ventero

@Ventero 나는 그것을 시도했지만 chars배열 대신 열거자를 제공합니다. 나는 1.9.3에 있는데 2.0 일입니까?
어리석은

예, 2.0 chars에서는 배열을 반환합니다.
Ventero

규칙을 약간 늘릴 수도 있지만 p대신 puts?
Shelvacu

1
내가 참조. 그것이 덜 예쁘지 만, 나는 그것이 규칙을 어길 것이라는 것을 알 수 없습니다.
daniero

7

GolfScript, 26 바이트

:s.&{61{2$=}s%1,/$-1=,n+}%

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

설명:

  • :ss나중에 사용하기 위해 입력 문자열을 변수 에 저장합니다 .
  • .&입력의 고유 문자를 추출하여 { }%루프 의 나머지 코드가 반복됩니다.
  • 61 스택의 현재 문자 위에있는 숫자 61 (등호의 ASCII 코드)을 출력 구분 기호로 사용합니다.
  • {2$=}s%문자열을 가져 와서 s반복되는 현재 문자와 같으면 1로 바꾸고 그렇지 않으면 0으로 바꿉니다. (또한 출력을 위해 현재 문자를 스택에 남겨 둡니다.)
  • 1,/ 이 문자열을 1과 0으로 가져 와서 0으로 나눕니다.
  • $결과 부분 문자열을 정렬하고 -1=마지막 부분 문자열을 추출합니다 (모두 동일한 문자의 반복으로 구성되므로 가장 길다) ,.이 부분 문자열의 길이를 반환합니다.
  • n+ 길이를 문자열 화하고 줄 바꿈을 추가합니다.

추신. 출력의 등호가 선택 사항 인 경우 총 길이가 24 바이트 인61 경우 생략 할 수 있습니다 (및 2$대체 됨 1$) .

:s.&{{1$=}s%1,/$-1=,n+}%

1
61첫 번째 를 누르면 스왑을 저장할 수 있습니다 :s.&{61{2$=}s%1,/$-1=,n+}%..
Howard

@Howard : 감사합니다!
Ilmari Karonen 2016 년

6

CoffeeScript, 109 바이트

나는 정규식을 좋아한다.

f=(s)->a={};a[t[0]]=t.length for t in s.match(/((.)\2*)(?!.*\1)/g).reverse();(k+'='+v for k,v of a).join '\n'

브라우저 콘솔에서 시도 할 수있는 컴파일 된 JavaScript는 다음과 같습니다.

f = function(s) {
  var a, t, _i, _len, _ref;
  a = {};
  _ref = s.match(/((.)\2*)(?!.*\1)/g).reverse();
  for (_i = 0, _len = _ref.length; _i < _len; _i++) {
    t = _ref[_i];
    a[t[0]] = t.length;
  }
  return a;
};

그럼 당신은 전화 할 수 있습니다

f("acbaabbbaaaaacc")

얻을

c=2
a=5
b=3

이것은와 같은 입력에 대해 잘못된 결과를 생성하는 것 같습니다 aaaabaa.
Ventero

@ Ventro 당신이 맞아, 두 가지 문제가 있습니다. 하나는 쉽게 고쳐 지지만 다른 하나는 생각해야합니다.
Martin Ender 2016 년

@Ventero가 수정되었습니다.
Martin Ender 2016 년

5

Pyth , 24 25 26 (또는 29)

=ZwFY{Z=bkW'bZ~bY)p(Yltb

테스트는 여기에서 할 수 있습니다 : 링크

다음 형식으로 출력합니다.

('a', 5)
('c', 2)
('b', 3)

설명:

=Zw              Store one line of stdin in Z
FY{Z             For Y in set(Z):
=bk              b=''
W'bZ             while b in Z:
~bY              b+=Y
)                end while
p(Yltb           print (Y, len(b)-1)

파이썬 :

k=""
Z=copy(input())
for Y in set(Z):
 b=copy(k)
 while (b in Z):
  b+=Y
 print(_tuple(Y,len(tail(b))))

적절한 (a = 5) 출력을 위해서는 다음을 사용하십시오.

=ZwFY{Z=bkW'bZ~bY)p++Y"="`ltb

29 자


당신이 똑같은 생각을 한 것 같습니다. +1해야합니다.
seequ

@ TheRare 예, 아주 좋은 방법 인 것 같습니다.
isaacg 2016 년

실제로 알고리즘과 관련이 없지만 파이썬 출력은 k=''다른 곳에 정의되어 있기 때문에 혼란 스럽습니다 .
gggg

그래, 미안해 개선을 위해 노력하겠습니다. 나는 그것을 편집 할 것이다.
isaacg

5

C, 126 (125) 119 바이트

l,n,c[256];main(p){while(~(p=getchar()))n*=p==l,c[l=p]=c[p]>++n?c[p]:n;for(l=256;--l;)c[l]&&printf("%c=%d\n",l,c[l]);}

달리는:

$ gcc seq.c 2>& /dev/null
$ echo -n 'acbaabbbaaaaacc' | ./a.out
c=2
b=3
a=5

당신은 대체 할 수있는 getchar()>0~getchar()에 같은 이 대답
anatolyg

@anatolyg EOF가 정확히 -1임을 보장합니까? 나는 그것이 특별히 <0으로 정의되었다고 생각했습니다.
솜털

나는 -1이 충분히 일반적이라고 생각하므로 (예 : Windows 및 Linux) Code Golf로 가정 할 수 있습니다. 프로덕션 코드의 경우 less than zero완벽하게 OK이지만 == EOF더 명확합니다.
아나 톨릭

@anatolyg 물론이 실제로 내가 분명히 심지어 <0이 보장되지 않는 스펙 EOF 당 추측 - 그것은 또한, 예를 들어, 256 난 그냥 단일 바이트 절약 할 수 그래서. :)
푹신한

2
EOF음수로 보장되며 -1 char은 부호가 있어도 사용됩니다 . 여기
아나 톨릭

4

수학 , 74 72 69

Print[#[[1,1]],"=",Max[Tr/@(#^0)]]&/@Split@Characters@#~GatherBy~Max&

% @ "acbaabbbaaaaacc"
a=5
c=2
b=3

그다지 좋지는 않지만 현은 Mathematica 의 최고의 영역 이 아닙니다 . 그래도 점점 나아지고 있습니다. :-)


이것은 꽤 인상적인 골프입니다 (직접 시도한 후에 이것을 말합니다 ...)
Szabolcs

완전한 해결책이 아닌 v10 : First@*MaximalBy[Length] /@ GroupBy[First]@Split@Characters[#] & 적어도 그것은 간단하고 읽기 쉽습니다.
Szabolcs

@Szabolcs 감사합니다! 차이 무엇 GroupByGatherBy?
Mr.Wizard

주요 차이점은을 GroupBy반환한다는 것 Association입니다. 다른 차이점은 아직 자세히 연구하지 않았습니다. reference.wolfram.com/language/ref/GroupBy.html 무료 계정으로 클라우드 에서 사용해 볼 수 있습니다 .
Szabolcs 2018 년

3

C # (LinQPad)

146

이것은 tsavino의 대답이지만 더 짧습니다. 여기서는 Distinct()대신 사용 했습니다 GroupBy(c=>c). 또한 중괄호는 foreach-loop제외됩니다.

void v(string i){foreach(var c in i.Distinct())Console.WriteLine(c+"="+(from Match m in Regex.Matches(i,"["+c+"]+")select m.Value.Length).Max());}

136

나는 lambda expression일반적인 쿼리 구문 대신에 사용하려고 시도했지만 Cast<Match>첫 번째 코드가 필요했기 때문에 코드가 1 문자 더 길어졌습니다 ... 어쨌든 LinQPad에서 실행될 수 있기 때문에 Dump()대신 대신 사용할 수 있습니다 Console.WriteLine().

void v(string i){foreach(var c in i.Distinct())(c+"="+(from Match m in Regex.Matches(i,"["+c+"]+")select m.Value.Length).Max()).Dump();}

코드에 대한 추가 연구를 통해에 대해 생각하게되었습니다 Max(). 이 함수는 또한을 허용합니다 Func. 이 방법으로 Selectlambda epxression을 사용할 때 부분을 건너 뛸 수 있습니다 .

void v(string i){foreach(var c in i.Distinct())(c+"="+Regex.Matches(i,"["+c+"]+").Cast<Match>().Max(m=>m.Value.Length)).Dump();}

따라서 최종 결과 :

128

최신 정보:

Dan Puzey의 팁 덕분에 다른 6자를 저장할 수있었습니다.

void v(string i){i.Distinct().Select(c=>c+"="+Regex.Matches(i,"["+c+"]+").Cast<Match>().Max(m=>m‌​.Value.Length)).Dump();}

길이:

122


개선해 주셔서 감사합니다. LinqPad의 .Dump ()를 사용한 트릭에 대해서는 몰랐습니다. 솔직히 말해서, 나는 Visual Studio에서 코드를 개발하고 LinqPad에 주요 방법이 필요하지 않기 때문에 LinqPad에 복사하여 일부 문자를 저장했습니다.
tsavinho

감사! 나는 또한 바로 알게 Dump()D : 최근에 방법을 당신에게 10 개 이상의 문자마다 : 중괄호 쉽게이고 나머지는 braincracking의 약간이었다 저장
압바스

1
LinqPad의 IEnumerable디스플레이 스타일 을 사용하고 싶다면 다음과 같이 8 자를 추가로 저장할 수 있습니다.i.Distinct().Select(c=>c+"="+Regex.Matches(i,"["+c+"]+").Cast<Match>().Max(m=>m.Value.Length)).Dump();
Dan Puzey

3

파이썬 3 (70)

s=input()
for c in set(s):
 i=1
 while c*i in s:i+=1
 print(c,'=',i-1)

골프를 친 파이썬조차도 매우 읽을 수 있습니다. 이 코드는 단일 문자 변수와 한 줄 while 루프를 제외하고 완전히 관용적이라고 생각합니다.

예제 실행 :

>>> helloworld
e = 1
d = 1
h = 1
l = 2
o = 1
r = 1
w = 1
>>> acbaabbbaaaaacc
a = 5
c = 2
b = 3

이것은 흥미로운 해결책입니다
Cruncher

1
세트를 그냥 s로 변경하면 여전히 요구 사항을 충족한다고 생각합니다. 각 문자를 한 번만 인쇄해야한다고 말하는 곳은 없습니다.
Cruncher 2018 년

@Cruncher OP는 각 문자를 한 번만 지정하지 않는다는 데 동의하지만 다른 Python 답변은 그것을 가정하는 것으로 보이므로 필자는 이에 필적합니다. 출력 형식이 여전히 일치하지 않지만. OP가 명확한 요청에 응답했으면 좋겠습니다.
xnor

2

루비, 58

h={}
gets.scan(/(.)\1*/){h[$1]=[h[$1]||0,$&.size].max}
p h

STDIN에서 입력을 가져 와서 형식으로 STDOUT에 출력 {"a"=>5, "c"=>2, "b"=>3}


2

LINQPad의 C #-159 바이트

글쎄, 적어도 나는 T-SQL을 이겼다.

void v(string i){foreach(var c in i.GroupBy(c=>c)){Console.WriteLine(c.Key+"="+(from Match m in Regex.Matches(i,"["+c.Key+"]+")select m.Value.Length).Max());}}

용법:

v("acbaabbbaaaaacc");

제안은 언제나 환영합니다!


좋은 답변입니다! 몇 가지 제안 사항이 있지만 의견이 너무 길어서 여기클릭 하여 답변하십시오. :)
Abbas

2

파워 쉘 80 77 72

$x=$args;[char[]]"$x"|sort -u|%{"$_="+($x-split"[^$_]"|sort)[-1].length}

콘솔에서 실행해야합니다 ...


1
$x불필요한입니다. 사용하지 않으면 3 바이트가 짧습니다. 또한 sort -u충분하다. 완전한 매개 변수 이름을 철자 할 필요는 거의 없습니다. 그러나 정규 표현식에서 이스케이프 처리되지 않아 특정 문자에 대해서는 실패합니다. »문자열에 문자를 포함 할 수있는 방법«에 따라 문제가 될 수 있습니다.
Joey

그러나 $ 내가 좋아하는 일에 그것을 얻을 수 없었다 X에 대한 정렬 -u에 대한 팁 @Joey 감사 [char[]]"$args"|sort -u|%{"$_="+($args-split"[^$_]"|sort)[-1].length}, 그것은 두 번째 $ 인자들을 보인다는 ... 빈 온다 - darkajax 17 분 전
DarkAjax

응, 그래 죄송합니다. 그 이유는 스크립트 블록에 있기 때문에 자체 인수가 있습니다 ( $args더 이상 스크립트 중 하나는 없음).
Joey

2

펄-65 71 76

내 첫 번째 코드 골프!

각 답변에 대해 golf.pl에 복사하고 다음과 같이 실행하십시오.

echo acbaabbbaaaaacc | perl golf.pl

가장 짧은 해결책은 각 문자를 규칙에 의해 금지되지 않기 때문에 각 문자를 여러 번 인쇄합니다.

$_=$i=<>;for(/./g){$l=length((sort$i=~/$_*/g)[-1]);print"$_=$l
"}

다음으로 가장 짧은 해결책 (85 90 자)은 각 문자를 한 번만 인쇄합니다.

<>=~s/((.)\2*)(?{$l=length$1;$h{$2}=$l if$l>$h{$2}})//rg;print"$_=$h{$_}
"for keys %h

1

F #-106

let f s=
 let m=ref(Map.ofList[for c in 'a'..'z'->c,0])
 String.iter(fun c->m:=(!m).Add(c,(!m).[c]+1))s;m

FSI에서 전화

f "acbaabbbaaaaacc"

준다

val it : Map<char,int> ref =
  {contents =
    map
      [('a', 8); ('b', 4); ('c', 3); ('d', 0); ('e', 0); ('f', 0); ('g', 0);
       ('h', 0); ('i', 0); ...];}

그러나 추가 정보없이 인쇄하려면 다음과 같이 호출하십시오.

f "acbaabbbaaaaacc" |> (!) |> Map.filter (fun _ n -> n > 0)

어느 것이

val it : Map<char,int> = map [('a', 8); ('b', 4); ('c', 3)]

1

자바 스크립트, 116 바이트

y=x=prompt();while(y)r=RegExp(y[0]+'+','g'),alert(y[0]+'='+x.match(r).sort().reverse()[0].length),y=y.replace(r,'')

샘플 출력 :

lollolllollollllollolllooollo
l=4
o=3

acbaabbbaaaaacc
a=5
c=2
b=3

helloworld
h=1
e=1
l=2
o=1
w=1
r=1
d=1 

1

T-SQL (2012) 189 (171)

편집 : ORDER BY규칙이 출력 순서를 허용하므로 제거되었습니다 .

CHAR 변수에서 입력을 가져 @a오고 재귀 CTE 를 사용하여 문자열의 각 문자에 대한 행을 작성하고 순차적 발생을 계산합니다.

그 후에는 간단 SELECT하고 GROUP BY출력 순서를 고려합니다.

SQL Fiddle에서 사용해보십시오 .

WITH x AS(
    SELECT @a i,''c,''d,0r,1n
    UNION ALL 
    SELECT i,SUBSTRING(i,n,1),c,IIF(d=c,r+1,1),n+1
    FROM x
    WHERE n<LEN(i)+2
)
SELECT d+'='+LTRIM(MAX(r))
FROM x
WHERE n>2
GROUP BY d

변수 할당 :

DECLARE @a CHAR(99) = 'acbaabbbaaaaacc';

샘플 출력 :

a=5
c=2
b=3

이전에 SQL 솔루션을 본 적이 없다고 생각합니다. 흥미 롭군
Seiyria 2016 년

str대신, 함수를 고려하십시오 ltrim. 변수 이름을 지정하여 @문자를 저장할 수도 있습니다 . 이를 통해 ircte 에서 변수 를 잃을 수 있습니다 . 그런 식으로 몇 글자를 면도 할 수 있다고 생각합니다. 선행 행 또는 지연 행에 대한 합계와 같은 창 함수를 사용하여 쿼리를 다시 작성할 수도 있습니다. 나는 아직 당신을 얼마나 마음에 두지 않았습니다.
Michael B

@MichaelB 조언을 주셔서 감사합니다. str ()의 문제점은 추가 공간을 많이 출력한다는 것입니다. @를 변수로 사용하기 시작합니다!
편안하게

str항상 10자를 출력 하는 것이 사실 이지만 이것이 골프입니다 : P
Michael B

1

하스켈-113 120 바이트

import Data.List
main=interact$show.map(\s@(c:_)->(c,length s)).sort.nubBy(\(a:_)(b:_)->a==b).reverse.sort.group

테스트

$ printf "acbaabbbaaaaacc" | ./sl
[('a',5),('b',3),('c',2)]

.(구성) 함수를 사용하면 $연결된 함수 체인의 끝 후에 만 ​​매개 변수가 나타나는 람다를 작성하지 않아도 됩니다. 이렇게하려면 간단히 모든 $s를 .s로 변경하십시오 (예 :로 (\i->reverse$sort$group i)바뀝니다 reverse.sort.group.
YawarRaza7349

1

자바 스크립트 [83 바이트]

prompt().match(/(.)\1*/g).sort().reduce(function(a,b){return a[b[0]]=b.length,a},{})

브라우저 콘솔에서이 코드를 실행하십시오.

" acbaabbbaaaaacc" 입력의 경우 " "콘솔이 출력되어야합니다 Object {a: 5, b: 3, c: 2}.


1

자바 스크립트-91

for(i=0,s=(t=prompt()).match(/(.)\1*/g);c=s[i++];)t.match(c+c[0])||alert(c[0]+'='+c.length)

편집 : 첫 번째 솔루션은 규칙을 준수하지만 abab=> 와 같은 단일 문자 발생을 여러 번 인쇄 a=1,b=1,a=1,b=1하므로 첫 번째 문자에 만족하지 않는 사람들 을 위해이 문자 ( 101 문자) 가 나왔습니다 .

for(i=0,s=(t=prompt()).match(/((.)\2*)(?!.*\1)/g);c=s[i++];)t.match(c+c[0])||alert(c[0]+'='+c.length)

0

줄리아, 85

f(s)=(l=0;n=1;a=Dict();[c==l?n+=1:(n>get(a,l,1)&&(a[l]=n);n=1;l=c) for c in s*" "];a)
julia> f("acbaabbbaaaaacc")
{'a'=>5,'c'=>2,'b'=>3}

0

파이썬 3- 111, 126, 115 114 111 바이트

한 줄을 읽는 실행 가능한 코드 (소문자 az 만 사용)

d={}.fromkeys(map(chr,range(97,123)),0)
for c in input():d[c]+=1
[print("%s=%d"%(p,d[p]))for p in d if d[p]>0]

편집 : @ Therare의 요청시 불필요한 출력 제외

출력이 좋아 보인다

~/codegolf $ python3 maxseq.py 
helloworld
l=3
o=2
h=1
e=1
d=1
w=1
r=1

불필요한 출력을 제외해야합니다. (제 생각에)
seequ


당신은 중괄호, 숫자와 같은 키워드 사이에 공백을 제거 할 수 있습니다 for또는 if.
seequ

3
질문을 잘못 읽은 것 같습니다. l=2그리고 o=1이 "Helloworld"에 대한
gnibbler

4
최대 연속 모양 대신 총 모양을 계산합니다.
xnor

0

자바 스크립트 - 141 137 125

나는 정규식을 좋아하지 않는다 :)

function g(a){i=o=[],a=a.split('');for(s=1;i<a.length;){l=a[i++];if(b=l==a[i])s++;if(!b|!i){o[l]=o[l]>s?o[l]:s;s=1}}return o}

운영

console.log(g("acbaabbbaaaaacc"));

출력

[ c: 2, a: 5, b: 3 ]

0

자바 스크립트 (109) 104 (100) 98 바이트

function c(s){q=l={};s.split('').map(function(k){q[k]=Math.max(n=k==l?n+1:1,q[l=k]|0)});return q}

사용법 예 :

console.log(c("aaaaaddfffabbbbdb"))

출력 :

{ a: 5, d: 2, f: 3, b: 4 }

0

PHP, 104 102 96

<?php function _($s){while($n=$s[$i++]){$a[$n]=max($a[$n],$n!=$s[$i-2]?$v=1:++$v);}print_r($a);}

용법

_('asdaaaadddscc');

인쇄

Array ( [a] => 4 [s] => 1 [d] => 3 [c] => 2 )

0

자바 247

import java.util.*;public class a{public static void main(String[]a){Map<Character, Integer> m = new HashMap<>();for(char c:a[0].toCharArray()){Integer v=m.get(c);m.put(c,v==null?1:v+1);}for(char c:m.keySet())System.out.println(c+"="+m.get(c));}}

import java.util.*;Java 에서 작동 합니까 ?
seequ

예, 기존 코드를 붙여 넣기
user902383 2016 년

OP는 기능 / 방법 일 수 있으므로 단순히 방법으로 단축 할 수 있다고 말했습니다.
Rudi Kershaw

이것은 문자로 구성된 가장 긴 하위 문자열이 아니라 문자열에서 모든 문자를 출력합니다. 예를 들어, 대신 acbaabbbaaaaacc출력 a=8; b=4; c=3합니다 a=5; b=3; c=2.
케빈 크루이 센

0

C 169

ASCII 테이블에서 인쇄 가능한 각 문자를 반복하고 입력 문자열에서 최대 개수를 계산합니다.

#define N 128
int c,i,n;
char Y[N],*p;
int main(){gets(Y);
for(c=33;c<127;c++){p=Y;n=0,i=0;while(*p){if(*p==c){i++;}else{n=(i>n)?i:n;i=0;}p++;}
if(n>0) printf("%c=%d\n",c,n);}
}

이것을 테스트 했습니까? 많은 문자열에서 올바른 출력을 생성하는 것처럼 보이지 않으며 입력 길이가 최대 1024까지 가능하다는 사양을 충족하지 못합니다 ... 또한 많은 골프 기술이 있습니다. 놓쳤다. :)
솜털

0

자바 스크립트 116

prompt(x={}).replace(/(.)\1*/g,function(m,l){n=m.length
if(!x[l]||x[l]<n)x[l]=n})
for(k in x)console.log(k+'='+x[k])

0

그루비-80 자

이 영리한 답변을 바탕으로 하여 XNOR :

t=args[0];t.toSet().each{i=0;
while(t.contains(it*++i));
println "${it}=${i-1}"}

산출:

$ groovy Golf.groovy abbcccdddd
d=4
b=2
c=3
a=1

언 골프 드 :

t=args[0]

t.toSet().each { c ->
    i=0
    s=c

    // repeat the char c with length i
    // e.g. "b", "bb", "bbb", etc
    // stop when we find a length that is not in t:
    // this is the max + 1
    while (t.contains(s)) {
        i++
        s=c*i
    }
    println "${c}=${i-1}"
}

실제로 최대 시퀀스 길이를 계산합니까? Groovy도 모르지만 "aabbbbaaaabbbbbba"와 같은 문자열에 대해 어떻게 작동하는지 알 수 없습니다.
솜털

그것은 당신의 예를 위해 작동합니다. ungolfed 버전을 업데이트했습니다. "a"* 4 == "aaaa"입니다.
Michael Easter

아, 지금 어떻게 작동하는지 봅니다. 영리한.
솜털 같은
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.