Скажи, что у тебя есть такая строка:
abaabbbbbaabba
Подсчитайте, сколько раз указанный символ появляется во входной строке, но только если символ появляется только один раз в строке . Например, если символ a
,
abaabbbbbaabba
^ x x ^
Всего будет 2 ( aa
это не будет считаться, потому что a
появляется два раза подряд).
Как это связано с FizzBuzz?
Если символ появляется 3 (или кратно 3) раза подряд или 5 (или кратно 5) раз подряд, вместо этого счетчик уменьшается . Если он кратен как 3, так и 5 раз, счетчик все еще увеличивается. Помните, что счетчик также увеличивается, если символ появляется только один раз в строке, и игнорируется, если символ появляется любое другое число раз подряд (кроме ситуаций, описанных выше).
Напомним, если строка в матче a
,
input counter (explanation)
a 1 (single occurence)
aaa -1(multiple of 3)
aaaaa -1(multiple of 5)
aaaaaaaaaaaaaaa 1 (multiple of 15)
aa 0 (none of the above)
aba 2 (two single instances)
aaba 1 (one single occurence(+1) and one double occurence(ignored))
aaaba 0 (one single occurence(+1) and one triple (-1)
aaaaaa -1 (six is a multiple of three)
Ссылочная (ungolfed) реализация в Java:
import java.util.Scanner;
import java.util.regex.*;
public class StrMatcher {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //Scanner to get user input
int total = 0;//Running total of matches
System.out.println("Enter a string: ");
String strBeingSearched = sc.nextLine(); //String that will be searched
System.out.println("Enter string to match with: ");
String strBeingMatched = sc.nextLine(); //Substring used for searching
//Simple regex matcher
Pattern pattern = Pattern.compile("(" + strBeingMatched + ")+");
Matcher matcher = pattern.matcher(strBeingSearched);
while(matcher.find()){ //While there are still matches
int length = matcher.end() - matcher.start();
int numberOfTimes = length/strBeingMatched.length();//Calculate how many times in a row the string is matched
if((numberOfTimes == 1)||((numberOfTimes % 3 == 0) && (numberOfTimes % 5 == 0))){
total++; //Increment counter if single match or divisible by 15
} else if((numberOfTimes % 3 == 0)||(numberOfTimes % 5 == 0)) {
total--; //Decrement counter if divisible by 3 or 5 (but not 15)
}
strBeingSearched = strBeingSearched.substring(matcher.end());
matcher = pattern.matcher(strBeingSearched); //Replace string/matcher and repeat
}
System.out.println(total);
}
}
- Строка, в которой будет производиться поиск, может иметь любую длину, но шаблон будет содержать только один символ.
- Ни одна строка не будет иметь специальных символов регулярных выражений.
- Это код-гольф ; самая короткая программа в байтах побеждает.
- Нет стандартных лазеек.
Ответы:
Функцион , 1840 байт
Блин, на этом языке нельзя играть в гольф.
Эта программа ожидает, что первым символом ввода будет символ для поиска, а оставшаяся часть ввода сделает строку для поиска. Это означает, что
aaaba
будет искать наa
входеaaba
(и, следовательно, на выходе 1). Вы можете разделить их с помощью новой строки или пробела (a aaba
), но только потому, что дополнительная новая строка / пробел не имеет никакого значения для вывода.Как всегда, вы можете получить более привлекательный рендеринг (без межстрочного интервала), если выполняете его
$('pre').css('line-height',1)
в консоли браузера.(1840 байт при кодировании как UTF-16.)
объяснение
¹
возвращает первый символ строки²
подсчитывает количество вхождений символа в начале заданной строки. Например, учитывая символa
и строкуaaba
, он возвращает 2. Дляa
иbaa
он возвращает 0.³
вызывает,²
чтобы получить количество символов в начале, проверяет, делится ли число на 3 и 5 и равно ли оно 1, и определяет правильное увеличение / уменьшение. Он также удаляет один дополнительный символ из начала строки (например, еслиaaabba
он удаляет 3 + 1 = 4 символа, даваяba
). Затем он вызывает себя рекурсивно с более короткой строкой и добавляет результат.¹
удаление первого символа из ввода и вызывает³
этот символ и остальную часть строки как отдельные аргументы.источник
CJam,
4036353230 байтСпасибо @ MartinBüttner за игру в 1 байт!
Спасибо @AndreaBiondo за то, что вы сыграли в гольф 2 байта и проложили путь еще 3!
Попробуйте онлайн в интерпретаторе CJam .
Как это работает
источник
llcf=e`::*0-{(_!\6563282Zb:(=}%1b
это 33 байта.C
160126125119114109104100 байтВероятно, можно сделать лучше ... Это принимает входные данные из аргументов командной строки (первый аргумент - шаблон, второй - строка). Не поддерживает поиск шаблона NULL char (\ x00).
РЕДАКТИРОВАТЬ **
126125119114109104100 байт **: После включения предложений Денниса и некоторых дополнительных идей (удалено предложение else, объединено время while в одно единственное утверждение и используется вычитание вместо! =). Также убрана лишняя точка с запятой в цикле for (это было фактически частью предложения Денниса). Сокращается еще больше, удаляя переменные «i» и «a».Удалены операторы if и negation ('!') Путем использования тернарного оператора. Сжатые проверки модульности с помощью
этого побитового трюка «И»удваивают &&, потому что побитовый «&» имеет ошибку, и помещает (t <2) сравнение в троичные операторы. Замените !! t * (...), переместив !! t в троичный оператор, что позволяет мне убрать скобки.Чувак, я действительно хочу получить его ниже отметки в 100 байт: S
TENTATIVE решения: я не уверен, что они будут считаться действительными, но я могу получить до 93 символов, если я использую exit (s) вместо printf ("% d", s). Но тогда вывод не будет виден, скорее это будет код возврата. Если вывод действительно необходим, я также могу уменьшить его до 98 байт, но для этого потребуется также распечатать все промежуточные значения s перед окончательным ответом ...
источник
i,t,s,a;main(c,z)char**z;{a=*z[1];while(c){if((c=z[2][i])!=a)s+=(!!t)*((t<2)-!(t%3)-!(t%5)+3*!(t%15)),t=0;else++t;++i;}printf("%d",s);}
должно работать так же хорошо (и это на 23 байта короче).main
сfor(a=*z[1];c;i++)
, вам не нужно{}
во всем, если ... иначе.Рубин,
111 10396 байтЭтот вызов был сделан для Руби
Enumerable#chunk
, поэтому я должен был опубликовать это. :)Онлайн тест: http://ideone.com/pG4mAn
Код довольно прост. Вот более читаемая версия: http://ideone.com/ub3siA .
источник
Python 3,
361, 300, 296, 263, 256, 237, 229, 188, 178, 164 байта.Сохранено 15 байтов благодаря vaultah из SOPython.
Сохранено 9 байтов благодаря Джо Кингтону из SOPython.
Сохранено 11 байт благодаря DSM от SOPython.
Я впервые представляю ответ, поэтому уверен, что он может быть намного короче. В качестве первого ответа на вход используется тестовая строка, а в качестве второго - поисковый символ.
Безголовая версия:
Обнаружено, что я провалил один из тестовых случаев.
источник
Haskell, 120 байт
f
делает работуисточник
Java,
146152143138139136 байт%3&%5
проверок.i<2
сравнение.%3&%5
проверка не работает, как думал).Реализовано как
BiFunction<String, String, Integer>
в Java 8, дайте мне знать, если это требуется, чтобы быть полной программой (или я могу даже отказаться отjava.util.regex
префикса пакета ниже).Количество байтов выше не включает новую строку ниже, которая просто добавлена в целях форматирования на этом сайте.
Грубое объяснение:
b
, то есть"[^"+b+"]"
."a" -> 1
).-1
,0
и1
.sum()
чтобы получить ответ.источник
Javascript, 206 байт
Expanded:
Объяснение:
Я использую регулярные выражения, чтобы подсчитать общее количество раз, когда появляется персонаж, а затем вычесть из него все времена, когда он появлялся в группах. Наконец, я прохожу группы и делаю увеличение / уменьшение шипения.
Проходит тестовые задания, приведенные в вопросе:
и так далее
источник
new
, используйтеexec
вместоmatch
, и псевдонимlength
, и вы должны быть хорошими.Perl,
82656359 байт58 байт + 1 байт параметр командной строки
Не особо коротко, но это начало - продолжу сокращать его.
Предполагается, что
-i
можно использовать для ввода входной строки пример использования:источник
Pyth, 32 байта
так близко! Еще 2 байта, чтобы связать отличную запись CJam Дениса
Проверьте это онлайн
источник
Гоук, 140
Введите как "символ пробела", например,
Ungolfed
источник
Pyth, 27 байт
Тестирование
Ввод в форме, например:
Объяснение:
источник