Znajdź maksymalną długość sekwencji

29

Załóżmy, że mamy ciąg znaków i chcemy znaleźć maksymalną powtarzalną sekwencję każdej litery.

Na przykład biorąc pod uwagę przykładowe dane wejściowe:

"acbaabbbaaaaacc"

Dane wyjściowe dla próbki wejściowej mogą być:

a=5
c=2
b=3

Zasady:

  • Twój kod może być funkcją lub programem - do wyboru
  • Dane wejściowe mogą być wprowadzane przez stdin, plik lub parametr funkcji
  • Dane wyjściowe powinny zawierać tylko znaki pojawiające się na wejściu
  • Maksymalna długość wejściowa to 1024
  • Kolejność wyjściowa nie ma znaczenia, ale musi być wydrukowana w postaci [char] = [maksymalna powtarzana sekwencja] [separator]
  • Ciąg może zawierać dowolny znak

Zawody kończą się w czwartek 3 o 23:59 UTC.

Yossico
źródło
Czy istnieje maksymalna długość ciągu wejściowego?
sigma
2
Czy wynik musi być dokładnie taki, jak podano? Czy możemy powiedzieć 0 dla liter, które się nie pojawiają? Czy każda litera do najwyższej litery pojawi się przynajmniej raz?
xnor
1
Wyjaśnij, czy dane wyjściowe muszą być sformatowane dokładnie tak, jak podano w pytaniu. Co najmniej 10 z 16 aktualnych odpowiedzi ma inny format, trzy pozostałe przedstawiają dwie różne wersje.
Dennis
1
@Joey Prawdopodobnie powinieneś ukarać za grę w golfa. Przez zaakceptowanie tego, skończę l:S_&{'=L{2$+_S\#)}g,(N}/w systemach produkcyjnych! I przeklnę twoje imię.
Cruncher

Odpowiedzi:

22

Kod maszynowy 8086, 82 80

Zawartość x.compliku:

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

Obsługuje tylko powtórzenia do 99 znaków.

Kod źródłowy (służył jako dane wejściowe dla debug.comasemblera), z komentarzami!

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

Oto kilka technik golfowych, które według mnie były zabawne:

  • adres tablicy to 3d00, gdzie 3djest kod ascii =. W ten sposób adres wpisu tablicy dla znaku xto 3d78. Zinterpretowany jako ciąg 2 znaków, jest x=.
  • Bufor wyjściowy jest pod adresem 104; zastępuje niepotrzebny już kod inicjujący. Sekwencja końca linii 0D 0A 24jest wykonywana jako nieszkodliwy kod.
  • Niniejsza aaminstrukcja nie zapewnia gry w golfa, ale mogłaby ...
  • Dwukrotne zapisanie liczby, najpierw zakładając, że jest ona większa niż 10, a następnie poprawka, jeśli jest mniejsza.
  • Instrukcja wyjścia znajduje się pod nieznanym adresem 11b, który na C3szczęście zawiera potrzebny kod maszynowy .
anatolig
źródło
Ciekawe podejście Jednak przy ograniczeniu 99 powtórzeń nie obsługuje przypadków, w których dostarczany jest sygnał wejściowy 1024 aaaa.
Homer6
14

CJam, 27 26 25 bajtów

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

Wypróbuj online.

Przykład

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

Jak to działa

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
źródło
9

J - 52 bajty

Cóż, znowu proste podejście.

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

Wyjaśnienie:

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

Przykład:

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

Jeśli dane wyjściowe w dowolnej formie są dozwolone (jak w wielu innych odpowiedziach), mam również wersję 45-bajtową . Te pola reprezentują listę pól (tak, są wydrukowane w ten sposób, chociaż wysokość linii SE je łamie).

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

Ruby, 72

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

To pobiera dane wejściowe z argumentów wiersza poleceń i danych wyjściowych na standardowe wyjście.

obolały
źródło
charsjest nieco krótszy niż split("").
Ventero,
@Ventero Próbowałem tego, ale charspodaje moduł wyliczający zamiast tablicy. Mam wersję 1.9.3, więc czy jest to coś 2.0?
obrzydliwy
Tak, w wersji 2.0 charszwraca tablicę.
Ventero
Może to trochę rozszerza reguły, ale może pzamiast tego użyć puts?
Shelvacu
1
Widzę. Chociaż to sprawia, że ​​jest mniej ładna, nie widzę, że złamałoby to wszelkie zasady.
daniero
7

GolfScript, 26 bajtów

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

Wypróbuj online.

Wyjaśnienie:

  • :szapisuje ciąg wejściowy w zmiennej sdo późniejszego użycia.
  • .&wyodrębnia unikalne znaki z wejścia, które { }%następnie iteruje reszta kodu w pętli.
  • 61 wypycha liczbę 61 (kod ASCII dla znaku równości) na wierzchu bieżącego znaku na stosie, aby działał jako separator wyjściowy.
  • {2$=}s%bierze ciąg si zamienia jego znaki na 1, jeśli są równe iteracji bieżącego znaku, lub 0, jeśli nie. (Pozostawia również bieżący znak na stosie do wydrukowania).
  • 1,/ bierze ten ciąg zer i jedynek i dzieli go na zera.
  • $sortuje powstałe podciągi, -1=wyodrębnia ostatni podłańcuch (który, ponieważ wszystkie składają się z powtórzeń tego samego znaku, jest najdłuższy), i ,zwraca długość tego podłańcucha.
  • n+ określa długość i dodaje do niej nowy wiersz.

Ps. Jeśli znaki równości w danych wyjściowych są opcjonalne, 61można je pominąć (i 2$zastąpić przez 1$), dla całkowitej długości 24 bajtów :

:s.&{{1$=}s%1,/$-1=,n+}%
Ilmari Karonen
źródło
1
Można zapisać swap jeśli nacisnąć 61pierwszy: :s.&{61{2$=}s%1,/$-1=,n+}%.
Howard
@Howard: Dzięki!
Ilmari Karonen
6

CoffeeScript, 109 bajtów

Lubię wyrażenia regularne.

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'

Oto skompilowany JavaScript, który możesz wypróbować w konsoli przeglądarki

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

Następnie możesz zadzwonić

f("acbaabbbaaaaacc")

dostać

c=2
a=5
b=3
Martin Ender
źródło
To wydaje się generować niepoprawne wyniki dla danych wejściowych takich jak aaaabaa.
Ventero
@ Ventero masz rację, są dwa problemy. jeden jest łatwy do naprawienia, ale muszę pomyśleć o drugim.
Martin Ender
@Ventero naprawione.
Martin Ender
5

Pyth , 24 25 26 (lub 29)

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

Test można wykonać tutaj: link

Dane wyjściowe w formacie:

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

Wyjaśnienie:

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

Pyton:

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

Aby uzyskać prawidłowe wyjście (a = 5), użyj:

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

29 znaków

isaacg
źródło
Wygląda na to, że miałeś dokładnie ten sam pomysł. Masz za to +1.
patrz
@ TheRare tak, wydaje się, że to bardzo dobry sposób, aby to zrobić.
isaacg
Nie bardzo związany z twoim algorytmem, ale dane wyjściowe w pythonie są mylące, ponieważ k=''są zdefiniowane gdzie indziej.
gggg
Przepraszam za to. Popracuję nad poprawą. Ja też to zmienię.
isaacg
5

C, 126 125 119 bajtów

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

Bieganie:

$ gcc seq.c 2>& /dev/null
$ echo -n 'acbaabbbaaaaacc' | ./a.out
c=2
b=3
a=5
puszysty
źródło
Możesz zastąpić getchar()>0przez ~getchar()jak w tej odpowiedzi
anatolyg
@anatolyg Czy EOF ma gwarantowane dokładnie -1? Myślałem, że zostało to zdefiniowane tylko jako <0.
puszysty
Myślę, że -1 jest dość powszechne (tj. Windows i Linux), więc możesz założyć to dla Code Golfa. W przypadku kodu produkcyjnego less than zerojest całkowicie OK, ale == EOFbardziej przejrzysty.
anatolyg
@anatolyg Pewnie, i tak naprawdę wydaje mi się, że zgodnie ze specyfikacją EOF najwyraźniej nawet nie ma gwarancji <0 - może to być na przykład 256. Więc po prostu zachowam pojedynczy bajt. :)
puszysty
2
EOFjest gwarantowane jako ujemne, a -1 jest używane, nawet jeśli charjest podpisane; patrz tutaj
anatolyg
4

