Finde die maximale Sequenzlänge

29

Angenommen, wir haben eine Zeichenfolge und möchten die maximal wiederholte Folge jedes Buchstabens ermitteln.

Beispiel für die Beispieleingabe:

"acbaabbbaaaaacc"

Die Ausgabe für die Beispieleingabe kann sein:

a=5
c=2
b=3

Regeln:

  • Ihr Code kann eine Funktion oder ein Programm sein - Sie haben die Wahl
  • Die Eingabe kann über Standard-, Datei- oder Funktionsparameter erfolgen
  • Die Ausgabe sollte nur Zeichen enthalten, die in der Eingabe erscheinen
  • Die maximale Länge der Eingabe beträgt 1024
  • Die Ausgabereihenfolge spielt keine Rolle, muss jedoch in der Form [char] = [maximale Wiederholungssequenz] [Trennzeichen] ausgedruckt werden
  • Die Zeichenfolge kann ein beliebiges Zeichen enthalten

Der Wettbewerb endet am Donnerstag, den 3. um 23:59 UTC.

yossico
quelle
Gibt es ein Maximum für die Länge der Eingabezeichenfolge?
Sigma
2
Muss die Ausgabe genau so sein wie angegeben? Können wir 0 für Buchstaben sagen, die nicht erscheinen? Wird jeder Buchstabe bis zum höchsten Buchstaben mindestens einmal vorkommen?
25.
1
Bitte klären Sie, ob die Ausgabe genau so formatiert werden muss, wie in Ihrer Frage angegeben. Mindestens 10 der aktuellen 16 Antworten verwenden ein anderes Format, drei andere präsentieren zwei verschiedene Versionen.
Dennis
1
@Joey Du solltest wahrscheinlich fürs Golfen bestrafen. Wenn Sie es dulden, werde ich es l:S_&{'=L{2$+_S\#)}g,(N}/in Produktionssystemen sehen! Und ich werde deinen Namen verfluchen.
Cruncher

Antworten:

22

8086 Maschinencode, 82 80

Inhalt der x.comDatei:

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

Es werden nur Wiederholungen mit bis zu 99 Zeichen unterstützt.

Quellcode (diente als Eingabe für den debug.comAssembler), mit Kommentaren!

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

Hier sind einige Golftechniken, die meiner Meinung nach Spaß gemacht haben:

  • Die Adresse des Arrays ist 3d00, wo 3dist der ASCII-Code für =. Auf diese Weise xlautet die Adresse für den Zeicheneintrag des Arrays 3d78. Wenn es als 2-stellige Zeichenfolge interpretiert wird, ist es x=.
  • Der Ausgabepuffer befindet sich an der Adresse 104. Er überschreibt den nicht mehr benötigten Initialisierungscode. Die Zeilenende-Sequenz 0D 0A 24wird als harmloser Code ausgeführt.
  • Die aamAnweisung hier bietet keine Golf, obwohl es könnte ...
  • Schreiben Sie die Zahl zweimal, wobei Sie zunächst davon ausgehen, dass sie größer als 10 ist, und korrigieren Sie dann, ob sie kleiner ist.
  • Die Anweisung zum Beenden befindet sich an einer undurchsichtigen Adresse 11b, die den erforderlichen Maschinencode enthält C3.
anatolyg
quelle
Interessanter Ansatz. Bei einer Beschränkung auf 99 Wiederholungen würde dies jedoch nicht für Fälle gelten, in denen die Eingabe von 1024 aaaa geliefert wird.
Homer6
14

CJam, 27 26 25 Bytes

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

Probieren Sie es online aus.

Beispiel

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

Wie es funktioniert

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
quelle
9

J - 52 Bytes

Nun, wieder ein einfacher Ansatz.

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

Erläuterung:

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

Beispiel:

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

Wenn die Ausgabe in freier Form zulässig ist (wie in vielen anderen Antworten), habe ich auch eine 45-Byte- Version. Diese Felder stellen eine Liste von Feldern dar (ja, sie werden so gedruckt, obwohl sie durch die Zeilenhöhe von SE unterbrochen werden).

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

Rubin, 72

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

Dadurch werden Eingaben von Befehlszeilenargumenten und Ausgaben an stdout gesendet.

ängstlich
quelle
charsist etwas kürzer als split("").
Ventero
@Ventero Ich habe das versucht, aber es charsgibt einen Enumerator anstelle eines Arrays. Ich bin in 1.9.3, also ist es eine 2.0 Sache?
ängstlich
Ja, in 2.0 wird charsein Array zurückgegeben.
Ventero
Es kann die Regeln ein bisschen strecken, aber vielleicht pstatt puts?
Shelvacu
1
Aha. Obwohl das es weniger hübsch macht, kann ich nicht sehen, dass es trotzdem gegen Regeln verstoßen würde.
Daniero
7

GolfScript, 26 Bytes

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

Probieren Sie es online aus.

Erläuterung:

  • :sspeichert die Eingabezeichenfolge sfür die spätere Verwendung in der Variablen .
  • .&extrahiert die eindeutigen Zeichen in der Eingabe, die der Rest des Codes in der { }%Schleife dann durchläuft.
  • 61 Drückt die Zahl 61 (ASCII-Code für ein Gleichheitszeichen) über das aktuelle Zeichen im Stapel, um als Ausgabebegrenzer zu fungieren.
  • {2$=}s%Nimmt den String sund ersetzt seine Zeichen durch eine 1, wenn sie dem aktuellen Zeichen entsprechen, über das iteriert wird, oder 0, wenn sie dies nicht tun. (Außerdem bleibt das aktuelle Zeichen für die Ausgabe auf dem Stapel.)
  • 1,/ Nimmt diese Folge von Einsen und Nullen und teilt sie in Nullen auf.
  • $sortiert die resultierenden Teilzeichenfolgen, -1=extrahiert die letzte Teilzeichenfolge (die, da sie alle aus Wiederholungen desselben Zeichens bestehen, die längste ist) und ,gibt die Länge dieser Teilzeichenfolge zurück.
  • n+ stringifiziert die Länge und fügt eine neue Zeile hinzu.

Ps. Wenn die Gleichheitszeichen in der Ausgabe optional sind, 61kann das für eine Gesamtlänge von 24 Bytes weggelassen (und 2$durch ersetzt 1$) werden :

:s.&{{1$=}s%1,/$-1=,n+}%
Ilmari Karonen
quelle
1
Sie können die Swap speichern , wenn Sie die Push 61zuerst: :s.&{61{2$=}s%1,/$-1=,n+}%.
Howard
@ Howard: Danke!
Ilmari Karonen
6

CoffeeScript, 109 Bytes

Ich mag 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'

Hier ist das kompilierte JavaScript, das Sie in der Konsole Ihres Browsers testen können

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

Dann kannst du anrufen

f("acbaabbbaaaaacc")

bekommen

c=2
a=5
b=3
Martin Ender
quelle
Dies scheint zu falschen Ergebnissen für Eingaben wie zu führen aaaabaa.
Ventero
@Ventero Sie haben Recht, es gibt zwei Probleme. eines ist leicht zu reparieren, aber ich muss über das andere nachdenken.
Martin Ender
@Ventero behoben.
Martin Ender
5

Pyth , 24 25 26 (oder 29)

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

Test kann hier gemacht werden: Link

Ausgaben im Format:

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

Erläuterung:

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

Für eine korrekte Ausgabe (a = 5) verwenden Sie:

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

29 Zeichen

isaacg
quelle
Scheint, als hättest du genau die gleiche Idee. Habe eine +1 dafür.
Siehe auch
@TheRare Ja, das scheint eine sehr gute Möglichkeit zu sein.
Isaacg
Nicht wirklich mit Ihrem Algorithmus verwandt, aber die Python-Ausgabe ist verwirrend, weil k=''sie an anderer Stelle definiert ist.
gggg
Ja, tut mir leid. Ich werde daran arbeiten, es zu verbessern. Ich werde es auch bearbeiten.
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]);}

