Trouver la longueur de séquence maximale

29

Supposons que nous ayons une chaîne et que nous voulons trouver la séquence répétée maximale de chaque lettre.

Par exemple, étant donné l'exemple d'entrée:

"acbaabbbaaaaacc"

La sortie pour l'entrée échantillon peut être:

a=5
c=2
b=3

Règles:

  • Votre code peut être une fonction ou un programme - à vous de choisir
  • L'entrée peut être par stdin, fichier ou paramètre de fonction
  • La sortie ne doit contenir que des caractères qui apparaissent dans l'entrée
  • La longueur maximale d'entrée est de 1024
  • L'ordre de sortie n'a pas d'importance, mais il doit être imprimé sous la forme [char] = [séquence répétée maximale] [délimiteur]
  • La chaîne peut contenir n'importe quel caractère

La compétition se termine le jeudi 3 à 23h59 UTC.

yossico
la source
Y a-t-il un maximum à la longueur de la chaîne d'entrée?
sigma
2
La sortie doit-elle être exactement comme donnée? Peut-on dire 0 pour les lettres qui n'apparaissent pas? Est-ce que chaque lettre jusqu'à la lettre la plus élevée apparaîtra au moins une fois?
xnor
1
Veuillez préciser si la sortie doit être formatée exactement comme illustré dans votre question. Au moins 10 des 16 réponses actuelles utilisent un format différent, trois autres présentent deux versions différentes.
Dennis
1
@Joey Vous devriez probablement punir le golf. En le tolérant, je vais finir par voir l:S_&{'=L{2$+_S\#)}g,(N}/dans les systèmes de production! Et je maudirai ton nom.
Cruncher
1
Est-ce que cela compte? :) wolframalpha.com/input/?i=char+%22acbaabbbaaaaacc%22+frequency
doublé le

Réponses:

22

8086 code machine, 82 80

Contenu du x.comdossier:

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

Il ne prend en charge que les répétitions de 99 caractères maximum.

Code source (servi d'entrée pour l' debug.comassembleur), avec commentaires!

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

Voici quelques techniques de golf utilisées ici qui, je pense, étaient amusantes:

  • l'adresse du tableau est 3d00, où 3dest le code ascii pour =. De cette façon, l'adresse d'entrée du tableau pour le caractère xest 3d78. Interprété comme une chaîne de 2 caractères, il l'est x=.
  • Le tampon de sortie est à l'adresse 104; il écrase le code d'initialisation qui n'est plus nécessaire. La séquence de fin de ligne 0D 0A 24est exécutée en tant que code inoffensif.
  • Les aaminstructions ici ne fournissent pas de golf, bien que cela puisse ...
  • Écrire le nombre deux fois, en supposant d'abord qu'il est supérieur à 10, puis en corrigeant s'il est plus petit.
  • L'instruction de sortie se trouve à une adresse obscure 11b, qui contient C3par chance le code machine nécessaire .
anatolyg
la source
Approche intéressante. Cependant, avec une limitation de 99 répétitions, il ne traiterait pas les cas où l'entrée de 1024 aaaa est fournie.
Homer6
14

CJam, 27 26 25 octets

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

Essayez-le en ligne.

Exemple

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

Comment ça marche

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
la source
9

J - 52 octets

Eh bien, encore une fois une approche simple.

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

Explication:

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

Exemple:

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

