Encuentra la longitud máxima de secuencia

29

Supongamos que tenemos una cadena y queremos encontrar la secuencia máxima repetida de cada letra.

Por ejemplo, dada la entrada de muestra:

"acbaabbbaaaaacc"

La salida para la entrada de muestra puede ser:

a=5
c=2
b=3

Reglas:

  • Su código puede ser una función o un programa, para que usted elija
  • La entrada puede ser por stdin, archivo o parámetro de función
  • La salida debe contener solo caracteres que aparecen en la entrada
  • La longitud máxima de entrada es 1024
  • El orden de salida no importa, pero debe imprimirse en la forma [char] = [secuencia repetida máxima] [delimitador]
  • La cadena puede contener cualquier caracter

La competencia termina el jueves 3 a las 23:59 UTC.

yossico
fuente
¿Hay un máximo en la longitud de la cadena de entrada?
sigma
2
¿La salida tiene que ser exactamente como se indica? ¿Podemos decir 0 para las letras que no aparecen? ¿Aparecerán todas las letras hasta la letra más alta al menos una vez?
xnor
1
Aclare si la salida debe formatearse exactamente como se ejemplifica en su pregunta. Al menos 10 de las 16 respuestas actuales usan un formato diferente, otras tres presentan dos versiones diferentes.
Dennis
1
@Joey Probablemente deberías castigar por jugar al golf. ¡Al perdonarlo, terminaré viendo l:S_&{'=L{2$+_S\#)}g,(N}/en los sistemas de producción! Y maldeciré tu nombre.
Cruncher

Respuestas:

22

8086 código máquina, 82 80

Contenido del x.comarchivo:

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

Solo admite repeticiones de hasta 99 caracteres.

Código fuente (servido como entrada para el debug.comensamblador), ¡con comentarios!

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

Aquí hay algunas técnicas de golf utilizadas que creo que fueron divertidas:

  • La dirección de la matriz es 3d00, donde 3destá el código ascii =. De esta manera, la dirección para la entrada de la matriz para el carácter xes 3d78. Cuando se interpreta como una cadena de 2 caracteres, es x=.
  • El búfer de salida está en la dirección 104; sobrescribe el código de inicialización que ya no es necesario. La secuencia de fin de línea 0D 0A 24se ejecuta como código inofensivo.
  • La aaminstrucción aquí no proporciona ningún juego de golf, aunque podría ...
  • Escribir el número dos veces, primero suponiendo que es mayor que 10, y luego corrigiendo si es más pequeño.
  • La instrucción de salida se encuentra en una dirección oscura 11b, que contiene el código de máquina necesario C3por suerte.
anatolyg
fuente
Enfoque interesante Sin embargo, con una limitación de 99 repeticiones, no manejaría casos en los que se proporciona la entrada de 1024 aaaa.
Homer6
14

CJam, 27 26 25 bytes

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

Pruébalo en línea.

Ejemplo

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

Cómo 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.                                                        ";
}/        "                                                                         ";
Dennis
fuente
9

J - 52 bytes

Bueno, un enfoque simple de nuevo.

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

Explicación:

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

Ejemplo:

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

Si se permite la salida de forma libre (como en muchas otras respuestas), también tengo una versión de 45 bytes . Estos cuadros representan una lista de cuadros (sí, se imprimen así, aunque la altura de línea de SE los separa).

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

Rubí, 72

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

Esto toma la entrada de los argumentos de la línea de comandos y las salidas a stdout.

afgano
fuente
charses un poco más corto que split("").
Ventero
@Ventero Lo intenté, pero charsda un enumerador en lugar de una matriz. Estoy en 1.9.3, entonces, ¿es una cosa 2.0?
Afuous
Sí, en 2.0 charsdevuelve una matriz.
Ventero
Puede estar estirando un poco las reglas, pero ¿quizás usar en plugar de puts?
Shelvacu
1
Veo. Aunque eso lo hace menos bonito, no puedo ver que rompa las reglas.
daniero
7

GolfScript, 26 bytes

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

Pruébalo en línea.

Explicación:

  • :sguarda la cadena de entrada en la variable spara su uso posterior.
  • .&extrae los caracteres únicos en la entrada, que el resto del código en el { }%bucle repite.
  • 61 empuja el número 61 (código ASCII para un signo igual) en la parte superior del carácter actual en la pila, para actuar como un delimitador de salida.
  • {2$=}s%toma la cadena sy reemplaza sus caracteres con un 1 si son iguales al carácter actual que se está iterando, o 0 si no lo hacen. (También deja el carácter actual en la pila para la salida).
  • 1,/ toma esta cadena de unos y ceros, y la divide en ceros.
  • $ordena las subcadenas resultantes, -1=extrae la última subcadena (que, dado que todas consisten en repeticiones del mismo carácter, es la más larga) y ,devuelve la longitud de esta subcadena.
  • n+ stringifica la longitud y le agrega una nueva línea.