Laufen:

$ gcc seq.c 2>& /dev/null
$ echo -n 'acbaabbbaaaaacc' | ./a.out
c=2
b=3
a=5
flauschige
quelle
Sie könnten ersetzen getchar()>0durch ~getchar()wie in dieser Antwort
anatolyg
@anatolyg Ist EOF garantiert genau -1? Ich dachte, es wurde nur speziell als <0 definiert.
flauschige
Ich denke, -1 ist weit verbreitet (dh Windows und Linux), so dass Sie es für Code Golf annehmen können. Für Seriencode less than zeroist das vollkommen in Ordnung, == EOFist aber klarer.
Anatolyg
@anatolyg Sicher, und tatsächlich wird laut Spezifikation EOF anscheinend nicht einmal garantiert, dass es <0 ist - es könnte auch zum Beispiel 256 sein. Ich speichere also nur das einzelne Byte. :)
flauschige
2
EOFist garantiert negativ und -1 wird verwendet, auch wenn chares signiert ist; siehe hier
anatolyg
4

Mathematica , 74, 72, 69

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

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

Nicht sehr gut, aber die Saiten sind nicht die besten in Mathematica . Es wird aber besser. :-)

Mr.Wizard
quelle
Dies ist ziemlich beeindruckend Golfen (dies zu sagen, nachdem ich es selbst ausprobiert habe ...)
Szabolcs
v10, keine vollständige Lösung: First@*MaximalBy[Length] /@ GroupBy[First]@Split@Characters[#] & Zumindest ist es ziemlich einfach und lesbar.
Szabolcs
@ Szabolcs Danke! Was ist der Unterschied zwischen GroupByund GatherBy?
Mr.Wizard
Der Hauptunterschied ist, dass ein GroupByzurückgibt Association. Ich habe die anderen Unterschiede noch nicht im Detail untersucht. reference.wolfram.com/language/ref/GroupBy.html Sie können es in der Cloud mit einem kostenlosen Konto ausprobieren (so spiele ich mit diesen).
Szabolcs
3

C # (LinQPad)

146

Dies ist Tsavinos Antwort, aber kürzer. Hier habe ich Distinct()statt GroupBy(c=>c). Auch die geschweiften Klammern aus dem foreach-loopsind weggelassen:

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

Ich habe versucht , eine mit lambda expressionanstelle der normalen Abfragesyntax aber da ich ein notwendigen Cast<Match>ersten, der Code wurde 1 Zeichen mehr ... Wie auch immer, da es in LINQPad ausgeführt werden kann, können Sie Dump()statt 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();}

