Encontre o comprimento máximo da sequência


29

Suponha que tenhamos uma string e queremos encontrar a sequência máxima repetida de cada letra.

Por exemplo, dada a entrada de amostra:

"acbaabbbaaaaacc"

A saída para a entrada de amostra pode ser:

a=5
c=2
b=3

Regras:

  • Seu código pode ser uma função ou um programa - para você escolher
  • A entrada pode ser por stdin, arquivo ou parâmetro de função
  • A saída deve conter apenas caracteres que aparecem na entrada
  • O comprimento máximo de entrada é 1024
  • A ordem de saída não importa, mas deve ser impressa no formato [char] = [sequência máxima repetida] [delimitador]
  • A cadeia pode conter qualquer caractere

A competição termina na quinta-feira 3 às 23:59 UTC.


Existe um máximo para o comprimento da string de entrada?
Sigma

2
A saída precisa ser exatamente como fornecida? Podemos dizer 0 para letras que não aparecem? Todas as letras até a letra mais alta aparecerão pelo menos uma vez?
xnor

11
Esclareça se a saída deve ser formatada exatamente como exemplificado na sua pergunta. Pelo menos 10 das 16 respostas atuais usam um formato diferente, outras três apresentam duas versões diferentes.
Dennis

11
@ Joey Você provavelmente deve punir por jogar golfe. Por você concordar, vou acabar vendo l:S_&{'=L{2$+_S\#)}g,(N}/nos sistemas de produção! E amaldiçoarei seu nome.
Cruncher

Respostas:


22

Código de máquina 8086, 82 80

Conteúdo do x.comarquivo:

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

Ele suporta apenas repetições de até 99 caracteres.

Código fonte (servido como entrada para o debug.comassembler), com comentários!

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

Aqui estão algumas técnicas de golfe usadas aqui que eu acho divertidas:

  • O endereço do array é 3d00onde 3destá o código ASCII =. Dessa forma, o endereço para a entrada da matriz para caractere xé 3d78. Quando interpretado como uma sequência de 2 caracteres, é x=.
  • O buffer de saída está no endereço 104; ele substitui o código de inicialização que não é mais necessário. A sequência de fim de linha 0D 0A 24é executada como código inofensivo.
  • As aaminstruções aqui não fornecem golfe, embora possam ...
  • Escreva o número duas vezes, primeiro assumindo que é maior que 10 e depois corrigindo se é menor.
  • As instruções de saída estão em um endereço obscuro 11b, que contém o código de máquina necessário C3por sorte.

Abordagem interessante. No entanto, com uma limitação de 99 repetições, ele não lidaria com casos em que a entrada de 1024 aaaa's é fornecida.
Homer6

14

CJam, 27 26 25 bytes

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

Experimente online.

Exemplo

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

Como funciona

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 bytes

Bem, uma abordagem simples novamente.

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

Explicação:

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 + '='

Exemplo:

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

Se a saída de forma livre for permitida (como em muitas outras respostas), também tenho uma versão de 45 bytes . Essas caixas representam uma lista de caixas (sim, são impressas assim, embora a altura da linha da SE as quebre).

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

8

Ruby, 72

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

Isso leva a entrada dos argumentos da linha de comando e as saídas para o stdout.


charsé um pouco menor que split("").
Ventero

@ Ventero Eu tentei isso, mas charsdá um enumerador em vez de uma matriz. Estou no 1.9.3, então é uma coisa 2.0?
afuous

Sim, em 2.0 charsretorna uma matriz.
Ventero

Pode estar esticando um pouco as regras, mas talvez use em pvez de puts?
Shelvacu

11
Entendo. Embora isso a torne menos bonita, não vejo como isso infringiria quaisquer regras.
Daniero 28/06

7

GolfScript, 26 bytes

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

Experimente online.

Explicação:

  • :ssalva a string de entrada na variável spara uso posterior.
  • .&extrai os caracteres únicos na entrada, os quais o restante do código no { }%loop itera.
  • 61 coloca o número 61 (código ASCII para um sinal de igual) em cima do caractere atual na pilha, para atuar como um delimitador de saída.
  • {2$=}s%pega a string se substitui seus caracteres por 1 se eles igualarem o caractere atual que está sendo iterado ou 0 se não o fizerem. (Ele também deixa o caractere atual na pilha para saída).
  • 1,/ pega essa sequência de uns e zeros e a divide em zeros.
  • $classifica as substrings resultantes, -1=extrai a última substring (que, uma vez que todas consistem em repetições do mesmo caractere, é a mais longa) e ,retorna o comprimento dessa substring.
  • n+ especifica o comprimento e acrescenta uma nova linha a ele.

Ps. Se os sinais de igual na saída forem opcionais, eles 61poderão ser omitidos (e 2$substituídos por 1$), para um comprimento total de 24 bytes :

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

11
Você pode salvar o swap se você empurrar o 61primeiro: :s.&{61{2$=}s%1,/$-1=,n+}%.
26414 Howard Howard

@ Howard: Obrigado!
Ilmari Karonen

6

CoffeeScript, 109 bytes

Eu gosto de regex.

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'

Aqui está o JavaScript compilado que você pode experimentar no console do seu navegador

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

Então você pode ligar

f("acbaabbbaaaaacc")

para obter

c=2
a=5
b=3

Isso parece gerar resultados incorretos para entradas como aaaabaa.
Ventero

@ Ventero você está certo, existem dois problemas. um é facilmente consertado, mas preciso pensar no outro.
Martin Ender

@Ventero fixed.
Martin Ender

5

Pyth , 24 25 26 (ou 29)

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

O teste pode ser feito aqui: link

Saídas no formato:

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

Explicação:

=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)