PD. Si los signos de igual en la salida son opcionales, 61se pueden omitir (y 2$reemplazar por 1$), para una longitud total de 24 bytes :

:s.&{{1$=}s%1,/$-1=,n+}%
Ilmari Karonen
fuente
1
Puede guardar el canje si se presiona la 61primera: :s.&{61{2$=}s%1,/$-1=,n+}%.
Howard
@Howard: ¡Gracias!
Ilmari Karonen
6

CoffeeScript, 109 bytes

Me gusta la expresión regular.

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'

Aquí está el JavaScript compilado que puede probar en la consola de su 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;
};

Entonces puedes llamar

f("acbaabbbaaaaacc")

Llegar

c=2
a=5
b=3
Martin Ender
fuente
Esto parece generar resultados incorrectos para entradas como aaaabaa.
Ventero
@Ventero tienes razón, hay dos problemas. uno se arregla fácilmente, pero necesito pensar en el otro.
Martin Ender
@Ventero arreglado.
Martin Ender
5

Pyth , 24 25 26 (o 29)

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

La prueba se puede hacer aquí: enlace

Salidas en el formato:

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

Explicación:

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

Pitón:

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 una salida adecuada (a = 5), use:

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

29 caracteres

isaacg
fuente
Parece que tuviste exactamente la misma idea. Tener un +1 para eso.
seequ
@TheRare, sí, parece una muy buena manera de hacerlo.
isaacg
No está realmente relacionado con su algoritmo, pero la salida de Python es confusa, porque k=''se define en otro lugar.
gggg
Sí, lo siento por eso. Trabajaré para mejorarlo. Yo también lo editaré.
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]);}

Corriendo:

$ gcc seq.c 2>& /dev/null
$ echo -n 'acbaabbbaaaaacc' | ./a.out
c=2
b=3
a=5
mullido
fuente
Puede reemplazar getchar()>0por ~getchar()como en esta respuesta
anatolyg
@anatolyg ¿Se garantiza que EOF sea exactamente -1? Pensé que solo se definía específicamente como <0.
esponjoso
Creo que -1 es lo suficientemente común (es decir, Windows y Linux), por lo que puede asumirlo para Code Golf. Para el código de producción, less than zeroestá perfectamente bien, pero == EOFes más claro.
anatolyg
@anatolyg Claro, y de hecho supongo que según la especificación EOF aparentemente ni siquiera se garantiza que sea <0; también podría ser, por ejemplo, 256. Así que solo guardaré el byte único. :)
esponjoso
2
EOFse garantiza que es negativo y -1 se usa incluso si charestá firmado; ver aquí
anatolyg
4

Mathematica , 74 72 69

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

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

No es muy bueno, pero las cuerdas no son la mejor área de Mathematica . Sin embargo, cada vez mejor. :-)

Señor mago
fuente
Este es un juego de golf bastante impresionante (diciendo esto después de haberlo probado yo mismo ...)
Szabolcs
v10, no es una solución completa: First@*MaximalBy[Length] /@ GroupBy[First]@Split@Characters[#] & al menos es bastante sencillo y legible.
Szabolcs
@Szabolcs ¡Gracias! ¿Cuál es la diferencia entre GroupByy GatherBy?
Mr.Wizard
La principal diferencia es que GroupBydevuelve un Association. Todavía no he estudiado las otras diferencias en detalle. reference.wolfram.com/language/ref/GroupBy.html Puedes probarlo en la nube con una cuenta gratuita (así es como estoy jugando con estos).
Szabolcs
3

C # (LinQPad)

146

Esta es la respuesta de tsavino pero más corta. Aquí, usé en Distinct()lugar de GroupBy(c=>c). También se omiten las llaves del 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

Intenté usar una lambda expressionsintaxis de consulta en lugar de la normal, pero como necesitaba una Cast<Match>primera, el código se convirtió en 1 carácter más largo ... De todos modos, ya que se puede ejecutar en LinQPad, puede usar en Dump()lugar 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();}

Un estudio posterior del código me hizo pensar en el Max(). Esta función también acepta a Func. De esta manera, podría omitir la Selectparte al usar la 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();}

Por lo tanto, resultado final:

128

Actualizar:

Gracias al consejo de Dan Puzey, pude guardar otros 6 caracteres:

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

Longitud:

122