Weitere Studien des Codes brachten mich zum Nachdenken über Max(). Diese Funktion akzeptiert auch a Func. Auf diese Weise könnte ich den SelectTeil überspringen, wenn ich die Lambda-Epxression verwende:

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

Somit ist das Endergebnis:

128

Aktualisieren:

Dank dem Tipp von Dan Puzey konnte ich weitere 6 Zeichen speichern:

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

Länge:

122

Abbas
quelle
Vielen Dank für Ihre Verbesserungen, ich wusste nichts über den Trick mit der .Dump () in LinqPad. Um ehrlich zu sein, habe ich den Code in Visual Studio entwickelt und in LinqPad kopiert, um einige Zeichen zu speichern, da LinqPad keine Hauptmethode benötigt.
Tsavinho
Vielen Dank! Ich habe vor Dump()kurzem auch die Methode kennengelernt, die jedes Mal mehr als 10 Zeichen spart :) Die geschweiften Klammern waren einfach und der Rest war ein bisschen knackig: D
Abbas
1
Wenn Sie gerne den LinqPad- IEnumerableAnzeigestil verwenden, können Sie weitere 8 Zeichen speichern, und zwar als Ihren Körper: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)

Sogar Golf-Python kann sehr gut gelesen werden. Ich denke, dieser Code ist bis auf Variablen mit einem Buchstaben und einer einzeiligen while-Schleife vollständig idiomatisch.

Beispiel läuft:

>>> helloworld
e = 1
d = 1
h = 1
l = 2
o = 1
r = 1
w = 1
>>> acbaabbbaaaaacc
a = 5
c = 2
b = 3
xnor
quelle
Dies ist eine interessante Lösung
Cruncher
1
Wenn Sie die Menge (n) auf "s" ändern, werden die Anforderungen meiner Meinung nach immer noch erfüllt. Nirgendwo heißt es, dass jedes Zeichen nur einmal gedruckt werden darf.
Cruncher
@Cruncher Ich bin damit einverstanden, dass das OP nicht jeden Buchstaben einmal spezifiziert, aber die anderen Python-Antworten scheinen es anzunehmen, also werde ich mich daran halten, um vergleichbar zu sein. Die Ausgabeformate sind jedoch immer noch inkonsistent. Ich wünschte, das OP hätte auf die Aufforderung zur Klärung reagiert.
26.
2

Rubin, 58

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