Mathematica , 74 72 69

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

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

Niezbyt dobre, ale łańcuchy nie są najlepszym obszarem Mathematiki . Jednak coraz lepiej. :-)

Mr.Wizard
źródło
To całkiem imponujące gra w golfa (mówiąc to po tym, jak sam to wypróbowałem ...)
Szabolcs
v10, nie pełne rozwiązanie: First@*MaximalBy[Length] /@ GroupBy[First]@Split@Characters[#] & Przynajmniej jest dość proste i czytelne.
Szabolcs
@Szabolcs Thanks! Jaka jest różnica między GroupByi GatherBy?
Mr.Wizard
Główną różnicą jest to, że GroupByzwraca an Association. Nie zbadałem jeszcze szczegółowo innych różnic. reference.wolfram.com/language/ref/GroupBy.html Możesz wypróbować to w chmurze z bezpłatnym kontem (tak właśnie gram z nimi).
Szabolcs
3

C # (LinQPad)

146

To jest odpowiedź tsavino, ale krótsza. Tutaj użyłem Distinct()zamiast GroupBy(c=>c). Pominięto także nawiasy klamrowe z 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

Próbowałem użyć lambda expressionzamiast normalnej składni zapytania, ale ponieważ potrzebowałem Cast<Match>pierwszej, kod stał się o 1 znak dłuższy ... W każdym razie, ponieważ można go wykonać w LinQPad, możesz użyć Dump()zamiast 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();}

