Знайдіть максимальну довжину послідовності


29

Припустимо, що у нас є рядок, і ми хочемо знайти максимально повторну послідовність кожної літери.

Наприклад, враховуючи зразок введення:

"acbaabbbaaaaacc"

Вихідним для введення вибірки може бути:

a=5
c=2
b=3

Правила:

  • Ваш код може бути функцією або програмою - ви можете вибрати
  • Введення можна за допомогою параметра stdin, файла або параметра функції
  • Вихід повинен містити лише символи, які відображаються на вході
  • Максимальна довжина вводу - 1024
  • Порядок виводу не має значення, але він повинен бути надрукований у формі [char] = [максимальна повторена послідовність] [роздільник]
  • Рядок може містити будь-який символ

Змагання завершуються в четвер 3 о 23:59 UTC.


Чи є максимум довжини вхідного рядка?
сигма

2
Чи має результат виходу бути таким самим, як заданий? Чи можемо ми сказати 0 для листів, які не з’являються? Чи з'явиться кожна буква до найвищої літери хоча б раз?
xnor

1
Будь ласка, уточнюйте, чи слід форматувати висновок саме так, як це пояснено у вашому запитанні. Щонайменше 10 із 16-ти відповідей використовують інший формат, три інші - дві різні версії.
Денніс