Si la sortie de forme libre est autorisée (comme dans beaucoup d'autres réponses), j'ai aussi une version de 45 octets . Ces cases représentent une liste de cases (oui, elles sont imprimées comme ça, bien que la hauteur de ligne de SE les casse).

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

Rubis, 72

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

Cela prend l'entrée des arguments de ligne de commande et les sorties vers stdout.

afuous
la source
charsest un peu plus court que split("").
Ventero
@Ventero J'ai essayé cela, mais charsdonne un énumérateur plutôt qu'un tableau. Je suis en 1.9.3, est-ce donc une chose 2.0?
2014
Oui, en 2.0 charsrenvoie un tableau.
Ventero
Cela peut étirer un peu les règles, mais peut-être utiliser à la pplace de puts?
Shelvacu
1
Je vois. Bien que cela le rende moins joli, je ne vois pas que cela enfreindrait les règles.
daniero
7

GolfScript, 26 octets

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

Essayez-le en ligne.

Explication:

  • :senregistre la chaîne d'entrée dans la variable spour une utilisation ultérieure.
  • .&extrait les caractères uniques de l'entrée, que le reste du code de la { }%boucle réitère ensuite.
  • 61 pousse le nombre 61 (code ASCII pour un signe égal) au-dessus du caractère actuel sur la pile, pour agir comme un délimiteur de sortie.
  • {2$=}s%prend la chaîne set remplace ses caractères par un 1 s'ils sont égaux au caractère en cours d'itération, ou 0 s'ils ne le sont pas. (Il laisse également le caractère actuel sur la pile pour la sortie.)
  • 1,/ prend cette chaîne de uns et de zéros et la divise en zéros.
  • $ trie les sous-chaînes résultantes, -1= extrait la dernière sous-chaîne (qui, puisqu'elles sont toutes constituées de répétitions du même caractère, est la plus longue), et ,renvoie la longueur de cette sous-chaîne.
  • n+ stringifie la longueur et y ajoute une nouvelle ligne.

Ps. Si les signes égaux dans la sortie sont facultatifs, ils 61peuvent être omis (et 2$remplacés par 1$), pour une longueur totale de 24 octets :

:s.&{{1$=}s%1,/$-1=,n+}%
Ilmari Karonen
la source
1
Vous pouvez enregistrer le swap si vous appuyez sur le 61premier: :s.&{61{2$=}s%1,/$-1=,n+}%.
Howard
@Howard: Merci!
Ilmari Karonen
6

CoffeeScript, 109 octets

J'aime l'expression régulière.

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'

Voici le code JavaScript compilé que vous pouvez essayer dans la console de votre navigateur

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

Ensuite, vous pouvez appeler

f("acbaabbbaaaaacc")

obtenir

c=2
a=5
b=3
Martin Ender
la source
Cela semble générer des résultats incorrects pour des entrées comme aaaabaa.
Ventero
@Ventero vous avez raison, il y a deux problèmes. l'un est facilement réparable, mais je dois penser à l'autre.
Martin Ender
@Ventero corrigé.
Martin Ender
5

Pyth , 24 25 26 (ou 29)

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

Le test peut être fait ici: lien

Sorties au format:

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

Explication:

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

Pour une sortie correcte (a = 5), utilisez:

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

29 caractères

isaacg
la source
On dirait que vous aviez exactement la même idée. Ayez un +1 pour cela.
seequ
@TheRare oui, cela semble être un très bon moyen de le faire.
isaacg
Pas vraiment lié à votre algorithme, mais la sortie python prête à confusion, car elle k=''est définie ailleurs.
gggg
Ouais, désolé pour ça. Je vais travailler pour l'améliorer. Je le modifierai aussi.
isaacg
5

C, 126 125 119 octets

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

Fonctionnement:

$ gcc seq.c 2>& /dev/null
$ echo -n 'acbaabbbaaaaacc' | ./a.out
c=2
b=3
a=5
duveteux
la source
Vous pouvez remplacer getchar()>0par ~getchar()comme dans cette réponse
anatolyg
@anatolyg L'EOF est-il garanti d'être exactement -1? Je pensais que c'était seulement spécifiquement défini comme étant <0.
duveteux
Je pense que -1 est assez commun (c'est-à-dire Windows et Linux), vous pouvez donc l'assumer pour Code Golf. Pour le code de production, less than zeroc'est parfaitement OK, mais == EOFc'est plus clair.
anatolyg
@anatolyg Bien sûr, et en fait, je suppose que selon la spécification EOF, il n'est apparemment même pas garanti d'être <0 - il pourrait également être, par exemple, 256. Je vais donc simplement enregistrer le seul octet. :)
moelleux
2
EOFest garanti négatif et -1 est utilisé même s'il charest signé; voir ici
anatolyg
4

Mathematica , 74 72 69

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

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

Pas très bon mais les cordes ne sont pas le meilleur domaine de Mathematica . De mieux en mieux. :-)

Mr.Wizard
la source
C'est un golf assez impressionnant (en disant cela après l'avoir essayé moi-même ...)
Szabolcs
v10, pas une solution complète: First@*MaximalBy[Length] /@ GroupBy[First]@Split@Characters[#] & au moins c'est assez simple et lisible.
Szabolcs
@Szabolcs Merci! Quelle est la différence entre GroupByet GatherBy?
Mr.Wizard
La principale différence est que GroupByrenvoie un Association. Je n'ai pas encore étudié les autres différences en détail. reference.wolfram.com/language/ref/GroupBy.html Vous pouvez l'essayer dans le cloud avec un compte gratuit (c'est comme ça que je joue avec ces derniers).
Szabolcs
3

C # (LinQPad)

146

C'est la réponse de tsavino mais plus courte. Ici, j'ai utilisé Distinct()au lieu de GroupBy(c=>c). Les accolades de la foreach-loopsont également laissées de côté:

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

J'ai essayé d'utiliser une lambda expressionau lieu de la syntaxe de requête normale mais comme j'avais besoin d'une Cast<Match>première, le code est devenu 1 caractère plus long ... Quoi qu'il en soit, puisqu'il peut être exécuté dans LinQPad, vous pouvez utiliser à la Dump()place 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();}

Une étude plus approfondie du code m'a fait penser au Max(). Cette fonction accepte également a Func. De cette façon, je pourrais ignorer la Selectpartie lors de l'utilisation de l'expression lambda:

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

Ainsi, résultat final:

128

Mise à jour:

Grâce au conseil de Dan Puzey, j'ai pu enregistrer 6 autres caractères:

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

Longueur:

122

Abbas
la source
Merci pour vos améliorations, je ne connaissais pas l'astuce avec le .Dump () dans LinqPad. Pour être honnête, j'ai développé le code dans Visual Studio et l'ai copié dans LinqPad pour enregistrer certains caractères car LinqPad n'a pas besoin d'une méthode principale.
tsavinho
Merci! J'ai aussi récemment appris à connaître la Dump()méthode, vous permet d'économiser plus de 10 caractères à chaque fois :) Les accolades étaient faciles et le reste était un peu de casse-tête: D
Abbas
1
Si vous êtes heureux d'utiliser le IEnumerablestyle d'affichage de LinqPad, vous pouvez enregistrer 8 autres caractères, avec ceci comme corps: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)