Übernimmt die Eingabe von STDIN und gibt sie im Formular an STDOUT aus {"a"=>5, "c"=>2, "b"=>3}

Histokrat
quelle
2

C # in LINQPad - 159 Bytes

Nun, zumindest habe ich T-SQL besiegt; P Ich werde niemanden besiegen, aber ich dachte, ich würde es trotzdem teilen.

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

Verwendung:

v("acbaabbbaaaaacc");

Vorschläge sind immer willkommen!

Tsavinho
quelle
Gute Antwort! Ich habe einige Vorschläge, aber das war zu lang für einen Kommentar. Klicken Sie hier für meine Antwort. :)
Abbas
2

Powershell 80 77 72

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

Sie müssen es auf der Konsole ausführen ...

DarkAjax
quelle
1
$xist überflüssig. Sie sind drei Byte kürzer, wenn Sie es nicht verwenden. Auch sort -ugenügt. Es ist selten erforderlich, die vollständigen Parameternamen zu buchstabieren. Dies schlägt jedoch für bestimmte Zeichen fehl, da die Regex-Zeichen nicht weiter verwendet werden. Je nachdem, wie »Der String kann ein beliebiges Zeichen enthalten« zu verstehen ist, könnte dies ein Problem sein.
Joey
@Joey danke für den Tipp zu sort -u, aber in Bezug auf die $ x konnte ich es nicht zum [char[]]"$args"|sort -u|%{"$_="+($args-split"[^$_]"|sort)[-1].length}Laufen bringen, es scheint, dass die zweiten $ args leer sind ... - darkajax vor 17 Minuten
DarkAjax
Eep, ja. Es tut uns leid. Das liegt daran, dass es sich um einen Skriptblock handelt, der seine eigenen Argumente hat ( $argsdas Skript ist nicht mehr vorhanden).
Joey
2

Perl - 65 71 76 Zeichen

Mein erster Code Golf!

Kopieren Sie für jede Antwort auf golf.pl und führen Sie Folgendes aus:

echo acbaabbbaaaaacc | perl golf.pl

Meine kürzeste Lösung gibt jedes Zeichen so oft aus, wie es angezeigt wird, da dies durch die Regeln nicht verboten ist.

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

Meine nächstkürzere Lösung (85 bis 90 Zeichen) druckt jedes Zeichen nur einmal aus:

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

In FSI anrufen

f "acbaabbbaaaaacc"

gibt

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

Um es jedoch ohne die zusätzlichen Informationen zu drucken, rufen Sie es folgendermaßen auf:

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

was gibt

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

Beispielausgabe:

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

T-SQL (2012) 189 171

Bearbeiten: entfernt, ORDER BYda Regeln eine Ausgabereihenfolge zulassen.

Nimmt Eingaben von einer CHAR-Variablen entgegen @aund erstellt mithilfe eines rekursiven CTE eine Zeile für jedes Zeichen in der Zeichenfolge und ermittelt sequenzielle Vorkommen.

Danach ist es eine einfache SELECTund GROUP BYmit Rücksicht auf die Reihenfolge der Ausgabe.

Probieren Sie es auf SQL Fiddle aus.

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

Zuweisen der Variablen:

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

Beispielausgabe:

a=5
c=2
b=3
bequemdrei
quelle
Ich glaube, ich habe hier noch nie eine SQL-Lösung gesehen. Interessant.
Seiyria
Betrachten Sie die strFunktion anstelle von ltrim. Sie können Ihrer Variablen auch einen Namen geben @, um ein Zeichen zu speichern. Dadurch können Sie die iVariable in der Datei verlieren . Ich denke, Sie können sich auf diese Weise einige Zeichen rasieren. Möglicherweise können Sie die Abfrage auch mit einer Fensterfunktion wie Summe über Zeilen vor oder Verzögerung neu schreiben. Ich habe noch nicht genau herausgefunden, wie es Ihnen geht.
Michael B
@MichaelB danke für den Rat. Das Problem, das ich mit str () habe, ist, dass es eine Reihe von zusätzlichen Leerzeichen ausgibt. Ich werde definitiv anfangen, @ als Variable zu verwenden!
comfortablydrei
Es ist wahr, dass strimmer 10 Zeichen ausgegeben werden, aber das ist Golfen: 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

Getestet mit