1
@Joey Ви, мабуть, повинні покарати за гольф. Висловлюючи це вибачення, я в кінцевому підсумку бачу l:S_&{'=L{2$+_S\#)}g,(N}/у виробничих системах! І я проклинаю ваше ім’я.
Cruncher

Відповіді:


22

Машинний код 8086, 82 80

Зміст x.comфайлу:

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

Він підтримує лише повторення до 99 символів.

Вихідний код (служив вхідним для debug.comасемблера) з коментарями!

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

Ось декілька методів гольфу, які тут я вважаю цікавими:

  • Адреса масиву - це те 3d00, де 3dзнаходиться код-код ascii =. Таким чином, адреса для запису масиву для символу xє 3d78. Коли інтерпретуються як рядок з 2-символьного, це x=.
  • Вихідний буфер знаходиться за адресою 104; він перезаписує код ініціалізації, який більше не потрібен. Послідовність кінцевих рядків 0D 0A 24виконується як нешкідливий код.
  • aamІнструкція тут не передбачає будь - яких грати в гольф, хоча він міг би ...
  • Написання числа двічі, спочатку припустимо, що воно більше 10, а потім виправлення, якщо воно менше.
  • Інструкція з виходу знаходиться за неясною адресою 11b, де міститься необхідний машинний код C3на щастя.

Цікавий підхід. Однак, обмежившись 99 повторами, він не оброблятиме випадки, коли вводиться 1024 аааа.
Homer6

14

CJam, 27 26 25 байт

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

Спробуйте в Інтернеті.

Приклад

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

Як це працює

l:S       " Read one line from STDIN and store the result in “S”.                   ";
_&        " Intersect the string with itself to remove duplicate characters.        ";
{         " For each unique character “C” in “S”:                                   ";
  '=L     " Push '=' and ''.                                                        ";
  {       "                                                                         ";
    2$+_  " Append “C” and duplicate.                                               ";
    S\#)  " Get the index of the modified string in “S” and increment it.           ";
  }g      " If the result is positive, there is a match; repeat the loop.           ";
  ,       " Retrieve the length of the string.                                      ";
  (       " Decrement to obtain the highest value that did result in a match.       ";
  N       " Push a linefeed.                                                        ";
}/        "                                                                         ";

9

J - 52 байти

Ну і простий підхід знову.

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

Пояснення:

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

Приклад:

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

Якщо дозволено вихід у вільній формі (як у багатьох інших відповідях), у мене також є версія в 45 байт . Ці поля представляють список скриньок (так, вони надруковані так, хоча висота ліній SE розбиває їх).

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

8

Рубі, 72

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

Це вимагає введення аргументів командного рядка та виходів у stdout.


charsтрохи коротше, ніж split("").
Вентеро

@ Вентеро Я спробував це, але charsдає нумератор, а не масив. Я в 1.9.3, так це 2.0 річ?
невдалий

Так, в 2.0 charsповертає масив.
Вентеро

Це може трохи розтягнути правила, але, можливо, використовувати pзамість puts?
Шельваку

1
Розумію. Хоча це робить його менш гарним, я не бачу, що це порушить будь-які правила.
daniero

7

GolfScript, 26 байт

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

Спробуйте в Інтернеті.

Пояснення:

  • :sзберігає рядок введення в змінну sдля подальшого використання.
  • .&витягує унікальні символи на вході, які решта коду в { }%циклі потім повторюється.
  • 61 натискає число 61 (код ASCII для знака рівності) поверх поточного символу на стеку, щоб діяти як роздільник виводу.
  • {2$=}s%приймає рядок sі замінює його символи знаком 1, якщо вони рівні поточному символу, який повторюється, або 0, якщо вони ні. (Він також залишає поточний символ у стеку для виводу.)
  • 1,/ бере цей рядок з одиниць і нулів, і розбиває його на нулі.
  • $сортує отримані підрядки, -1=витягує останню підрядку (яка, оскільки всі вони складаються з повторів одного символу, є найдовшою) та ,повертає довжину цієї підрядки.
  • n+ строфіфікує довжину і додає до неї новий рядок.

Пс. Якщо знаки рівності у висновку є необов’язковими, то 61їх можна опустити (і 2$замінити на 1$) загальною довжиною 24 байти :

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

1
Ви можете зберегти підкачки , якщо натиснути 61перший: :s.&{61{2$=}s%1,/$-1=,n+}%.
Говард

@Howard: Дякую!
Ільмарі Каронен

6

CoffeeScript, 109 байт

Мені подобається регулярний вираз.

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'

Ось складений JavaScript, який ви можете спробувати у консолі браузера

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

Тоді ви можете зателефонувати

f("acbaabbbaaaaacc")

отримати

c=2
a=5
b=3

Це, здається, генерує невірні результати для типу введення aaaabaa.
Вентеро

@ Вентеро ти маєш рацію, є дві проблеми. одне легко виправити, але мені потрібно подумати над іншим.
Мартін Ендер

@ Вентеро виправлено.
Мартін Ендер

5

Pyth , 24 25 26 (або 29)

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

Тест можна зробити тут: посилання

Виходи у форматі:

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

Пояснення:

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

Пітон:

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

Для правильного (a = 5) виводу використовуйте:

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

29 символів


Здається, у вас була точно така ж ідея. Майте +1 для цього.
seequ

@ Так, здається, це дуже вдалий спосіб зробити це.
isaacg

Не дуже пов’язаний з вашим алгоритмом, але вихід python є заплутаним, тому що k=''визначений в іншому місці.
gggg

Так, вибачте з цього приводу. Я буду працювати над її вдосконаленням. Я також його відредагую.
isaacg

5

C, 126 125 119 байт

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

Запуск:

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

Ви могли б замінити getchar()>0на , ~getchar()як в цьому відповідь
anatolyg

@anatolyg Чи гарантовано EOF рівно -1? Я думав, що це визначено лише як <0.
пухнастий

Я думаю, що -1 досить поширений (тобто Windows і Linux), тому ви можете припустити це для Code Golf. Що стосується виробничого коду, less than zeroце цілком нормально, але == EOFбільш зрозуміло.
anatolyg

@anatolyg Зрозуміло, і насправді, мабуть, за специфікацією EOF, мабуть, навіть не гарантується, що буде <0 - це також може бути, наприклад, 256. Тому я просто збережу один байт. :)
пухнастий

2
EOFгарантовано є негативним, а -1 використовується, навіть якщо charвін підписаний; дивіться тут
anatolyg

4

Математика , 74 72 69

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

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

Не дуже добре, але струни - не найкраща область Mathematica . Хоча все краще. :-)