Même le golf Python peut être très lisible. Je pense que ce code est entièrement idiomatique, sauf pour les variables à une seule lettre et une boucle while d'une ligne.

L'exemple s'exécute:

>>> helloworld
e = 1
d = 1
h = 1
l = 2
o = 1
r = 1
w = 1
>>> acbaabbbaaaaacc
a = 5
c = 2
b = 3
xnor
la source
Ceci est une solution intéressante
Cruncher
1
si vous changez le (s) set (s) en juste s je pense que cela répond toujours aux exigences Nulle part cela ne dit que chaque caractère ne doit être imprimé qu'une seule fois.
Cruncher
@Cruncher Je suis d'accord que l'OP ne spécifie pas chaque lettre une fois, mais les autres réponses Python semblent l'assumer, donc je m'en tiendrai à cela pour être comparable. Bien que les formats de sortie soient toujours incohérents. Je souhaite que le PO ait répondu aux demandes de clarification.
xnor
2

Rubis, 58

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

Prend l'entrée de STDIN, la renvoie à STDOUT sous la forme {"a"=>5, "c"=>2, "b"=>3}

histocrate
la source
2

C # dans LINQPad - 159 octets

Eh bien, au moins j'ai battu T-SQL; P ne battra personne d'autre, mais j'ai pensé que je le partagerais de toute façon.

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

