Люди на этом сайте очень любят украшать свои посты ...
Stewie's sequence: + * - / + * - /
Однако, когда этот заголовок необходимо включить в URL страницы, он упрощается:
stewies-sequence
Соревнование
Ваша задача - создать программу или функцию, которая при наличии строки, представляющей заголовок записи, выводит / возвращает свое преобразование "URL-Friendly".
Алгоритм:
- Преобразовать в нижний регистр (где применимо)
- Замените каждый пробел (
), точку (
.
), запятую (,
) или косую черту (/
) тире (-
) - Удалите все не алфавитно-цифровые символы, кроме тире.
- Сократите группы соседних тире (
a---b -> a-b
), удалите все, которые являются ведущими / завершающими.
Обратите внимание, что этот алгоритм является упрощенным и не всегда дает те же результаты, что и реальный метод сайта.
правила
- Вы можете предположить, что вход:
- Не будет пустым.
- Будет содержать как минимум один буквенно-цифровой символ.
- Будет содержать только символы в диапазоне ASCII 32-126 (для печати)
- Полные программы или функции разрешены.
- Встроенный модуль, который выполняет точную спецификацию задачи, не допускается.
- Это код-гольф , поэтому выигрывает самое короткое решение (в байтах)!
Тестовые случаи
Большинство сообщений на этом сайте будут служить тестами, но вот удобный список:
Loading... Forever -> loading-forever
N(e(s(t))) a string -> nest-a-string
"Hello, World!" -> hello-world
URL-Friendly titles -> url-friendly-titles
C.U.S.R.S -> c-u-s-r-s
1+2+3+4+...+n = -1/12? -> 1234-n-1-12
How can I use cmp(a,b) -> how-can-i-use-cmpa-b
Некоторые более длинные ...
Export The $PATH Variable, Line-By-Line -> export-the-path-variable-line-by-line
Do n and n^3 have the same set of digits? -> do-n-and-n3-have-the-same-set-of-digits
Quine Anagrams! (Cops' Thread) -> quine-anagrams-cops-thread
The Golfer Adventure - Chapter 1 -> the-golfer-adventure-chapter-1
Bootloader golf: Brainf*** -> bootloader-golf-brainf
И несколько проверочных примеров (не стесняйтесь предлагать больше):
0123 -> 0123
a a1 -> a-a1
2-1=1 -> 2-11
-
с? Должны ли они быть удалены? Напримерasdf-
,-
нужно ли удалить последнее ?if(isalphanum(ch))...
_
подчеркивания? Мой код работает за исключением случаев, когда есть подчеркивание.Ответы:
Retina,
3331 байт(В программе есть завершающий перевод строки)
Я не уверен, что смогу выжать из этого больше. Это должно охватывать все. Пришло похоже на Mama Fun Roll's. Еще одна 33-байтовая версия с использованием рекурсивных регулярных выражений
Попробуйте онлайн!
объяснение
Эта строка простая, она преобразуется в нижний регистр с помощью T ransliterating
A-Z
(L
) вa-z
(l
нижний регистр).Эта стадия проста, она, по сути, избавляет от всех ненужных персонажей, чтобы потом избавить себя от многих проблем.
[^a-z ,-9]
Соответствует любому символу, который НЕ является:a-z
: строчный алфавит (помните, что вся строка строчная из-за предыдущего элемента): космический хаос
,-9
это диапазон кодов символов,
до9
который попадают,-./0123456789
именно те символы, которые нам нужныЗатем мы преобразуем все не алфавитно-цифровые символы в тире (который теперь просто
и
,./-
.Это не будет (не) совпадение,
_
которое включено в\w
(отрицание\W
), потому что оно было удалено на предыдущем этапеисточник
a = b
.a = b
:(JavaScript (ES6),
90827975 байтЭто попытка сделать работу с одним
replace()
. Этот код извлекает только те символы, которые нас интересуют, и игнорирует все остальное. Есть некоторая дополнительная логика для обработки дефисов.Контрольные примеры
Показать фрагмент кода
источник
,a^a,
этот код дает-aa-
(естьV ,
41, 40, 37, 36 байтовПопробуйте онлайн! или Проверьте все контрольные примеры сразу!
Как обычно, здесь это содержит кучу непечатных и не ASCII символов, поэтому вот hexdump:
Это такие проблемы, когда система V Compressed Regex пригодится.
объяснение
Перво-наперво, мы будем преобразовывать все в нижний регистр. К счастью, есть действительно удобный способ сделать это в два байта. Я написал совет об этом здесь . Итак, мы делаем
После этого мы делаем кучу сжатых команд замены. Хороший обзор того, как работает сжатое регулярное выражение V, можно найти здесь , но основная идея в том, что мы можем установить старший бит, чтобы избежать экранирования определенных символов. Другое удобство заключается в том, что диапазоны (например
:%
) и флаги (например/g
) заполняются автоматически. Но, в конце концов, все это переводится в команды vim substitute. Фактически, мы могли бы даже напрямую перевести остальную часть программы в vim. Это дало бы нам это:Если вы говорите на vim-regex, должно быть более понятно, что делает остальная часть программы сейчас. Итак, остальная часть программы:
источник
JavaScript (ES6) 91
961 байт сохранено thx @ETHproductions
Тест
источник
*
в последнем регулярном выражении, хотя я могу ошибатьсяPython 3,
1031009695 байт5 байтов сохранено благодаря Flp.Tkc
источник
Сетчатка, 34 байта
Попробуйте онлайн!
Обратите внимание на завершающий символ новой строки. По сути, реализация ОП.
источник
T`L`l
чтобы перейти в нижний регистр с меньшим количеством байтовa..
snd аналогичный[\W]
это просто\W
MATL , 38 байт
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
Рубин ,
6160616453 байта(52 байта кода плюс один байт для
-p
)Попробуйте онлайн!
Обновление 1:
Использованиеgets
вместо режима редактирования потока Ruby экономит один байт.Отменено согласно предложению ValueInk .
Обновление 2: (всего +3 байта)
..--hi, $/
(→hi
) (+10 байт) - еще раз предоставлено пользователем ValueInk-p
(+1 байт)squeeze
и использовалgsub
вместо него (+2 байта) , что позволило мне:strip
для обработки начальных и конечных тире (-10 байт) .Обновление 3: Хеттрик от ValueInk. Мы экономим 11 байтов, используя
String#split
привычку автоматического сжатия циклов одного и того же разделителя, что позволяет нам отбросить весь финалstrip
/gsub
цепочку и заменить ее наsplit
/join
combo. (-11 байт)источник
-p
флагом, но это определенно не будет.-p
флага неявно добавляет 1 байт к вашему коду (потому что это изменяет выполнение вашего кода сruby -e 'your code'
наruby -pe 'your code'
). Я также нашел один крайний случай, когда он дает-hi-
для ввода, например,..--hi, $/
когда вы должны удалить все начальные / конечные тире и, таким образом, возвращатьсяhi
.gsub(/[^\w ]/){}
наtr('^a-z ','')
, а затем заканчивая.split*?-
вместо,.strip.gsub...
так как он автоматически обрабатывает дубликаты и концы строки, все за один раз!JavaScript (ES6),
7469 байтИзменить: 5 байтов сохранены, поняв, что я уже удалил все символы, кроме
-/,. 0-9a-z
того, что я могу использовать,\w
чтобы соответствовать оставшиеся слова.источник
[a-z\d]
может быть[^\W_]
?PHP, 87 байт
Идея регулярных выражений исходит из существующих ответов.
Это требует, чтобы у вас был сервер с PHP и доступ по HTTP.
Название должно быть на ключе
T
, а результат будет напечатан на экране.Пример:
http://localhost/title.php?T=<my shiny title>
источник
инструменты bash / Unix, 56 байт
Замените прописные буквы строчными, а необходимые специальные символы - черточками.
Удалите (опция -d для tr) символы, отличные от букв, цифр и тире, а затем сожмите (опция -s для tr) нескольких тире подряд в один тире.
Удалить дефисы в начале, а затем в конце.
источник
Powershell, 85 байт
сделать его в нижнем регистре, а затем 3 регулярных выражений заменяет в строке, и обрезать любые хвостовых
-
«Sисточник
$input
сэкономить 2 байта?JavaScript,
90989493919091 байт1 байт сохранен благодаря @ edc65!
1 байт сохранен благодаря @IsmaelMiguel за обнаружение ведущей точки с запятой!
1 байт, полученный после сбоя
,a-^-a,
Что мне больше всего нравится в этом представлении, так это диапазоны. В первом
replace
, мы убираем все , что не алфавитно - цифровой , а не,
,-
,.
,/
а не пространство. Мы используемa-z
для обнаружения букв, и мы используем,-9
для обнаружения этих специальных символов и цифр, так как коды символов этих литералов ASCII все выстраиваются!Показать фрагмент кода
источник
f=
так что ваш счетчик байтов сейчас равен 96. И не нужно \ внутри диапазона в регулярном выражении, так что это может быть 95. Но ... все еще не работает: try...title
f=
и;
в конце. Просто укажите, что это анонимная функция. При этом ваш ответ должен быть длиной 90 байт.Луа, 91 байт
Где
a
находится строка URL.Объяснение:
a:lower()
возвращает строчную функцию:gsub
находит совпадение шаблона и заменяет его строкой.'[ .,/]'
: Скобки означают «или», поэтому они соответствуют пробелу, периоду, запятой и косой черте. Не нужно быть жадным, потому что:gsub
делает все случаи жизни.'[^%w-]'
:^
означает «не» в скобках,%w
означает что-либо буквенно-цифровое. Так что'[^%w-]
соответствует всему, что не буквенно-цифровое или тире.'%-+'
: Подберите как можно больше штрихов и замените их всего одним штрихом.match'%-?(.*)%-?'
: В Lua, если строка является единственным аргументом функции, скобки не нужны. Нужно проверить только одну черту в начале и в конце, потому что черты уже минимизированы. Нет необходимости в привязке символов, потому что.*
все соответствует, жадный.источник
C 194 байта
Звоните с:
источник
САС, 108
Один из менее конкурентоспособных ответов здесь из-за многословного синтаксиса SAS - штраф в 9 символов за регулярное выражение действительно причиняет боль - но это было хорошее упражнение по изучению регулярного выражения:
источник
Pyth, 35 байтов
объяснение
источник
Perl 6, 75
источник
GNU Sed, 65 байт
Серия подстановок регулярных выражений. Использует непереносимый
\L
из GNU sed для ввода строчных букв. Запустите из файла, используяsed -f
.источник