Це досить вражаючий гольф (кажу це після того, як спробував сам ...)
Szabolcs

v10, не повне рішення: First@*MaximalBy[Length] /@ GroupBy[First]@Split@Characters[#] & Принаймні, це досить просто і читабельно.
Саболч

@Szabolcs Дякую! Яка різниця між GroupByі GatherBy?
Mr.Wizard

Основна відмінність полягає в тому, що GroupByповертає Association. Інших відмінностей я ще не вивчив детально. reference.wolfram.com/language/ref/GroupBy.html Ви можете спробувати це у хмарі з безкоштовним обліковим записом (саме так я граю з ними).
Szabolcs

3

C # (LinQPad)

146

Це відповідь цавіно, але коротше. Тут я використав Distinct()замість GroupBy(c=>c). Також 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

Я спробував використати lambda expressionзамість звичайного синтаксису запитів, але оскільки мені знадобився Cast<Match>перший, код став на 1 символ довше ... Так чи інакше, оскільки він може виконуватися в LinQPad, ви можете використовувати Dump()замість 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();}

Подальше вивчення коду змусило мене замислитися над Max(). Ця функція також приймає a Func. Таким чином я міг пропустити Selectчастину при використанні лямбда-експресії:

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

Таким чином, кінцевий результат:

128

Оновлення:

Завдяки підказці від Дена Пузі мені вдалося зберегти ще 6 символів:

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

Довжина:

122


Дякую за ваші вдосконалення, я не знав про хитрість з .Dump () в LinqPad. Якщо чесно, я розробив код у Visual Studio і скопіював його в LinqPad, щоб зберегти деякі символи, оскільки LinqPad не потребує основного методу.
цавіньо

Спасибі! Я також нещодавно познайомився з Dump()методом останнім часом, економить вам щонайменше 10 символів :) Кучеряві брекети були легкими, а решта - трохи мозковим ударом: D
Аббас,

1
Якщо ви із задоволенням використовуєте стиль IEnumerableвідображення LinqPad, ви можете зберегти ще 8 символів, а це - ваше тіло:i.Distinct().Select(c=>c+"="+Regex.Matches(i,"["+c+"]+").Cast<Match>().Max(m=>m.Value.Length)).Dump();
Dan Puzey

3

Пітон 3 (70)

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

Навіть гольф Python може бути дуже читабельним. Я думаю, що цей код є повністю ідіоматичним, за винятком однобуквенних змінних та однорядного циклу while.

Приклад виконання:

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

Це цікаве рішення
Cruncher

1
якщо ви зміните набір (и) на просто s, я думаю, він все ще відповідає вимогам. Ніде не сказано, що кожен знак повинен бути надрукований лише один раз.
Cruncher

@Cruncher Я погоджуюсь, що ОП не вказує кожну букву один раз, але інші відповіді Python, здається, припускають це, тому я буду дотримуватися цього, щоб бути порівнянним. Хоча формати виводу все ще непослідовні. Я б хотів, щоб ОП відповіла на запити про уточнення.
xnor

2

Рубі, 58

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

Бере вхід зі STDIN, виводить його на STDOUT у формі {"a"=>5, "c"=>2, "b"=>3}


2

C # в LINQPad - 159 байт

Ну, принаймні, я переміг T-SQL; P Не переміг би ніхто інший, але я подумав, що все одно поділюсь ним.

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

Використання:

v("acbaabbbaaaaacc");

Пропозиції завжди вітаються!


Чудова відповідь! У мене є кілька пропозицій, але це було занадто довго для коментаря, тому натисніть тут для моєї відповіді. :)
Аббас

2

Powershell 80 77 72

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

Вам потрібно запустити його на консолі ...