Usage:

v("acbaabbbaaaaacc");

Les suggestions sont toujours les bienvenues!

tsavinho
la source
Très bonne réponse! J'ai quelques suggestions mais c'était trop long pour un commentaire alors cliquez ici pour ma réponse. :)
Abbas
2

Powershell 80 77 72

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

Vous devez l'exécuter sur la console ...

DarkAjax
la source
1
$xest superflu. Vous êtes trois octets plus court sans l'utiliser. sort -uSuffit également . Il est rarement nécessaire de préciser les noms de paramètres complets. Cependant, cela échouera pour certains personnages en raison de l'utilisation non échappée dans l'expression régulière. Selon la façon dont »la chaîne peut contenir n'importe quel caractère« doit être comprise, cela pourrait être un problème.
Joey
@Joey merci pour l'astuce sur sort -u, mais en ce qui concerne le $ x, je n'ai pas pu le faire fonctionner [char[]]"$args"|sort -u|%{"$_="+($args-split"[^$_]"|sort)[-1].length}, il semble que le deuxième $ args soit vide ... - darkajax il y a 17 minutes
DarkAjax
Eep, oui. Désolé. C'est parce qu'il est dans un bloc de script, qui a ses propres arguments ( $argsil n'y a plus celui du script).
Joey
2

Perl - 65 71 76 caractères

Mon premier golf de code!

Pour chaque réponse, copiez sur golf.pl et exécutez comme:

echo acbaabbbaaaaacc | perl golf.pl

Ma solution la plus courte imprime chaque caractère autant de fois qu'il apparaît, car cela n'est pas interdit par les règles.

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

Ma solution la plus courte (85 90 caractères) n'imprime chaque caractère qu'une seule fois:

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

Dans FSI, appeler

f "acbaabbbaaaaacc"

donne

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

Cependant, pour l'imprimer sans les informations supplémentaires, appelez-le comme ceci:

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

qui donne

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

Javascript, 116 octets

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

Exemple de sortie:

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

T-SQL (2012) 189 171

Modifier: supprimé ORDER BYcar les règles autorisent tout ordre de sortie.

Prend l'entrée d'une variable CHAR @aet utilise un CTE récursif pour créer une ligne pour chaque caractère de la chaîne et détermine les occurrences séquentielles.

Après cela, c'est simple SELECTetGROUP BY en tenant compte de l'ordre de sortie.

Essayez-le sur 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

Affectation de la variable:

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

Exemple de sortie:

a=5
c=2
b=3
comfortablydrei
la source
Je ne pense pas avoir vu de solution SQL ici auparavant. Intéressant.
Seiyria
considérez la strfonction, au lieu de ltrim. Vous pouvez également nommer votre variable @pour enregistrer un caractère. Cela vous permet de perdre la ivariable dans le rcte. Je pense que vous pouvez raser pas mal de caractères de cette façon. Vous pouvez également être en mesure de réécrire la requête en utilisant une fonction de fenêtrage comme sum sur les lignes précédant ou lag. Je ne sais pas encore comment vous déranger.
Michael B
@MichaelB merci pour les conseils. Le problème que j'ai avec str () est qu'il génère un tas d'espaces supplémentaires. Je vais certainement commencer à utiliser @ comme variable!
comfortablydrei
C'est vrai que ça strsort toujours 10 caractères, mais c'est du golf: P
Michael B
1

Haskell - 113 120 octets

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

Testé avec

$ printf "acbaabbbaaaaacc" | ./sl
[('a',5),('b',3),('c',2)]
gxtaillon
la source
Vous pouvez utiliser la fonction .(composer) pour éviter de créer un lambda où le paramètre n'apparaît qu'après la fin d'une chaîne de $fonctions connectées. Pour ce faire, changez simplement tous les $s en .s (exemple: (\i->reverse$sort$group i)se transforme en reverse.sort.group.
YawarRaza7349
1

JavaScript [83 octets]

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

Exécutez ce code dans la console du navigateur.

Pour l'entrée " acbaabbbaaaaacc", la console doit afficher " Object {a: 5, b: 3, c: 2}".

Vision
la source
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: Ma première solution obéit aux règles, mais elle imprime plusieurs fois des occurrences de caractère unique comme abab=> a=1,b=1,a=1,b=1alors je suis sorti avec ceci ( 101 caractères), pour ceux qui ne sont pas satisfaits de ma première:

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

Julia, 85 ans

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
la source
0

Python3 - 111, 126, 115 114 111 octets

Code exécutable qui lira 1 ligne (utilisez uniquement des lettres minuscules 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]

Edit: Exclusion de sortie inutile sur demande de @Therare

La sortie a l'air sympa

~/codegolf $ python3 maxseq.py 
helloworld
l=3
o=2
h=1
e=1
d=1
w=1
r=1
Chien manger chat monde
la source
Vous devez vraiment exclure la sortie inutile. (Je pense)
seequ
"fixe" la sortie
Dog eat cat world
Vous pouvez supprimer les espaces entre les accolades, les nombres et les mots clés, tels que forou if.
seequ
3
Je pense que vous avez mal lu les questions. l=2et o=1pour "helloworld"
gnibbler
4
Vous comptez le nombre total d'apparitions au lieu du maximum d'apparitions consécutives.
xnor
0

JavaScript - 141 137 125

Je n'aime pas 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}

Courir

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

les sorties

[ c: 2, a: 5, b: 3 ]
Mat
la source
0

Javascript, 109 104 100 98 octets

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}