Abbas
fuente
Gracias por sus mejoras, no sabía sobre el truco con .Dump () en LinqPad. Para ser honesto, desarrollé el código en Visual Studio y lo copié en LinqPad para guardar algunos caracteres porque LinqPad no necesita un método principal.
tsavinho
¡Gracias! También acabo de conocer el Dump()método recientemente, te ahorra más de 10 caracteres cada vez :) Las llaves fueron fáciles y el resto fue un poco de braincracking: D
Abbas
1
Si está contento de usar el IEnumerableestilo de visualización de LinqPad, puede guardar otros 8 caracteres, con esto como su cuerpo:i.Distinct().Select(c=>c+"="+Regex.Matches(i,"["+c+"]+").Cast<Match>().Max(m=>m.Value.Length)).Dump();
Dan Puzey
3

Pitón 3 (70)

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

Incluso Python golfizado puede ser muy legible. Creo que este código es completamente idiomático, excepto por las variables de una letra y un bucle while de una línea.

Ejecuciones de ejemplo:

>>> helloworld
e = 1
d = 1
h = 1
l = 2
o = 1
r = 1
w = 1
>>> acbaabbbaaaaacc
a = 5
c = 2
b = 3
xnor
fuente
Esta es una solución interesante
Cruncher
1
si cambia los conjuntos a solo s, creo que aún cumple con los requisitos. En ninguna parte dice que cada carácter debe imprimirse solo una vez.
Cruncher
@Cruncher Estoy de acuerdo en que el OP no especifica cada letra una vez, pero las otras respuestas de Python parecen asumirlo, así que me quedaré con eso para que sea comparable. Aunque los formatos de salida siguen siendo inconsistentes. Desearía que el OP hubiera respondido a las solicitudes de aclaración.
xnor
2

Rubí, 58

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

Toma información de STDIN, la envía a STDOUT en el formulario {"a"=>5, "c"=>2, "b"=>3}

histocrat
fuente
2

C # en LINQPad - 159 bytes

Bueno, al menos vencí a T-SQL; P no vencerá a nadie más, pero pensé en compartirlo de todos modos.

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");

Las sugerencias son siempre bienvenidas!

tsavinho
fuente
¡Gran respuesta! Tengo algunas sugerencias, pero eso fue demasiado largo para un comentario, así que haga clic aquí para obtener mi respuesta. :)
Abbas
2

Powershell 80 77 72

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

Necesitas ejecutarlo en la consola ...

DarkAjax
fuente
1
$xes superfluo Eres tres bytes más corto sin usarlo. tambiénsort -u suficiente Rara vez es necesario deletrear los nombres completos de los parámetros. Sin embargo, esto fallará para ciertos caracteres debido al uso sin escape en la expresión regular. Según cómo debe entenderse »La cadena puede contener cualquier carácter«, esto podría ser un problema.
Joey
@Joey gracias por el consejo sobre sort -u, sin embargo, con respecto a los $ x no pude hacerlo funcionar [char[]]"$args"|sort -u|%{"$_="+($args-split"[^$_]"|sort)[-1].length}, parece que el segundo $ args se vacía ... - darkajax hace 17 minutos
DarkAjax
Eep, si. Lo siento. Eso es porque está en un bloque de script, que tiene sus propios argumentos ( $argsya no existe el del script).
Joey
2

Perl - 65 71 76 caracteres

Mi primer código de golf!

Para cada respuesta, copie a golf.pl y ejecútelo como:

echo acbaabbbaaaaacc | perl golf.pl

Mi solución más corta imprime cada personaje tantas veces como parece, ya que las reglas no lo prohíben.

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

Mi siguiente solución más corta (85 90 caracteres) solo imprime cada carácter una vez:

<>=~s/((.)\2*)(?{$l=length$1;$h{$2}=$l if$l>$h{$2}})//rg;print"$_=$h{$_}
"for keys %h
KJP
fuente
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

En FSI, llamando

f "acbaabbbaaaaacc"

da

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

Sin embargo, para imprimirlo sin la información adicional, llámelo así:

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

lo que da

val it : Map<char,int> = map [('a', 8); ('b', 4); ('c', 3)]
Jwosty
fuente
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,'')

Salida de muestra:

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 
Дамян Станчев
fuente
1

T-SQL (2012) 189 171

Editar: eliminado ORDER BY porque las reglas permiten cualquier orden de salida.

Toma datos de una variable CHAR @a, y usa un CTE recursivo para crear una fila para cada carácter en la cadena y descubre sucesos secuenciales.

Después de eso, es un simple SELECTyGROUP BY con consideración para el orden de la salida.

Pruébelo en 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

Asignando la variable:

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

Salida de muestra:

a=5
c=2
b=3
cómodamentedrei
fuente
No creo haber visto una solución SQL aquí antes. Interesante.
Seiyria
considere la strfunción, en lugar de ltrim. También puede nombrar su variable @para guardar un carácter. Esto le permite perder la ivariable en el rcte. Creo que puedes afeitarte bastantes caracteres de esa manera. También podría reescribir la consulta utilizando una función de ventana como la suma sobre las filas anteriores o lag. No he formado aún cómo te importa.
Michael B
@MichaelB gracias por el consejo. El problema que tengo con str () es que genera un montón de espacios adicionales. ¡Definitivamente comenzaré a usar @ como variable!
comfortableablydrei
Es cierto que strsiempre genera 10 caracteres, pero esto es golf: 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

Probado con

$ printf "acbaabbbaaaaacc" | ./sl
[('a',5),('b',3),('c',2)]
gxtaillon
fuente
Puede usar la función .(componer) para evitar crear una lambda donde el parámetro solo aparece después del final de una cadena de $funciones conectadas. Para hacer esto, simplemente cambie todas las $s a .s (ejemplo: se (\i->reverse$sort$group i)convierte en reverse.sort.group.
YawarRaza7349
1

JavaScript [83 bytes]

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

Ejecute este código en la consola del navegador.

Para la entrada " acbaabbbaaaaacc" la consola debería salir " Object {a: 5, b: 3, c: 2}".

Visión
fuente
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)

EDITAR: Mi primera solución obedece las reglas, pero imprime varias veces ocurrencias de caracteres individuales como abab=>, a=1,b=1,a=1,b=1así que salí con esto ( 101 caracteres), para aquellos que no están satisfechos con el primero:

for(i=0,s=(t=prompt()).match(/((.)\2*)(?!.*\1)/g);c=s[i++];)t.match(c+c[0])||alert(c[0]+'='+c.length)
core1024
fuente
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}
gggg
fuente
0

Python3 - 111, 126, 115 114 111 bytes

Código ejecutable que leerá 1 línea (solo use 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: salida innecesaria excluida a petición de @Therare

La salida se ve bien

~/codegolf $ python3 maxseq.py 
helloworld
l=3
o=2
h=1
e=1
d=1
w=1
r=1
Perro come gato mundo
fuente
Realmente debería excluir la salida innecesaria. (Creo)
verqu
"fijo" la salida
Perro come gato mundo
Puede eliminar espacios entre llaves, números y palabras clave, como foro if.
seequ
3
Creo que has leído mal las preguntas. l=2y o=1para "helloworld"
gnibbler
44
Estás contando las apariencias totales en lugar de las apariciones máximas consecutivas.
xnor
0

JavaScript - 141 137 125

No me gusta la expresión regular :)

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}

correr

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

salidas

[ c: 2, a: 5, b: 3 ]
Mate
fuente
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}

Ejemplo de uso:

console.log(c("aaaaaddfffabbbbdb"))

salidas:

{ a: 5, d: 2, f: 3, b: 4 }
mullido
fuente
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');

impreso

Array ( [a] => 4 [s] => 1 [d] => 3 [c] => 2 )
lastbyte
fuente
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));}}
usuario902383
fuente
¿ import java.util.*;Funciona en Java?
seequ
sí, y
pego el
El OP dijo que podría ser solo una función / método, por lo que puede acortar esto simplemente al método.
Rudi Kershaw
Esto genera todas las apariciones del carácter en la Cadena, no las subcadenas más largas que consisten en el carácter. Por ejemplo, acbaabbbaaaaaccsalidas en a=8; b=4; c=3lugar de a=5; b=3; c=2.
Kevin Cruijssen
0

C 169

Itera cada carácter imprimible en la tabla ASCII y cuenta el máximo de la cadena 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);}
}
bacchusbeale
fuente
¿Has probado esto? No parece que produzca la salida correcta en muchas cadenas, y tampoco cumple con la especificación que dice que la entrada puede tener hasta 1024 de largo ... además, hay muchas técnicas de golf fáciles que has errado :)
esponjoso
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])
martillo de lobo
fuente
0

Groovy - 80 caracteres

Basado en esta inteligente respuesta de xnor :

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

Salida:

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

Sin golf:

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}"
}
Michael Easter
fuente
¿Eso realmente cuenta la longitud máxima de secuencia? No veo cómo funcionaría correctamente para una cadena como "aabbbbaaaabbbbbba", aunque tampoco conozco a Groovy.
esponjoso
Funciona para tu ejemplo. He actualizado la versión sin golf. Tenga en cuenta que "a" * 4 == "aaaa".
Michael Easter
Ah, ya veo cómo funciona ahora. Inteligente.
esponjoso