1
$xзайве. Ви на три байти коротше, не використовуючи його. Також sort -uдостатньо. Рідко виникає необхідність написання повних імен параметрів. Однак, для певних символів це не вдасться через невикористане використання у регулярній виразці. Залежно від того, як "рядок може містити будь-який символ", слід розуміти, це може бути проблемою.
Joey

@Joey спасибі за підказку про сортування -u, однак щодо $ x я не міг змусити його працювати так [char[]]"$args"|sort -u|%{"$_="+($args-split"[^$_]"|sort)[-1].length}, схоже, другі $ аргументи порожні ... - darkajax 17 хвилин тому
DarkAjax

Так, так. Вибачте. Це тому, що він знаходиться в блоці скриптів, у якого є свої аргументи ( $argsбільше не той, що в сценарії).
Joey

2

Perl - 65 71 76 символів

Мій перший гольф-код!

Кожну відповідь скопіюйте на golf.pl та запустіть як:

echo acbaabbbaaaaacc | perl golf.pl

Моє найкоротше рішення друкує кожного символу стільки разів, скільки з’являється, оскільки це не заборонено правилами.

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

Моє наступне найкоротше рішення (85 90 символів) друкує кожен символ лише один раз:

<>=~s/((.)\2*)(?{$l=length$1;$h{$2}=$l if$l>$h{$2}})//rg;print"$_=$h{$_}
"for keys %h

1

F # - 106

let f s=
 let m=ref(Map.ofList[for c in 'a'..'z'->c,0])
 String.iter(fun c->m:=(!m).Add(c,(!m).[c]+1))s;m

У FSI дзвонять

f "acbaabbbaaaaacc"

дає

val it : Map<char,int> ref =
  {contents =
    map
      [('a', 8); ('b', 4); ('c', 3); ('d', 0); ('e', 0); ('f', 0); ('g', 0);
       ('h', 0); ('i', 0); ...];}

Однак, щоб надрукувати його без додаткової інформації, називайте так:

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

що дає

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

1

Javascript, 116 байт

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

Вибірка зразка:

lollolllollollllollolllooollo
l=4
o=3

acbaabbbaaaaacc
a=5
c=2
b=3

helloworld
h=1
e=1
l=2
o=1
w=1
r=1
d=1 

1

T-SQL (2012) 189 171

Редагувати: видалено, ORDER BYоскільки правила дозволяють будь-який порядок виводу.

Бере вхід із змінної CHAR @a, та використовує рекурсивний CTE для створення рядка для кожного символу в рядку та виводить послідовні події.

Після цього це просто SELECTі GROUP BYз урахуванням порядку виводу.

Спробуйте його на 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

Призначення змінної:

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

Вибірка зразка:

a=5
c=2
b=3

Я не думаю, що раніше я бачив рішення SQL. Цікаво.
Сейрія

розглянемо strфункцію, замість ltrim. Ви також можете назвати свою змінну @для збереження знака. Це дозволяє втратити iзмінну в rcte. Я думаю, що ви можете поголити досить багато символів таким чином. Ви також можете переписати запит за допомогою функції вікна, як сума за рядками, що передують або відстають. Я ще не дуже сформував, як ви все одно пам'ятаєте.
Майкл Б

@MichaelB дякую за пораду. Проблема з str () полягає в тому, що він видає купу додаткових пробілів. Я обов'язково почну використовувати @ як змінну!
comfortablydrei

Це правда, що strзавжди виводиться 10 символів, але це гольф: P
Michael B

1

Хаскелл - 113 120 байт

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

Тестували с

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

Ви можете використовувати .(compose) функцію, щоб уникнути створення лямбда, де параметр з'являється лише після закінчення ланцюга $підключених функцій. Для цього просто змініть всі $s на .s (приклад: (\i->reverse$sort$group i)перетворюється на reverse.sort.group.
YawarRaza7349

1

JavaScript [83 байти]

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

Запустіть цей код у консолі браузера.

