Найти максимальную длину последовательности

29

Предположим, у нас есть строка, и мы хотим найти максимально повторяющуюся последовательность каждой буквы.

Например, учитывая пример ввода:

"acbaabbbaaaaacc"

Выход для ввода образца может быть:

a=5
c=2
b=3

Правила:

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

Конкурс заканчивается в четверг 3-го в 23:59 UTC.

yossico
источник
Есть ли максимальная длина входной строки?
Сигма
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где 3dascii-код для =. Таким образом, адрес записи массива для символа x- 3d78. Когда интерпретируется как 2-символьная строка, это x=.
  • Выходной буфер находится по адресу 104; он перезаписывает код инициализации, который больше не нужен. Последовательность конца строки 0D 0A 24выполняется как безопасный код.
  • aamИнструкция здесь не предусматривает какой - либо играть в гольф, хотя он мог бы ...
  • Записать число дважды, сначала предположив, что оно больше 10, а затем исправить, если оно меньше.
  • Инструкция по выходу находится по неизвестному адресу 11b, который, C3по счастливой случайности , содержит необходимый машинный код .
anatolyg
источник
Интересный подход. Однако, с ограничением в 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│
└─┴─┘
seequ
источник
8

Руби, 72

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

Он принимает входные данные из аргументов командной строки и выводит на стандартный вывод.

afuous
источник
charsнемного короче split("").
Вентеро
@ Ventero Я попробовал это, но charsвыдает перечислитель, а не массив. Я в 1.9.3, так это 2.0 вещь?
afuous
Ага, в 2.0 charsвозвращает массив.
Вентеро
Это может немного растягивать правила, но, возможно, использовать pвместо puts?
Шелваку
1
Понимаю. Хотя это делает его менее красивым, я не вижу, чтобы это нарушало какие-либо правила.
Даниеро
7

GolfScript, 26 байт

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

Попробуйте онлайн.

Объяснение:

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

Ps. Если знаки равенства в выходных данных являются необязательными, их 61можно опустить (и 2$заменить на 1$) для общей длины 24 байта :

:s.&{{1$=}s%1,/$-1=,n+}%
Илмари Каронен
источник
1
Вы можете сохранить подкачки , если нажать 61первый: :s.&{61{2$=}s%1,/$-1=,n+}%.
Говард
@ Ховард: Спасибо!
Илмари Каронен
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)

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

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

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

29 символов

isaacg
источник
Похоже, у тебя была точно такая же идея. Есть +1 для этого.
seequ
@TheRare да, похоже, это очень хороший способ сделать это.
Исаак
Не совсем связано с вашим алгоритмом, но вывод Python сбивает с толку, потому что k=''определяется в другом месте.
gggg
Да, извините за это. Я буду работать над его улучшением. Я тоже отредактирую это.
Исаак
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 Гарантируется ли EOF ровно -1? Я думал, что это было определено только как <0.
пушистый
Я думаю, что -1 достаточно распространено (то есть Windows и Linux), так что вы можете предположить это для Code Golf. Для производственного кода less than zeroэто нормально, но == EOFболее понятно.
Анатолий
@anatolyg Конечно, и на самом деле я предполагаю, что согласно спецификации EOF даже не гарантированно будет <0 - это также может быть, например, 256. Так что я просто сохраню один байт. :)
пушистый
2
EOFгарантированно будет отрицательным, а -1 используется, даже если charон подписан; смотрите здесь
Анатолиг
4

Mathematica , 74 72 69

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

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

Не очень хорошо, но струны не лучшая область Mathematica . Становится лучше, хотя. :-)

