Мини-гольф по понедельникам: серия коротких соревнований по коду , публикуемых (надеюсь!) Каждый понедельник.
Правдивая история 1 : На днях я играл на своем планшете, когда у меня появилась идея посетить страницу, которую я обычно использую на своем ПК, для тестирования JavaScript. После загрузки страницы я вошел в эту простую программу:
alert("Hello!")
Затем я продолжил нажимать кнопку «Выполнить» и был удивлен, когда мне сказали, что введенный мною код недействителен. Я еще раз взглянул на текстовое поле и увидел это:
alllelelerlerlertlert("Heeelelellellelloello!")
Wha ??? Это не то, что я вошел! Так что здесь произошло? Чтобы понять это, я ввел две простые строки:
abcdefg
0123456
Это получилось так:
abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefg
0112123123412345123456
К настоящему времени я все еще не имел ни малейшего представления о том, что случилось с буквами, но цифры казались проще, поэтому я посмотрел поближе. Как оказалось, веб-страница просто вводила первый символ, а затем повторяла все остальное в строке каждый раз, когда нажимался новый:
0112123123412345123456
0
1
12
123
1234
12345
123456
Но как насчет разделов букв? Подумав минуту, я понял, что это одно и то же, но вместо того, чтобы повторять каждый подраздел один раз, он повторяет это дважды :
abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefg
a
bb
bcbc
bcdbcd
bcdebcde
bcdefbcdef
bcdefgbcdefg
Комбинация двух работ с комбинацией этих методов:
abc123z
abbbcbcbc1bc12bc123bc123zbc123z
a
bb
bcbc
bc1
bc12
bc123
bc123zbc123z
Что бы ни вызывало сбой, это, кажется, сбрасывается при пунктуации и пробелах, так abc def
становится abbbcbc deeefef
.
К этому моменту я был настолько погружен в то, чтобы выяснить это и превратить его в интересный вызов, что я забыл, почему я был там в первую очередь. (Однако я понял, как печатать в обычном режиме: нажимая пробел после каждого символа. Довольно утомительно, но ты должен делать то, что должен.)
Вызов
Цель задачи состоит в том, чтобы написать программу или функцию, которая принимает текст, подлежащий обработке, вносит изменения, перечисленные выше, и выводит / возвращает результат.
подробности
- Ввод будет содержать только печатный ASCII, без вкладок или новых строк.
Тест-кейсы
Входы: (по одному на линию)
Mess up text
This is some longer text.
CAPS LOCK && "Punc-tua"+'tion'
under_score_style
CaPs wItHIn loWERs
1337 numb3r5
abcdefghij 0123456789
Code-golf is the best!
Выходы:
Meeesesessess upp teeexexextext
Thhhihihishis iss sooomomomeome looononongongongeongeongeronger teeexexextext.
CAAAPAPAPSAPS LOOOCOCOCKOCK && "Puuunununcunc-tuuuaua"+'tiiioioionion'
unnndndndendendernder_scccococorcorcorecore_stttytytyltyltyletyle
CaaaPaPaPsaPs wIIItItItHItHItHIItHIItHInItHIn loooWoWoWEoWEoWERoWERoWERsoWERs
1333337 nuuumumumbumbumb3umb3rumb3rumb3r5
abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefgbcdefghbcdefghbcdefghibcdefghibcdefghijbcdefghij 0112123123412345123456123456712345678123456789
Cooodododeode-gooolololfolf iss thhhehe beeesesestest!
счет
Это код-гольф , поэтому выигрывает самый короткий действительный код в байтах. Tiebreaker переходит к представлению, которое первым достигло конечного числа байтов. Победитель будет выбран в следующий понедельник, 2 ноября. Удачи!
Изменить: И победитель ... @ MartinBüttner, используя Retina для невероятного 43-байтового решения!
1 Да, эта история полностью правдива, и если вам нужно больше разъяснений, см. Сноску 1.
' '.join(x[0]+''.join(2*x[1:i]for i in range(1,len(x)+1)) for x in raw_input().split())
Ответы:
Сетчатка , 43 байта
Запустите код из одного файла с
-s
флагом. Поскольку это всего лишь одна подстановка регулярных выражений, вы можете проверить ее здесь (щелкните вкладку «Контекст», чтобы увидеть результаты).объяснение
Это соответствует любой цифре и букве, которая не является первой в серии. В то время как
.
может соответствовать любому символу, не являющемуся переводом строки, lookbehinds обеспечивают другие условия:Это соответствует назад от позиции после
.
. Во- первых это соответствует одному или более алфавитно - цифровых символов и захватывает их в группу1
с([^_\W]+)
. Это сразу гарантирует, что.
соответствует буквенно-цифровому символу. Затем дополнительный[^_\W]
проверяет наличие еще одного буквенно-цифрового символа в текущем цикле, который мы не включаем в соответствие. Теперь группа1
- это то, чем мы хотим заменить совпадение, если оно является цифрой - если это буква, мы хотим заменить ее вдвое больше этой строки. Вот где в игру вступает второй взгляд:Этот вариант не является обязательным, поэтому, если он потерпит неудачу, он не повлияет на совпадение. Это первый гарантирует , что
.
была не цифра через(?<=\D)
- так это с просмотром назад актуальна только когда мы согласующие письма. В этом случае мы сопоставляем группу\1
еще раз (это всегда совпадает, потому что мы захватили группу с той же позиции), но собираем ее в группу2
.Следовательно, мы просто заменяем регулярное выражение содержимым обеих групп (
$1$2
). Если совпадение было цифрой,$2
все равно будет пустым, и мы запишем префикс только один раз. Если это было письмо,$2
то же самое, что$1
и мы дважды напишем.источник
JavaScript (ES6) 82
Используя оптимизацию регулярного выражения, предложенную Mwr247
Протестируйте приведенный ниже фрагмент в любом новом браузере
источник
JavaScript (ES6),
928887Я понятия не имею, как играть в гольф это вниз ...
Спасибо Mwir247 за регулярное выражение в гольфе и ETH-продуктам для однобайтового гольфа в функции снижения .
источник
/[^_\W]+/g
(сохраняет 3 символа).reduce
функции:(a,e)=>a+=(y+=e,++e?y:y+y)
(на 1 байт короче)Haskell,
215200 байтЭто беспорядок.
Получайте удовольствие, читая все странные причуды, я никогда не думал, что буду использовать
id
это много.Жаль , что материал , который уже делает половину работы здесь необходимо импортировать (
isDigit
,isAlpha
,inits
).источник
lang-hs
не такlang-haskell
. Указавlang-haskell
это, вероятно, заканчивается использование подсветки по умолчанию.Гема, 57 знаков
Образец прогона:
источник
Haskell,
183181 байтИспользование:
Не знаю, существенно ли отличается ответ Лейфа Виллертса. Но вот алгоритм.
Я как-то держу лишние скобки.
источник
T-SQL, 357 байт
пример:
exec x(@s='1337 numb3r5')
возврат1333337 nuuumumumbumbumb3umb3rumb3rumb3r5
источник
Python 2, 131 байт
Перебирает символы и сохраняет / повторяет при необходимости.
источник
Пип, 41 байт
Принимает текст в качестве аргумента командной строки. Мы используем замену регулярных выражений для замены всех буквенно-цифровых запусков (
[^_\W]+
) функцией обратного вызова. Эта функция сопоставляет другую функцию с каждым символом слова, генерируя постепенно увеличивающиеся серии символов (с глобальной переменной,y
отслеживающей индекс) и повторяя их X2, если символ не является числом. (Логика, для которой используется+
преобразование в число, а затемQ
для проверки, равно ли оно строковому значению по сравнению с исходным символом.) Однако этот процесс исключает первый символ, поэтому мы должны добавить его в afterward (a@0.
).источник
Python 3 , 86 байт
Попробуйте онлайн!
источник