최대 시퀀스 길이 찾기


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 코드는 =입니다. 이런 식으로, 문자에 대한 배열 항목의 주소 x는 3d78입니다. 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 감사합니다! 차이 무엇 GroupBy과 GatherBy?
— 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.