Mr.Wizard
источник
Это очень впечатляющий гольф (говоря это после того, как попробовал сам ...)
Сабольч
v10, не полное решение: по First@*MaximalBy[Length] /@ GroupBy[First]@Split@Characters[#] & крайней мере, оно довольно простое и читаемое.
Сабольч
@Szabolcs Спасибо! Какая разница между GroupByа GatherBy?
Мистер Волшебник
Основное отличие заключается в том, что GroupByвозвращает Association. Я еще не изучал другие различия в деталях. reference.wolfram.com/language/ref/GroupBy.html Вы можете попробовать это в облаке с помощью бесплатной учетной записи (вот как я с ними играю).
Сабольч
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(). Эта функция также принимает 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 не нуждается в основном методе.
tsavinho
Благодарность! Я также только Dump()недавно узнал метод, который экономит вам 10+ символов каждый раз :) Кудрявые скобки были легкими, а остальное было немного поразмыслив: D
Аббас
1
Если вы счастливы использовать стиль IEnumerableотображения LinqPad, вы можете сохранить еще 8 символов, используя это в качестве своего тела:i.Distinct().Select(c=>c+"="+Regex.Matches(i,"["+c+"]+").Cast<Match>().Max(m=>m.Value.Length)).Dump();
Дэн Пьюзи
3

Питон 3 (70)

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

Даже играющий в гольф Питон может быть очень удобочитаемым. Я думаю, что этот код полностью идиоматичен, за исключением однобуквенных переменных и однострочного цикла while.

Пример работы:

>>> helloworld
e = 1
d = 1
h = 1
l = 2
o = 1
r = 1
w = 1
>>> acbaabbbaaaaacc
a = 5
c = 2
b = 3
XNOR
источник
Это интересное решение
Cruncher
1
если вы измените набор (ы) на просто s, я думаю, что он все еще соответствует требованиям. Нигде не говорится, что каждый символ должен быть напечатан только один раз.
Cruncher
@Cruncher Я согласен, что OP не определяет каждую букву один раз, но другие ответы 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}

histocrat
источник
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");

Предложения всегда приветствуются!

tsavinho
источник
Отличный ответ! У меня есть некоторые предложения, но это было слишком долго для комментария, поэтому нажмите здесь, чтобы получить ответ. :)
Аббас
2

Powershell 80 77 72

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

Вам нужно запустить его на консоли ...

DarkAjax
источник
1
$xэто лишнее. Вы на три байта короче не используете его. И sort -uхватает. Редко возникает необходимость прописывать полные имена параметров. Это, однако, не удастся для определенных символов из-за беспрепятственного использования в регулярном выражении. В зависимости от того, как »Строка может содержать любой символ«, это может быть проблемой.
Джои
@Joey, спасибо за подсказку по sort -u, однако, что касается $ x, я не смог заставить его работать так [char[]]"$args"|sort -u|%{"$_="+($args-split"[^$_]"|sort)[-1].length}, как будто вторые $ args пустые ... - darkajax 17 минут назад
DarkAjax
Да, да Сожалею. Это потому, что он находится в блоке скрипта, который имеет свои собственные аргументы ( $argsбольше нет скрипта).
Джои
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
KJP
источник
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

В ФСИ звонит

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)]
Jwosty
источник
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
comfortablydrei
источник
Я не думаю, что видел решение 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)]
gxtaillon
источник
Вы можете использовать .функцию (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)

РЕДАКТИРОВАТЬ: Мое первое решение подчиняется правилам, но оно печатает несколько раз отдельные вхождения символов, такие как 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)
core1024
источник
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}
GGGG
источник
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"
gnibbler
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 ]
Matt
источник
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 )
lastbyte
источник
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
источник
Работает ли import java.util.*;в Java?
seequ
да и я
вставляю
ОП сказал, что это может быть просто функция / метод, поэтому вы можете сократить это до простого метода.
Руди Кершоу
Это выводит все вхождения символа в строке, а не самые длинные подстроки, состоящие из символа. Например, acbaabbbaaaaaccвыходы a=8; b=4; c=3вместо a=5; b=3; c=2.
Кевин Круйссен
0

С 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);}
}
bacchusbeale
источник
Вы проверяли это? Не похоже, что он производит правильный вывод на многих струнах, а также не соответствует спецификации, которая гласит, что ввод может быть длиной до 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])
wolfhammer
источник
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

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}"
}
Майкл Пасха
источник
Это действительно учитывает максимальную длину последовательности? Я не понимаю, как это будет работать правильно для такой строки, как "aabbbbaaaabbbbbba", хотя я не знаю Groovy.
пушистый
Это работает для вашего примера. Я обновил ungolfed версию. Обратите внимание, что "a" * 4 == "aaaa".
Майкл Пасха
Ах, я вижу, как это работает сейчас. Умная.
пушистый