$ printf "acbaabbbaaaaacc" | ./sl
[('a',5),('b',3),('c',2)]
Gxtaillon
quelle
Mit der .Funktion (komponieren) können Sie vermeiden, dass ein Lambda erstellt wird, bei dem der Parameter erst nach dem Ende einer Kette $verbundener Funktionen angezeigt wird . Ändern Sie dazu einfach alle $s in .s (Beispiel: (\i->reverse$sort$group i)wird zu reverse.sort.group.
YawarRaza7349
1

JavaScript [83 Bytes]

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

Führen Sie diesen Code in der Browserkonsole aus.

Bei " acbaabbbaaaaacc" Eingaben sollte die Konsole " Object {a: 5, b: 3, c: 2}" ausgeben .

Vision
quelle
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)

BEARBEITEN: Meine erste Lösung befolgt die Regeln, gibt jedoch mehrere Male einzelne Zeichen wie abab=> aus, a=1,b=1,a=1,b=1so dass ich dies herauskam ( 101 Zeichen), für diejenigen, die mit meiner ersten nicht zufrieden sind:

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

Julia, 85 Jahre alt

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
quelle
0

Python3 - 111, 126, 115 114 111 Bytes

Ausführbarer Code, der 1 Zeile liest (nur Kleinbuchstaben az verwenden)

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]

Bearbeiten: Nicht benötigte Ausgabe auf Anfrage von @Therare ausschließen

Die Ausgabe sieht gut aus

~/codegolf $ python3 maxseq.py 
helloworld
l=3
o=2
h=1
e=1
d=1
w=1
r=1
Hund essen Katzenwelt
quelle
Sie sollten die unnötige Ausgabe wirklich ausschließen. (Ich denke)
Siehe auch
Ausgabe "korrigiert"
Hund frisst Katzenwelt
Sie können Leerzeichen zwischen geschweiften Klammern, Zahlen und Schlüsselwörtern wie foroder entfernen if.
Siehe auch
3
Ich denke, Sie haben die Fragen falsch verstanden. l=2und o=1für "helloworld"
Gnibbler
4
Sie zählen die Gesamtanzahl der Auftritte anstatt der maximalen Anzahl aufeinanderfolgender Auftritte.
Xnor
0

JavaScript - 141 137 125

Ich mag Regex nicht :)

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}

Lauf

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

Ausgänge

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

Anwendungsbeispiel:

console.log(c("aaaaaddfffabbbbdb"))

Ausgänge:

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

Verwendung

_('asdaaaadddscc');

gedruckt

Array ( [a] => 4 [s] => 1 [d] => 3 [c] => 2 )
lastbyte
quelle
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
quelle
Funktioniert import java.util.*;in Java?
Siehe auch
Ja und ich
füge
Das OP sagte, es könnte nur eine Funktion / Methode sein, so dass Sie dies einfach auf die Methode verkürzen können.
Rudi Kershaw
Dies gibt alle Vorkommen des Zeichens in der Zeichenfolge aus, nicht die längsten Teilzeichenfolgen, die aus dem Zeichen bestehen. Zum Beispiel acbaabbbaaaaaccAusgänge a=8; b=4; c=3statt a=5; b=3; c=2.
Kevin Cruijssen
0

C 169

Durchläuft jedes druckbare Zeichen in der ASCII-Tabelle und zählt maximal die eingegebene Zeichenfolge.

#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
quelle
Hast du das getestet? Es sieht nicht so aus, als würde es eine korrekte Ausgabe für viele Saiten erzeugen, und es entspricht auch nicht der Spezifikation, die besagt, dass die Eingabe bis zu 1024 lang sein kann. Außerdem gibt es eine Menge einfacher Golftechniken, die Sie haben verpasst :)
flauschige
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])
Wolfhammer
quelle
0

Groovy - 80 Zeichen

Basierend auf dieser cleveren Antwort von xnor :

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

Ausgabe:

$ 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}"
}
Michael Easter
quelle
Zählt das eigentlich die maximale Sequenzlänge? Ich verstehe nicht, wie das für eine Zeichenfolge wie "aabbbbaaaabbbbbba" richtig funktionieren würde, obwohl ich Groovy auch nicht kenne.
flauschige
Es funktioniert für dein Beispiel. Ich habe die ungolfed Version aktualisiert. Beachten Sie, dass "a" * 4 == "aaaa".
Michael Easter
Ah, ich sehe, wie es jetzt funktioniert. Klug.
flauschige