Exemple d'utilisation:

console.log(c("aaaaaddfffabbbbdb"))

les sorties:

{ a: 5, d: 2, f: 3, b: 4 }
duveteux
la source
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);}

usage

_('asdaaaadddscc');

imprimé

Array ( [a] => 4 [s] => 1 [d] => 3 [c] => 2 )
dernier octet
la source
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));}}
user902383
la source
Fonctionne-t-il import java.util.*;en Java?
seequ
oui et je colle l'ancien code
user902383
L'OP a dit qu'il pourrait s'agir simplement d'une fonction / méthode, vous pouvez donc la raccourcir simplement en méthode.
Rudi Kershaw
Cela renvoie toutes les occurrences du caractère dans la chaîne, pas les sous-chaînes les plus longues constituées du caractère. Par exemple, acbaabbbaaaaaccsorties a=8; b=4; c=3au lieu de a=5; b=3; c=2.
Kevin Cruijssen
0

C 169

Itère chaque caractère imprimable dans la table ASCII et compte le maximum à partir de la chaîne d'entrée.

#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
la source
L'avez-vous testé? Il ne semble pas produire une sortie correcte sur beaucoup de cordes, et ne répond pas non plus à la spécification qui dit que l'entrée peut durer jusqu'à 1024 ... en plus, il y a beaucoup de techniques de golf faciles que vous avez manqué. :)
moelleux
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])
marteau-de-loup
la source
0

Groovy - 80 caractères

Sur la base de cette réponse intelligente de xnor :

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

Sortie:

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

Non 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
la source
Est-ce que cela compte réellement la longueur de séquence maximale? Je ne vois pas comment cela fonctionnerait correctement pour une chaîne comme "aabbbbaaaabbbbbba" bien que je ne connaisse pas Groovy non plus.
duveteux
Cela fonctionne pour votre exemple. J'ai mis à jour la version non golfée. Notez que "a" * 4 == "aaaa".
Michael Easter
Ah, je vois comment ça fonctionne maintenant. Intelligent.
moelleux