Python:

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

Para uma saída adequada (a = 5), use:

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

29 caracteres


Parece que você teve exatamente a mesma idéia. Tenha um +1 para isso.
seequ

@ TheRare sim, parece ser uma maneira muito boa de fazê-lo.
Isaacg

Não está realmente relacionado ao seu algoritmo, mas a saída do python é confusa, porque k=''é definida em outro lugar.
precisa

Sim, desculpe por isso. Vou trabalhar para melhorá-lo. Eu vou editar também.
Isaacg

5

C, 126 125 119 bytes

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]);}

Corrida:

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

Você pode substituir getchar()>0por ~getchar()como nesta resposta
anatolyg

@anatolyg O EOF é garantido como exatamente -1? Eu pensei que era apenas especificamente definido como sendo <0.
fofo

Eu acho que -1 é bastante comum (ou seja, Windows e linux) para que você possa assumi-lo no Code Golf. Para código de produção, less than zeroestá perfeitamente correto, mas == EOFé mais claro.
anatolyg

@anatolyg Claro, e na verdade acho que, de acordo com as especificações, o EOF aparentemente nem garante <0 - também pode ser, por exemplo, 256. Por isso, vou salvar o único byte. :)
fluffy

2
EOFé garantido como negativo e -1 é usado mesmo se charfor assinado; veja aqui
anatolyg

4

Mathematica , 74 72 69

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

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

Não é muito bom, mas as strings não são a melhor área do Mathematica . Melhorando embora. :-)


Esta é golfe impressionante bonita (dizer isto depois de ter tentado isso sozinho ...)
Szabolcs

v10, não uma solução completa: First@*MaximalBy[Length] /@ GroupBy[First]@Split@Characters[#] & pelo menos, é bem direta e legível.
precisa

@Szabolcs Thanks! Qual é a diferença entre GroupBye GatherBy?
Mr.Wizard

A principal diferença é que GroupByretorna um Association. Ainda não estudei as outras diferenças em detalhes. reference.wolfram.com/language/ref/GroupBy.html Você pode experimentá-lo na nuvem com uma conta gratuita (é assim que estou jogando com eles).
precisa

3

C # (LinQPad)

146

Esta é a resposta de tsavino, mas mais curta. Aqui, eu usei em Distinct()vez de GroupBy(c=>c). Também foreach-loopsão excluídos os chavetas do :

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

Tentei usar uma lambda expressionsintaxe de consulta em vez da normal, mas como eu precisava da Cast<Match>primeira, o código se tornou um caractere mais longo ... De qualquer forma, como ele pode ser executado no LinQPad, você pode usar em Dump()vez de 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();}

Um estudo mais aprofundado do código me fez pensar sobre o Max(). Esta função também aceita a Func. Dessa forma, eu poderia pular a Selectparte ao usar a lambda epxression:

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