Для введення " acbaabbbaaaaacc" консоль повинна вивести " Object {a: 5, b: 3, c: 2}".


1

JavaScript - 91

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

EDIT: Моє перше рішення підпорядковується правилам, але воно друкує кілька разів поодинокі події символів типу abab=> a=1,b=1,a=1,b=1тому я вийшов з цим ( 101 символом), для тих, хто не задоволений моїм першим:

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

0

Юлія, 85 років

f(s)=(l=0;n=1;a=Dict();[c==l?n+=1:(n>get(a,l,1)&&(a[l]=n);n=1;l=c) for c in s*" "];a)
julia> f("acbaabbbaaaaacc")
{'a'=>5,'c'=>2,'b'=>3}

0

Python3 - 111, 126, 115 114 111 байт

Виконаний код, який буде прочитати 1 рядок (використовуйте лише малі літери 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]

Редагувати: Виключено непотрібний вихід на запит від @Therare

Вихід виглядає добре

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

Ви дійсно повинні виключити зайвий вихід. (Я думаю)
seequ

"зафіксований" вихід
Собака їсть котячий світ

Ви можете видалити пробіли між дужками, цифрами та ключовими словами, такими як forабо if.
seequ

3
Я думаю, що ви неправильно прочитали питання. l=2а o=1для "helloworld"
гніблер

4
Ви підраховуєте загальний показ, а не максимум послідовних виступів.
xnor

0

JavaScript - 141 137 125

Мені не подобається регулярний вираз :)

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}

Біжи

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

виходи

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

0

Javascript, 109 104 100 98 байт

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}

Приклад використання:

console.log(c("aaaaaddfffabbbbdb"))

Виходи:

{ a: 5, d: 2, f: 3, b: 4 }

0

PHP, 104 102 96

<?php function _($s){while($n=$s[$i++]){$a[$n]=max($a[$n],$n!=$s[$i-2]?$v=1:++$v);}print_r($a);}

використання

_('asdaaaadddscc');

друковані

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

0

Java 247

import java.util.*;public class a{public static void main(String[]a){Map<Character, Integer> m = new HashMap<>();for(char c:a[0].toCharArray()){Integer v=m.get(c);m.put(c,v==null?1:v+1);}for(char c:m.keySet())System.out.println(c+"="+m.get(c));}}

Чи import java.util.*;працює на Java?
seequ

так, і я вставляю старий код
user902383

ОП заявила, що це може бути просто функцією / методом, тому ви можете скоротити це до простого методу.
Руді Кершо

Це виводить усі входження символу в рядку, а не найдовші підрядки, що складаються з символу. Наприклад, acbaabbbaaaaaccвиводи a=8; b=4; c=3замість a=5; b=3; c=2.
Кевін Кройсейсен

0

C 169

Ітератує кожен символ для друку в таблиці ASCII і рахує макс від вхідного рядка.

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

Ви перевірили це? Це не здається, що він дає правильний вихід на багато струн, а також не відповідає специфікації, яка говорить про те, що введення може бути до 1024 довгих ... плюс, є багато простих технік для гольфу, якими ви користуєтеся пропустив. :)
пухнастий

0

JavaScript 116

prompt(x={}).replace(/(.)\1*/g,function(m,l){n=m.length
if(!x[l]||x[l]<n)x[l]=n})
for(k in x)console.log(k+'='+x[k])

0

Groovy - 80 символів

На підставі цього розумного відповіді по XNOR :

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

Вихід:

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

Безголовки:

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

Це насправді рахує максимальну довжину послідовності? Я не бачу, як це буде правильно працювати для рядка типу "aabbbbaaaabbbbbba", хоча я теж не знаю Groovy.
пухнастий

Це працює для вашого прикладу. Я оновив версію, що не має волі. Зауважте, що "a" * 4 == "aaaa".
Майкл Пасха

Ах, я бачу, як це працює зараз. Розумний.
пухнастий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.