Вы обеспечиваете техническую поддержку в Брюс Dickenson , как он производит запись сеанса Blue Oyster Cult. Когда он просит еще колокольчика , вы можете дать его ему.
Твое задание
Напишите программу или функцию, которая принимает строку (или эквивалент на вашем языке) в качестве входных данных и выводит связанную строку, содержащую еще один колокольчик.
Сколько колокольчиков содержит строка?
Количество колокольчиков в строке равно максимальному количеству отдельных копий «колокольчика», которое можно получить путем перестановки символов строки. Например, "bbbccceeellllllooowwwwwwwww"
содержит 3 колокольчика, в то время как "bbccceeellllllooowwwwwwwww"
и "bbbccceeelllllooowwwwwwwww"
каждый содержит 2 колокольчика, и "cowbel"
содержит 0 колокольчиков.
Как выход должен быть связан с входом?
Выходные данные должны состоять из объединения в указанном порядке входной строки и кратчайшего префикса входной строки, необходимого для увеличения числа колокольчиков.
Например, "bbbccceeelllllooowwwwwwwww"
нужен только один дополнительный, "l"
чтобы содержать 3 колокольчика вместо 2; самый короткий префикс , который содержит , что "l"
это "bbbccceeel"
. Поэтому, если вход есть "bbbccceeelllllooowwwwwwwww"
, то выход должен быть "bbbccceeelllllooowwwwwwwwwbbbccceeel"
.
Технические детали
- Вы можете предположить, что ввод содержит только печатные символы ASCII. Если есть один или два символа, которые раздражают для обработки строки вашего языка (например, перевод строки или
\
), вы можете предположить, что входные данные не содержат их - просто упомяните это ограничение. - Кроме того, вы можете предположить, что буквенные символы на входе являются строчными или прописными. Если вы решите не принимать одно из них, считайте колокольчики без учета регистра.
- Далее Вы можете предположить , что ввод содержит , по меньшей мере , одну копию каждого из персонажей
b
,c
,e
,l
,o
, иw
. Это эквивалентно предположению, что некоторый префикс строки может быть присоединен к нему для получения строки, содержащей больше колокольчика. (Обратите внимание, что сама входная строка не должна содержать колокольчик.) - Если у вашего языка есть встроенная функция, которая решает эту проблему ... тогда всерьез используйте ее, насколько это здорово.
Позолоченные подгузники
Поскольку время записи в студии дорого, ваш код должен быть максимально коротким. Запись с наименьшим количеством байтов является победителем!
Контрольные примеры
( ссылка на вставку для более простого копирования / вставки)
Тестовый вход № 1: "christopher walken begs for more cowbell!"
Тестовый вывод № 1: "christopher walken begs for more cowbell!christopher wal"
Тестовый вход № 2: "the quick brown fox jumps over the lazy dog"
Тестовый вывод № 2: "the quick brown fox jumps over the lazy dogthe quick brown fox jumps over the l"
Тестовый вход № 3: "cowbell"
Тестовый вывод № 3: "cowbellcowbell"
Тестовый вход № 4: "cowbell cowbell cowbell"
Тестовый вывод № 4: "cowbell cowbell cowbellcowbell"
Тестовый вход № 5: "cowbell cowbell cowbel"
Тестовый вывод № 5: "cowbell cowbell cowbelcowbel"
Тестовый вход № 6: "bcelow"
Тестовый вывод № 6: "bcelowbcel"
Тестовый вход № 7: "abcdefghijklmnopqrstuvwxyz"
Тестовый вывод № 7: "abcdefghijklmnopqrstuvwxyzabcdefghijkl"
Тестовый вход № 8: "cccowwwwbbeeeeelllll"
Тестовый вывод № 8: "cccowwwwbbeeeeelllllccco"
Тестовый вход № 9: "be well, programming puzzles & code golf"
Тестовый вывод № 9: "be well, programming puzzles & code golfbe well, programming puzzles & c"
Тестовый вход № 10: "lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. wow!"
Тестовый вывод № 10: "lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. wow!lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut lab"
Тестовый вход № 11:
"c-c-b-c
i have a cow, i have a bell.
uh! bell-cow!
i have a cow, i have a cowbell.
uh! cowbell-cow!
bell-cow, cowbell-cow.
uh! cow-cowbell-bell-cow.
cow-cowbell-bell-cow!
"
Тестовый вывод № 11:
"c-c-b-c
i have a cow, i have a bell.
uh! bell-cow!
i have a cow, i have a cowbell.
uh! cowbell-cow!
bell-cow, cowbell-cow.
uh! cow-cowbell-bell-cow.
cow-cowbell-bell-cow!
c-c-b-c
i have a cow, i have a bell"
test case -> result
в одном большом предварительно отформатированном блоке кода. С эстетической точки зрения это намного приятнее и проще копировать.L
в этом слове есть две буквы , это не то, что требует задача.Ответы:
Пип ,
504238 байтПередайте строку в качестве аргумента командной строки, если необходимо, заключите в кавычки. Попробуйте онлайн!
объяснение
Я собираюсь объяснить это в двух частях: функция «колокольчик» и полная программа. Во-первых, вот функция, которая вычисляет количество ковбелл в строке:
{...}
определяет функцию. Многие операторы Pip при применении к функции возвращают другую функцию; например, так-{a+1}
же, как{-(a+1)}
. Таким образом, вышесказанное эквивалентнокоторый работает следующим образом:
Теперь, когда у нас это есть, вот полная программа:
источник
cowbell cowbell cowbee
и вывод был,cowbellcowbelcowbel
но я мог неправильно использовать IDE (новичок в PIP)cowbell cowbell cowbeecowbell
( попробуйте онлайн ). Вы используете TIO или локальную копию?С
511488474470463454Попробуйте онлайн
Читаемый формат + объяснение:
Использованы некоторые забавные трюки:
• При проверке символов я печатаю
'w'
для символа w, который составляет 3 байта, но для символов'c'
и'b'
я могу ввести их значения ASCII 99 и 98 соответственно, чтобы каждый раз сохранять байт. (Изменить: Благодаря @Titus, я знаю, сделать это со всеми буквами COWBELL, используя только ввод в верхнем регистре, которые представляют собой 2-байтовые числовые значения ascii)•
r=~-l/2
вr=(l-1)/2
использовании bitshifts•
a[++i]
Я получаю символ по индексу (i) и повторяю индекс одновременно. Я просто начатьi
вi=-1
вместоi=0
(я сделать то же самое сz
и начать его какz=i
для сохранения следующего байта)источник
c
) всегда устанавливается как 1 [...].» Мы были бы рады получить ваше заявление о том, почему вы так думаете, потому что некоторым это кажется странным.c,o,w,b,e
инициализируется тем же значением, а не 1? Потому что ваш намек № 2, похоже, не соответствует действительности, по крайней мере, для CI знают. Вы можете уточнить? ТАК вопросPython 2,
125113112 байтовn
считает количество колокольчиков-12 байт благодаря @Rod
-1 байт благодаря @Titus
источник
[]
понимать список, когда он является единственным параметром, также вы можете пропуститьenumerate
:min(s.count(c)/-~(c=='l')for c in"cowbel")
где-~(n=='l')
более короткий способ записи1+(n=='l')
>>
будет короче чем/-~
?return
бы времени?Perl 6 , 91 байт
Предполагает ввод строчных букв.
Как это работает
Внутри лямбды другая лямбда для подсчета количества колокольчиков в строке определяется так:
Остальная часть кода использует эту внутреннюю лямбду,
&c
чтобы найти результат, например так:источник
MATL ,
3837 байт1 байт благодаря идее @ DLosc об использовании строки шаблона
lcowbe
вместоcowbel
Все вводимые символы строчные. Если входные данные содержат символы новой строки, символ новой строки необходимо вводить в виде его кода ASCII, объединенного с обычными символами (см. Последний ввод в ссылке со всеми тестовыми примерами).
Попробуйте онлайн! Или проверьте все тестовые случаи .
источник
JavaScript (ES6), 106
107 113 126 141Портирование на javascript ответа Pip от @DLosc. Мне нужно было время, чтобы полностью понять это, и это гений.
Отредактируйте -15 байт, следуя подсказке @Titus, напрямую добавляя символы к входной строке
a
и избегая досрочного возврата (поэтому нетfor/if
)Редактирование 2, перечисляя значение 6 для функции Min, сохраняет другие 13 байтов.
Изменить 3 изменил функцию c снова. Я думал, что многословно
length
иsplit
будет слишком долго. Я был неправ.Предполагая ввод строчных букв
Меньше гольфа
Тест
источник
k[x]++
что не получится из-заundefined
. Но я уверен, что этоfor(i=0;c(a)==c(a+=a[i++]);),a
работает.>>!i
экономит 3 байта. Почему вы не используетеc(a+=z)
?c(a+=z)
. Не в менее гольфовой версии, как вы видите, менее гольфовой. Использование>>!i
экономит 1 байт (в версии для гольфа).Утилиты Bash + Unix, 184 байта
Попробуйте онлайн!
Спасибо @AlbertRenshaw за игру в гольф на 2 байта.
источник
!=
JavaScript (ES6),
124114 байтСпасибо Нейлу за сохранение нескольких байтов
Поскольку это сильно отличается от уже существующего ответа JavaScript, и я потратил немало времени на это, я решил создать ответ сам.
использование
Выход
источник
.sort()[0]
это изумительная идеяeval
это зло : DMath.min()
, но это стоило много символов, и я подумал, что будет более короткий путь. И да,eval
действительно хорош для игры в гольф..sort()[0]
работало, это стоило бы всего 10 байтов, но это не так, и.sort((a,b)=>a-b)[0]
стоило бы 20 байтов, аMath.min(...)
стоило бы только 13.Октава,
808797 байтПопробуйте онлайн!
источник
l
с, чтобы завершить дополнительный колокольчик. Например, при вводеcowbell
он неверно возвращает,cowbellcowbel
а неcowbellcowbell
. (Я надеюсь, что вы можете это исправить - мне нравится нетипичный алгоритм!)CJam, 37
Попробуйте онлайн
Если я могу исключить
"
и\
символы, то ...35 байт
Попробуйте онлайн
объяснение
Код последовательно добавляет каждый символ строки к исходной строке (переходя от исходного к удвоенному), определяет количество колокольчиков для каждой строки (подсчитывает количество вхождений каждого символа в «ковбеле» и делит один на «l»). на 2, затем беря минимум), находит позицию первой строки, где число колокольчиков увеличивается на 1, затем берет соответствующий префикс ввода и помещает его после строки ввода.
Чтобы также включить исходную строку (без добавления символа), в коде добавляется нейтральный символ к строке, которая повторяется. Первая версия добавляет пробел, а вторая версия использует строковое представление, то есть строку между двойными кавычками.
источник
PHP, 133 байта
порт PHP @ edc65, порт JavaScript ответа DLosc's Pip.
принимает строчные данные из аргумента командной строки. Беги с
-nr
.сломать
источник