Dalsze badania kodu skłoniły mnie do myślenia o Max(). Ta funkcja akceptuje również Func. W ten sposób mogłem pominąć Selectczęść podczas korzystania z epxresji lambda:

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

Tak więc wynik końcowy:

128

Aktualizacja:

Dzięki wskazówce Dana Puzeya udało mi się uratować kolejne 6 znaków:

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

Długość:

122

Abbas
źródło
Dziękujemy za twoje ulepszenia, nie wiedziałem o sztuczce z .Dump () w LinqPad. Szczerze mówiąc, opracowałem kod w Visual Studio i skopiowałem go do LinqPada, aby zapisać niektóre znaki, ponieważ LinqPad nie potrzebuje głównej metody.
tsavinho
Dzięki! Niedawno też poznałem tę Dump()metodę, za każdym razem oszczędzam ci 10+ znaków :) Kręcone szelki były łatwe, a reszta to trochę łamanie mózgów: D
Abbas
1
Jeśli z przyjemnością używasz IEnumerablestylu wyświetlania LinqPada, możesz zapisać kolejne 8 znaków, z tym swoim ciałem: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)

Nawet golfowy Python może być bardzo czytelny. Myślę, że ten kod jest w pełni idiomatyczny, z wyjątkiem zmiennych jednoliterowych i jednowierszowej pętli while.

Przykładowe przebiegi:

>>> helloworld
e = 1
d = 1
h = 1
l = 2
o = 1
r = 1
w = 1
>>> acbaabbbaaaaacc
a = 5
c = 2
b = 3
xnor
źródło
To ciekawe rozwiązanie
Cruncher
1
jeśli zmienisz zestaw (y) na po prostu s, myślę, że nadal spełnia wymagania. Nigdzie nie jest powiedziane, że każdy znak musi być wydrukowany tylko raz.
Cruncher
@Cruncher Zgadzam się, że OP nie określa każdej litery raz, ale inne odpowiedzi w języku Python wydają się to zakładać, więc pozostanę przy tym, aby być porównywalnym. Chociaż formaty wyjściowe są nadal niespójne. Chciałbym, aby PO odpowiedział na prośby o wyjaśnienie.
xnor
2

Ruby, 58

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

Pobiera dane wejściowe ze STDIN, wysyła je do STDOUT w formularzu {"a"=>5, "c"=>2, "b"=>3}

histocrat
źródło
2

C # w LINQPad - 159 bajtów

Cóż, przynajmniej pokonałem T-SQL; P Nie pobiję nikogo innego, ale pomyślałem, że i tak go podzielę.

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

Stosowanie:

v("acbaabbbaaaaacc");

Sugestie są zawsze mile widziane!

tsavinho
źródło
Świetna odpowiedź! Mam kilka sugestii, ale było to zbyt długo na komentarz, więc kliknij tutaj, aby uzyskać odpowiedź. :)
Abbas
2

PowerShell 80 77 72

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

Musisz uruchomić go na konsoli ...

DarkAjax
źródło
1
$xjest zbyteczny. Nie używasz go o trzy bajty krócej. Również sort -uwystarcza. Rzadko zachodzi potrzeba przeliterowania pełnych nazw parametrów. Nie powiedzie się to jednak w przypadku niektórych znaków z powodu nieokreślonego użycia wyrażenia regularnego. W zależności od tego, jak należy rozumieć „Ciąg znaków może zawierać dowolny znak”, może to stanowić problem.
Joey
@Joey, dziękuję za wskazówkę dotyczącą sortowania -u, jednak jeśli chodzi o $ x, którego nie udało mi się sprawić [char[]]"$args"|sort -u|%{"$_="+($args-split"[^$_]"|sort)[-1].length}, wygląda na to, że drugi $ args jest pusty ... - darkajax 17 minut temu
DarkAjax
Eep tak. Przepraszam. To dlatego, że jest w bloku skryptu, który ma własne argumenty ( $argsnie ma już jednego skryptu).
Joey
2

Perl - 65 71 76 znaków

Mój pierwszy golf golfowy!

Dla każdej odpowiedzi skopiuj na golf.pl i uruchom jako:

echo acbaabbbaaaaacc | perl golf.pl

Moje najkrótsze rozwiązanie drukuje każdą postać tyle razy, ile się pojawia, ponieważ nie jest to zabronione przez reguły.

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

Moje następne najkrótsze rozwiązanie (85 90 znaków) drukuje każdy znak tylko raz:

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

W FSI dzwonienie

f "acbaabbbaaaaacc"

daje

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

Aby jednak wydrukować go bez dodatkowych informacji, nazwij go tak:

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

co daje

val it : Map<char,int> = map [('a', 8); ('b', 4); ('c', 3)]
Jwosty
źródło
1

JavaScript, 116 bajtów

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

Przykładowe dane wyjściowe:

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 
Дамян Станчев
źródło
1

T-SQL (2012) 189 171

Edycja: usunięto, ORDER BYponieważ reguły dopuszczają dowolną kolejność wyjściową.

Pobiera dane wejściowe ze zmiennej CHAR @ai używa rekurencyjnej CTE do utworzenia wiersza dla każdego znaku w ciągu i wykrywa kolejne wystąpienia.

Potem jest to proste SELECTi GROUP BYuwzględnia kolejność wydruków.

Wypróbuj to na 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

Przypisywanie zmiennej:

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

Przykładowe dane wyjściowe:

a=5
c=2
b=3
comfortlydrei
źródło
Nie sądzę, że widziałem tu wcześniej rozwiązanie SQL. Ciekawy.
Seiyria
rozważ strfunkcję, zamiast ltrim. Możesz także nazwać swoją zmienną, @aby zapisać znak. Pozwala to stracić izmienną w rcte. Myślę, że możesz w ten sposób ogolić kilka znaków. Możliwe jest również przepisanie zapytania za pomocą funkcji okienkowania, takiej jak suma nad wierszami poprzedzającymi lub opóźnieniami. Nie do końca ukształtowałem, jak się wam teraz wydaje.
Michael B
@MichaelB dzięki za poradę. Problem z funkcją str () polega na tym, że generuje ona kilka dodatkowych spacji. Na pewno zacznę używać @ jako zmiennej!
komfortowodrei
To prawda, że strzawsze wypisuje 10 znaków, ale to gra w golfa: P
Michael B
1

Haskell - 113 120 bajty

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

Testowane z