Assim, resultado final:

128

Atualizar:

Graças à dica de Dan Puzey, pude salvar outros 6 caracteres:

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

Comprimento:

122


Obrigado por suas melhorias, eu não sabia sobre o truque com o .Dump () no LinqPad. Para ser sincero, desenvolvi o código no Visual Studio e o copiei no LinqPad para salvar alguns caracteres, porque o LinqPad não precisa de um método principal.
tsavinho 27/06

Obrigado! Eu também só tenho que saber o Dump()método recentemente, poupa-lhe 10 + caracteres cada vez :) As chaves foi fácil e o resto foi um pouco de braincracking: D
Abbas

11
Se você está feliz em usar de LinqPad IEnumerableestilo de exibição você pode economizar mais 8 caracteres, com este como o seu corpo:i.Distinct().Select(c=>c+"="+Regex.Matches(i,"["+c+"]+").Cast<Match>().Max(m=>m.Value.Length)).Dump();
Dan Puzey

3

Python 3 (70)

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

Até o Python jogado no golfe pode ser muito legível. Eu acho que esse código é totalmente idiomático, exceto pelas variáveis ​​de uma letra e um loop while de uma linha.

Exemplo é executado:

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

Esta é uma solução interessante
Cruncher

11
se você alterar os conjuntos para apenas s, acho que ainda atende aos requisitos. Em nenhum lugar ele diz que cada caractere deve ser impresso apenas uma vez.
Cruncher

@ Cruncher Eu concordo que o OP não especifica cada letra uma vez, mas as outras respostas do Python parecem assumi-lo, então eu continuarei com isso para ser comparável. Embora os formatos de saída ainda sejam inconsistentes. Desejo que o OP tenha respondido aos pedidos de esclarecimento.
xnor

2

Ruby, 58

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

Pega a entrada de STDIN e a envia para STDOUT no formato {"a"=>5, "c"=>2, "b"=>3}


2

C # no LINQPad - 159 bytes

Bem, pelo menos eu venci o T-SQL; P Não vencerei mais ninguém, mas pensei em compartilhá-lo de qualquer maneira.

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());}}

Uso:

v("acbaabbbaaaaacc");

Sugestões são sempre bem-vindas!


Ótima resposta! Eu tenho algumas sugestões, mas isso foi muito longo para um comentário, então clique aqui para a minha resposta. :)
Abbas

2

Powershell 80 77 72

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

Você precisa executá-lo no console ...


11
$xé supérfluo. Você tem três bytes a menos de não usá-lo. Também sort -ué suficiente. Raramente é necessário especificar os nomes completos dos parâmetros. No entanto, isso falhará para determinados caracteres devido ao uso sem escape na regex. Dependendo de como »a string pode conter qualquer caractere« deve ser entendida, isso pode ser um problema.
Joey

@Joey obrigado pela dica sobre -u tipo, no entanto em relação ao US $ X eu não poderia fazê-lo funcionar como [char[]]"$args"|sort -u|%{"$_="+($args-split"[^$_]"|sort)[-1].length}, parece a segunda $ args vem vazio ... - darkajax 17 mins ago
DarkAjax

Sim, sim. Desculpe. Isso $argsocorre porque ele está em um bloco de script, que possui seus próprios argumentos (o que não existe mais no script).
Joey

2

Perl - 65 71 76 caracteres

Meu primeiro código de golfe!

Para cada resposta, copie para golf.pl e execute como:

echo acbaabbbaaaaacc | perl golf.pl

Minha solução mais curta imprime cada caractere quantas vezes aparecer, pois isso não é proibido pelas regras.

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

Minha próxima solução mais curta (85 90 caracteres) imprime cada caractere apenas uma vez:

<>=~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

No FSI, chamar

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); ...];}

No entanto, para imprimi-lo sem as informações extras, chame-o assim:

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

que dá

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

1

Javascript, 116 bytes

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

Saída de amostra:

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

Editar: removido ORDER BYporque as regras permitem qualquer ordem de saída.

Recebe a entrada de uma variável CHAR @a, e usa uma CTE recursiva para criar uma linha para cada caractere na sequência e descobrir ocorrências sequenciais.

