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


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.