$ printf "acbaabbbaaaaacc" | ./sl
[('a',5),('b',3),('c',2)]
gxtaillon
źródło
Możesz użyć funkcji .(komponuj), aby uniknąć tworzenia lambda, w którym parametr pojawia się dopiero po zakończeniu łańcucha $połączonych funkcji. Aby to zrobić, wystarczy zmienić wszystkie $s do .s (Przykład: (\i->reverse$sort$group i)zamienia się reverse.sort.group.
YawarRaza7349
1

JavaScript [83 bajty]

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

Uruchom ten kod w konsoli przeglądarki.

W przypadku wprowadzania „ acbaabbbaaaaacc” konsola powinna wyświetlać „ Object {a: 5, b: 3, c: 2}”.

Wizja
źródło
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)

EDYCJA: Moje pierwsze rozwiązanie jest zgodne z regułami, ale drukuje kilka razy pojedyncze wystąpienia znaku, takie jak abab=>, a=1,b=1,a=1,b=1więc wyszedłem z tym ( 101 znaków), dla tych, którzy nie są zadowoleni z mojego pierwszego:

for(i=0,s=(t=prompt()).match(/((.)\2*)(?!.*\1)/g);c=s[i++];)t.match(c+c[0])||alert(c[0]+'='+c.length)
rdzeń 1024
źródło
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
źródło
0

Python3 - 111, 126, 115 114 111 bajtów

Kod wykonywalny, który będzie czytał 1 linię (używaj tylko małych liter 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]

Edycja: wykluczono niepotrzebne dane wyjściowe na żądanie @Therare

Wynik wygląda ładnie

~/codegolf $ python3 maxseq.py 
helloworld
l=3
o=2
h=1
e=1
d=1
w=1
r=1
Pies je świat kotów
źródło
Naprawdę powinieneś wykluczyć niepotrzebne dane wyjściowe. (Myślę)
patrz
„naprawiono” wyjście
Pies zjada świat kotów
Możesz usunąć spacje między nawiasami, cyframi i słowami kluczowymi, takimi jak forlub if.
patrz
3
Myślę, że źle odczytałeś pytania. l=2a o=1dla „helloworld”
gnibbler
4
Liczysz całkowitą liczbę wystąpień zamiast maksymalnej liczby kolejnych wystąpień.
xnor
0

JavaScript - 141 137 125

Nie lubię wyrażeń regularnych :)

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}

Biegać

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

wyjścia

[ c: 2, a: 5, b: 3 ]
Matt
źródło
0

JavaScript, 109 104 100 98 bajtów

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}

Przykładowe użycie:

console.log(c("aaaaaddfffabbbbdb"))

wyjścia:

{ a: 5, d: 2, f: 3, b: 4 }
puszysty
źródło
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);}

stosowanie

_('asdaaaadddscc');

wydrukowano

Array ( [a] => 4 [s] => 1 [d] => 3 [c] => 2 )
lastbyte
źródło
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));}}
użytkownik902383
źródło
Czy import java.util.*;działa w Javie?
patrz
tak i
wklejam
OP stwierdził, że może to być po prostu funkcja / metoda, dzięki czemu można skrócić to do samej metody.
Rudi Kershaw
Powoduje to wyprowadzenie wszystkich wystąpień znaku w ciągu, a nie najdłuższych podciągów składających się ze znaku. Na przykład acbaabbbaaaaaccwyjścia a=8; b=4; c=3zamiast a=5; b=3; c=2.
Kevin Cruijssen,
0

C 169

Iteruje każdy znak do wydruku w tabeli ASCII i zlicza maksimum z ciągu wejściowego.

#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
źródło
Testowałeś to? Nie wygląda na to, aby generował prawidłowy wynik na wielu ciągach, a także nie spełnia specyfikacji, która mówi, że dane wejściowe mogą mieć długość do 1024 ... plus, istnieje wiele łatwych technik gry w golfa, które masz brakowało. :)
puszysty
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
źródło
0

Groovy - 80 znaków

Na podstawie tej inteligentnej odpowiedzi przez XNOR :

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

Wydajność:

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

Nie golfowany:

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
źródło
Czy to faktycznie liczy maksymalną długość sekwencji? Nie rozumiem, jak to działałoby poprawnie dla łańcucha takiego jak „aabbbbaaaabbbbbba”, chociaż nie znam też Groovy.
puszysty
To działa na twoim przykładzie. Zaktualizowałem wersję bez golfa. Zauważ, że „a” * 4 == „aaaa”.
Michael Easter
Ach, widzę, jak to teraz działa. Sprytny.
puszysty