Depois disso, é simples SELECTe GROUP BYleva em consideração a ordem da saída.

Experimente no 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

Atribuindo a variável:

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

Saída de amostra:

a=5
c=2
b=3

Acho que nunca vi uma solução SQL aqui antes. Interessante.
Seiyria

considere a strfunção, em vez de ltrim. Você também pode nomear sua variável @para salvar um caractere. Isso permite que você perca a ivariável no rcte. Eu acho que você pode raspar alguns caracteres dessa maneira. Você também pode reescrever a consulta usando uma função de janela como a soma das linhas anteriores ou atrasadas. Ainda não formou o quanto você se importa.
Michael B

@ MichaelB obrigado pelo conselho. O problema que tenho com str () é que ele gera vários espaços extras. Definitivamente vou começar a usar @ como uma variável!
Confortavelmenterei

É verdade que strsempre gera 10 caracteres, mas isso é jogar golfe: P
Michael B

1

Haskell - 113 120 bytes

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

Testado com

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

Você pode usar a .função (compor) para evitar a criação de uma lambda onde o parâmetro só aparece após o final de uma cadeia de $funções conectadas. Para fazer isso, basta alterar todos os $s para .s (exemplo: se (\i->reverse$sort$group i)transforma em reverse.sort.group.
YawarRaza7349 27/06

1

JavaScript [83 bytes]

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

Execute esse código no console do navegador.

Para entrada " acbaabbbaaaaacc", o console deve enviar " Object {a: 5, b: 3, c: 2}".


1

JavaScript - 91

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

EDIT: Minha primeira solução obedece às regras, mas imprime várias vezes ocorrências de caracteres únicos como abab=> a=1,b=1,a=1,b=1então eu vim com isso ( 101 caracteres), para aqueles que não estão satisfeitos com o meu primeiro:

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

0

Julia, 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

Python3 - 111, 126, 115 114 111 bytes

Código executável que lerá 1 linha (use apenas letras minúsculas 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]

Editar: saída desnecessária excluída a pedido do @Therare

A saída parece boa

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

Você realmente deve excluir a saída desnecessária. (Acho)
Veja

"fixo" a saída
cão come o mundo do gato

Você pode remover espaços entre chaves, números e palavras-chave, como forou if.
seequ

3
Eu acho que você interpretou mal as perguntas. l=2e o=1para "helloworld"
gnibbler

4
Você está contando aparências totais em vez de aparências máximas consecutivas.
xnor

0

JavaScript - 141 137 125

Eu não gosto de regex :)

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}

Corre

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

saídas

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

0

Javascript, 109 104 100 98 bytes

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}

Exemplo de uso:

console.log(c("aaaaaddfffabbbbdb"))

saídas:

{ 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);}

uso

_('asdaaaadddscc');

impresso

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

0

Java 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));}}

Funciona import java.util.*;em Java?
26/06/14

Sim e
colo o

O OP disse que poderia ser apenas uma função / método para que você possa reduzi-lo para simplesmente o método.
Rudi Kershaw

Isso gera todas as ocorrências do caractere na String, não as substrings mais longas que consistem no caractere. Por exemplo, acbaabbbaaaaaccsaídas em a=8; b=4; c=3vez de a=5; b=3; c=2.
Kevin Cruijssen

0

C 169

Repete cada caractere imprimível na tabela ASCII e conta o máximo da sequência de entrada.

#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);}
}

Você já testou isso? Não parece que produz uma saída correta em muitas seqüências de caracteres, e também não atende às especificações que dizem que a entrada pode ter até 1024 comprimentos ... além disso, existem muitas técnicas fáceis de golfe que você perdido. :)
fluffy

0

JavaScript 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

Groovy - 80 caracteres

Baseado nesta resposta inteligente do xnor :

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

Saída:

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

Ungolfed:

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}"
}

Isso conta realmente o tamanho máximo da sequência? Não vejo como isso funcionaria corretamente para uma string como "aabbbbaaaabbbbbba", embora eu também não conheça o Groovy.
macia

Isso funciona para o seu exemplo. Eu atualizei a versão ungolfed. Observe que "a" * 4 == "aaaa".
Michael Easter

Ah, eu vejo como isso funciona agora. Inteligente.
macia
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.