Ваша задача: Написать функцию , которая принимает строку s
, символ c
, и находит длину самого длинного пробега c
в s
. Длина пробега будет l
.
Правила :
- Если
s
имеет длину 0 илиc
пусто,l
должно быть 0. - Если нет экземпляров
c
ins
,l
должно быть 0. - Применяются стандартные лазейки и стандартные правила ввода / вывода .
- Независимо от того, где в
s
прогонеc
s находится,l
должно быть одинаково. - Любые печатные символы ASCII могут появляться в
s
иc
.
Тестовые случаи :
s,c --> l
"Hello, World!",'l' --> 2
"Foobar",'o' --> 2
"abcdef",'e' --> 1
"three spaces",' ' --> 3
"xxx xxxx xx",'x' --> 4
"xxxx xx xxx",'x' --> 4
"",'a' --> 0
"anything",'' --> 0
Победитель :
Как и в случае с code-golf, выигрывает самый короткий ответ на каждом языке.
s
и a,c
которые не содержатся в непустыеs
в ваших тестовых случаях?s
/c
?c
может быть пустым? Во многих языках символ - это просто целое число со специальной семантикой, и у вас тоже не может быть пустого целого числа.Ответы:
05AB1E , 5 байтов
Код:
Использует кодировку 05AB1E . Попробуйте онлайн!
Объяснение:
источник
γ¢M
не работает так, как я думал, думал, что это будет 3 байта.Mathematica, 35 байт
Чистая функция, принимающая список символов и другой символ в качестве входных данных и возвращающая неотрицательное целое число. Улучшено после моих первых попыток, используя наблюдение Аднана (go upvote!) О том, что нужно проверять выравнивание специального символа, прежде чем разбивать массив.
Thread[#==#2]
проверяет, равен ли каждый входной символ в первом аргументе символу, указанному в качестве второго аргумента.Boole
преобразует результирующиеTrue
s иFalse
s в1
s и0
s.Split
разбивает список на серии последовательных элементов;Tr/@
суммирует каждый подсписок иMax
находит победителя. (Из-за тогоMax
, как работает, если первый аргумент является пустым списком, то эта функция возвращает-∞
. Так что, вы знаете, не делайте этого.)первое представление (51 байт)
Split@#
разбивает ввод на серии последовательных символов, например,{{"t"}, {"h"}, {"r"}, {"e", "e"}, {" ", " ", " "}, {"s"}, {"p"}, {"a"}, {"c"}, {"e"}, {"s"}}
для четвертого контрольного примера./.a:{c_String..}:>
заменяет каждое подвыражениеa
, являющееся списком повторяющегося символаc
,Length@a
умноженным наBoole[c==#2]
, то есть,1
еслиc
равно входному символу и0
иначе. ЗатемMax
извлекает ответ.источник
Japt ,
20 1815 байтПопробуйте онлайн!
Сохранено 5 байтов благодаря obarakon и ETHproductions
источник
fV+Vî+)
... Я позволю вам разобраться с остальным :-)"If s is of length 0 or c is empty, l should be 0"
, я мог бы воспринимать это слишком буквально, хотяs
не содержит никаких примеровc
.Python , 38 байт
Попробуйте онлайн!
Деннис сэкономил 3 байта, обновив
c
строку дублированных символов, а не рекурсивно обновив число для умноженияc
на.источник
f=lambda s,c:c in s and-~f(s,c+c[0])
сохраняет 6 байтов (3, если False не разрешено).05AB1E ,
116 байтов-5 байт благодаря carusocomputing
Попробуйте онлайн!
источник
γvy²¢M
для 6 байтов, та же идея.Haskell,
4339 байтПопробуйте онлайн!
Пройдите через строку и замените текущий символ счетчиком, который увеличивается всякий раз, когда он равен
c
или сбрасывается,0
если нет. Возьмите максимум из списка.Спасибо @xnor за 4 байта.
источник
sum[n+1|c==k]
.*fromEnum(c==k)
pointfree и lambda, но это всегда было на 2 или 3 байта длиннее.C #
116115 байтМой первый код гольф
Отредактировано, потому что первоначальная отправка была фрагментом и ей не хватало необходимого пространства имен для регулярных выражений
Редактирование # 2 полное переписывание для поддержки символов с особыми значениями регулярных выражений
использование System.Linq; s => c => System.Text.RegularExpressions.Regex.Replace (s, "[^" + c + "]", ++ c + ""). Split (c) .Max (x => x.length);источник
c
иs
будет предопределен. Мы называем это «фрагмент кода», и это не разрешено. Возможно, вы могли бы реструктурировать свой код как анонимную функцию или установить эти переменные для ввода. Оба из которых разрешены.(s,c)=>
. Вы должны либо использовать,System.Text.RegularExpressions.Regex
либо добавить оператор использования прямо перед вашей функцией.JavaScript (ES6),
545351 байт-2 байта благодаря @Neil
-1 байт благодаря @apsillers
Принимает ввод в синтаксис карри:
f("foobar")("o")
.Тестовый фрагмент
Другой вариант с использованием
eval
иfor
(54 байта)Старый ответ с использованием регулярных выражений (85 байт)
источник
x==c?i++:i=0
может быть просто,i=x==c&&i+1
так какfalse
результатx==c
сравнения будет рассматриваться как0
для числовых сравнений и приращений (и никогда не будет возвращаемым значением, так как любое число, в том числе0
,j
всегда будет иметь приоритет над нулем, какfalse
вi
)false
(поскольку для вызова всегда требуется, чтобы она возвращала число)s=>c=>[...s].map(x=>j=(x!=c?i=0:++i)>j?i:j,i=j=0)&&j
кажется, чтобы сэкономить пару байтов.f=s=>c=>[...s].map(x=>j=(i=x==c&&i+1)>j?i:j,i=j=0)&&j
, что на байт короче.JavaScript (Firefox 30-57),
7572 байтаСовместимый с ES6 фрагмент:
split
возвращает набор пустых строк и одиночных символов, а также запуски, но это не влияет на результат.источник
Микро , 112 байт
источник
C (gcc) , 63 байта
Попробуйте онлайн!
источник
Perl 6 ,
45 4342 байтаПроверь это
Проверь это
Проверь это
Expanded:
источник
JavaScript, ES6, 52
Рекурсивное решение, которое обрабатывает ввод строки как массив (примечание: начальный ввод по-прежнему является строкой) и использует символ слева направо
C
:Отслеживает текущий пробег
t
и лучший в миреT
.Объяснение:
Установка
t
дляfalse
на не-спичках работает , потому что всякий раз , когдаt
увеличиваются,false
рассматриваются как0
(то есть,false + 1
есть1
), иfalse
никогда не будет сравнивать терку , чем любое значение в глобальных максахT
.источник
[C,...s]
синтаксисом. Должен помочь мнеslice()
от байтов от моих собственных сообщений.Желе , 5 байт
Это диадическая ссылка / функция, которая принимает строку и символ. Обратите внимание, что он не может работать как полноценная программа, так как при вводе из аргументов командной строки используется синтаксис Python, а Python, в отличие от Jelly, не различает одноэлементные строки и символы.
Попробуйте онлайн!
Как это устроено
источник
Сетчатка , 25 байт
Попробуйте онлайн!
Первый символ - это символ, который нужно проверить.
источник
APL (Дьялог) ,
1811 байтТребуется обмен
⊂
с⊆
версией 16.0 или имеющей⎕ML←3
(по умолчанию на многих системах).Попробуйте онлайн!
⎕=⎕
Булево для равенства между двумя входами⊂⍨
самостоятельное разбиение (начало разбиения, где ненулевой элемент больше, чем его предшественник)≢¨
подсчитать каждый0,
добавить ноль (для случаев пустого ввода)⌈/
максимум из техСтарое решение
Запрашивает сначала для s , затем для c
Попробуйте онлайн!
⎕
подскажите с⊢
для этого(
...)⎕S 1
PCRE S нить поиск для длин вхождений'+'
символ плюс (означает один или несколько),¨
добавлены к каждому из элементов⎕
предложенный c0,
добавить ноль (для случаев пустого ввода)⌈/
максимум из техc должен быть задан как 1-элементный вектор вложенной строки, если требуется экранирование.
источник
PHP,
7067 байттри версии:
принимает входные данные из аргументов командной строки; запустить
-r
или проверить их в Интернете .источник
PHP , 70 байт
Попробуйте онлайн!
PHP , 75 байт
Попробуйте онлайн!
PHP , 83 байта
Попробуйте онлайн!
+8 байт, чтобы избежать
@
источник
#
конечно,).~
может потерпеть неудачуchr(207)
.++$n
! Вы имели в виду ascii для печати. ;)echo$r?max($r):0;
сохраняет один байтJavaScript (ES6),
474038 байт(Сохранено 7 байтов благодаря @Neil и 2 байта благодаря @HermanLauenstein.)
Объяснение:
Рекурсивно ищет более длинный прогон, пока ничего не найдено.
Отрывок:
Показать фрагмент кода
источник
f=(s,c)=>c&&s.includes(c)&&1+f(s,c+c[0])
?s=>g=c=>c&&s.includes(c)&&1+g(c+c[0])
.||0
, которое все еще короче моего решения.f=
является частью карри-версии, потому что только внутренняя функция является рекурсивной.Желе,
109 байтОбъяснение:
Попробуйте онлайн!
источник
Œgf€L€Ṁ
.Python 3 , 71 байт
Попробуйте онлайн!
источник
Haskell , 66 байт
Попробуйте онлайн!
Немного легче читать версию, а не бессмысленно:
Группирует строку по буквам, затем фильтрует по тем группам, которые содержат правильный символ, затем находит длины, добавляет 0 к списку длин, если он не появляется, и, наконец, находит максимальное значение.
источник
Mathematica, 109 байт
вход
источник
Python 2 , 69 байт
Попробуйте онлайн!
источник
CJam ,
20191816 байтПопробуйте онлайн!
объяснение
источник
Excel, 56 байт
s
должен быть введен вA1
.c
должен быть введен вA2
.Формула должна быть формулой массива ( Ctrl+ Shift+ Enter), которая добавляет фигурные скобки
{ }
.Технически это может быть применимо только в том случае, если самый длинный прогон составляет менее 1 048 576 (что составляет 2 ^ 20), потому что именно так в текущем Excel можно размещать строки на рабочем листе. Так как он загружает значения миллиона + в память всякий раз, когда пересчитывает, это не быстрая формула.
источник
MATL , 15 байт
Попробуйте онлайн!
Базовый алгоритм очень прост (без использования split!), Но мне пришлось добавить
0i0v
и0h
учесть крайние случаи. Тем не менее, я думал, что подход был хорошим, и, возможно, я все еще могу найти другую технику для обработки краевых случаев: алгоритм находит самый длинный прогон в середине строки просто отлично, но не для одиночных символов или пустых строк; Я все еще проверяю, могу ли я «дополнить» переменные в лучших местах для лучших результатов.Не работает на пустую
c
. Опять же, я полагаю, что каждая строка содержит бесконечный пробег пустых строк между каждым символом :)источник
R ,
6658 байт-8 байт благодаря BLT и MickyT
возвращает анонимную функцию. TIO имеет разницу в 1 байт, потому
el
что не работает там по необъяснимым причинам.Попробуйте онлайн!
источник
r=rle(el(strsplit(s,'')))
function(s,c)max((r=rle(el(strsplit(s,''))))$l*(r$v==c),0)
el
не работает на TIO (понятия не имею, почему), и я просто скопировал и вставил его из рабочего кода там, так что мне придется помнить, чтобы поместить это обратно в @MickyT очень умно! Благодарность!Java 8,
6765 байт-2 байта благодаря @ OlivierGrégoire
Принимает вход
s
какchar[]
, иc
какchar
Объяснение:
Попробуй это здесь.
источник
m=m>(t=x==c?t+1:0)?m:t;
короче{t=x==c?t+1:0;m=m>t?m:t;}
.s->c->java.util.Arrays.stream(s.split("[^"+c+"]")).mapToInt(z->z.length()).max().orElse(0)
Рубин, 40 байт
->s,c{s.split(%r{[^#{c}]}).max&.size||0}
Попробуйте онлайн!
источник