Заголовки для URL-адрес


28

Люди на цьому сайті дуже люблять прикрашати свої посади ...

Stewie's sequence: + * - / + * - /

Однак, коли цей заголовок потрібно включити до URL-адреси сторінки, це спрощується:

stewies-sequence

Змагання

Ваше завдання - створити програму або функцію, яка, задавши рядок, що представляє назву посади, виводить / повертає перетворення "Приємно для URL".

Алгоритм:

  • Перетворити в малі регістри (де це можливо)
  • Замініть кожен пробіл ( ), період ( .), кома ( ,) або косою рисою ( /) на тире ( -)
  • Видаліть будь-які не буквено-цифрові символи, крім тире.
  • Мінімізуйте групи суміжних тире ( 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

Що про ведучі -s? Чи доведеться їх зняти? Наприклад asdf-, чи -доведеться видаляти останні ?
Kritixi Lithos

Чи можемо ми використовувати вбудовану функцію, щоб перевірити, чи така графіка буквено-цифрова, як цеif(isalphanum(ch))...
Мукул Кумар

1
@KritixiLithos Зменшіть групи сусідніх тире (a --- b -> ab), видаліть усі, що ведуть / затримують. Я думаю, це має дати вам зрозуміти.
Мукул Кумар

А як щодо _підкреслення? Мій код працює за винятком випадків, коли є підкреслення.
Kritixi Lithos

@ L3viathan Неважливо зараз, я змінив свій код, щоб навіть підкреслення було видалено
Kritixi Lithos

Відповіді:


7

Сітківка, 33 31 байт

T`L`l
[^a-z ,-9]+

\W+
-
^-|-$

(У програмі є зворотний новий рядок)

Я не впевнений, що зможу вичавити більше з цього. Це повинно охоплювати все. Вийшов схожим на Mama Fun Roll's. Ще 33-байтна версія з використанням рекурсивних регулярних виразів

Спробуйте в Інтернеті!

Пояснення

T`L`l

Цей рядок простий, він перетворюється на малі регістри за допомогою T ransliterating A-Z( L) в a-z( l, малі регістри).


Цей етап простий, він по суті позбавляється від усіх непотрібних персонажів, щоб потім позбавити від себе багато клопоту

[^a-z ,-9]+

[^a-z ,-9] Відповідає будь-якому символу, який НЕ:

  • a-z: алфавіт з нижнього регістру (пам'ятайте, що весь рядок є малим через попередній елемент)
  • : космічний показник
  • ,-9це діапазон чар-кодів, ,до 9якого трапляються ,-./0123456789саме ті символи, які нам потрібні

Далі ми перетворюємо всі не алфавітно-цифрові знаки в тире (що зараз справедливо і ,./-.

\W+
-

Це не (не) збіг, _який включений у \w(заперечення \W), оскільки він був видалений на попередньому етапі


Я думаю, це не вдасться для таких матеріалів a = b.
Мартін Ендер

Я дуже хочу прийняти це, але, як сказав Мартін, він не зменшує суміжні тире, коли ви вводите a = b:(
FlipTack

@ Flp.Tkc вибачте за пізню відповідь (Тиждень фіналу зараз). Мені вдалося вичавити ще два байти і виправити це. Я вважаю, що це правильно
вирішує

9

JavaScript (ES6), 90 82 79 75 байт

Це спроба виконати роботу з синглом replace(). Цей код витягує лише символів, які нас цікавлять, і ігнорує все інше. Існує деяка додаткова логіка для обробки дефісів.

s=>(s.toLowerCase().replace(/[ a-z,-9]/g,c=>S=c<'0'?s+'-':s=s?S+c:c,s=0),s)

Тестові справи


1
Бо ,a^a,цей код дає -aa-(є провідні /
слідні

@KritixiLithos О, дякую, що вказав на це. Я не звернув уваги на це правило. Це слід виправити.
Арнольд

9

V , 41, 40, 37 , 36 байт

VuÍ[ .,\/]/-
Í0-9a-z­]
Í-«/-
Í^-ü-$

Спробуйте в Інтернеті! або Перевірте всі тестові справи одразу!

Як зазвичай, тут міститься купа недрукованих та не ASCII символів, тому ось шестинадцять:

0000000: 5675 cd5b 202e 2c5c 2f5d 2f2d 0acd 8430  Vu.[ .,\/]/-...0
0000010: 2d39 612d 7aad 5d0a cd2d ab2f 2d0a cd5e  -9a-z.]..-./-..^
0000020: 2dfc 2d24                                -.-$

Такими проблемами є, коли V-система «Стиснутий регулярний вираз» стане в нагоді.

Пояснення

Спочатку все спочатку ми перетворимо все на малі регістри. На щастя, існує дійсно зручний спосіб зробити це в два байти. Я написав поради про це тут . Так ми і робимо

V           " Visually select this whole line
 u          " Convert this whole line to lowercase

Після цього робимо купу стислих команд-замінників. Приємний огляд того, як працює стислий вираз V, може бути зіпсований тут , але основна ідея полягає в тому, що ми можемо встановити високий біт, щоб уникнути необхідності уникнути певних символів. Ще одна зручність полягає в тому, що діапазони (як :%) і прапори (подібні /g) автоматично заповнюються. Але врешті-решт, це все перекладається на команди-підміни vim. Насправді, ми могли навіть безпосередньо перекласти решту програми на vim. Це дало б нам це:

:%s/[ .,/]/-/g
:%s/[^0-9a-z\-]//g
:%s/-\+/-
:%s/^-\|-$//g

Якщо ви говорите на vim-regex, то має бути більш зрозуміло, що зараз робить програма. Отже, ось решта програми:

Í               " Substitute:
 [ .,\/]        "   a space, period, comma or forward slash. (Due to a strange bug, this needs to be escaped)
        /-      "   with a dash
Í               " Remove:
 [^0-9a-z­]     "   Any character that is not a dash or alpha-numeric
Í               " Substitute:
 -«             "   One or more dashes
   /-           "   with one dash
Í               " Remove:
 ^-             "   A dash at the beginning of a line
   ü            "   OR
    -$          "   a dash at the end of a line

8

JavaScript (ES6) 91 96

1 байт збережено thx @ETHproductions

s=>s.toLowerCase().replace(/([ .,/-])|\W|_/g,(c,d)=>d?'-':'').replace(/^-*|-*$|-(?=-)/g,'')

Тест

F=
s=>s.toLowerCase().replace(/([ .,/-])|\W|_/g,(c,d)=>d?'-':'').replace(/^-*|-*$|-(?=-)/g,'')

;[['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']]
.forEach(t=>{
  var i=t[0],k=t[1],r=F(i)
  console.log(r==k?'OK':'KO',i+' -> '+r,r==k?'':k)
})


Це точно такий же кількість рахунків, як і моя відповідь, якщо він перетворений на названу функцію
Kritixi Lithos

Не думаю, що тобі потрібен останній *в останньому регексе, хоча я можу помилятися
ETHproductions

Можливо, я помиляюся, але ви впевнені, що пошук потрібен?
Kritixi Lithos

@KritixiLithos lookahead потрібно тримати принаймні 1 - всередині рядка, видаляючи все на початку та в кінці
edc65

@ETHproductions справа, дякую
edc65

4

Python 3, 103 100 96 95 байт

5 байт збережено завдяки Flp.Tkc

import re
lambda s,y=re.sub,d='-':y('-+',d,y('[^0-9a-z-]','',y('[ .,/]',d,s.lower()))).strip(d)

@ Flp.Tkc Дійсно ..
L3viathan

На жаль, я випадково спростував це. Я не можу змінити свій голос, поки ви не редагуєте цю публікацію
Kritixi Lithos

@KritixiLithos Зроблено
L3viathan

4

Сітківка, 34 байти

T`L`l
[^ az \ d., / -] +

\ W +
-
^ - | - $

Спробуйте в Інтернеті!

Зверніть увагу на останній рядок. По суті, впровадження ОП.


Посилання TIO вказує на дещо інший код
Kritixi Lithos

Так, я це просто виправив.
Mama Fun Roll

1
Ви можете T`L`lперейти на малі регістри з меншим
числом

Невдача на a..snd схожа
Downgoat

2
[\W]просто\W
Мартін Ендер

3

MATL , 38 байт

'-'jyvk45y' .,/'m(t8Y245hm)'-*'45YX6L)

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Пояснення

'-'jyv       % Take input line. Append and prepend a dash. Gives a char column vector
k            % Convert to lowercase
45y' .,/'m(  % Replace any of ' .,/' by a dash, using assignment indexing
t8Y245hm)    % Keep only alphanumeric chars or dashes, using reference indexing
'-*'45YX     % Replace each run of dashes by a single dash, using a regular expression
6L)          % Remove first and last chars, which are always dashes. Implicitly display

3

Рубі , 61 60 61 64 53 байт

(52 байти коду плюс один байт для -p)

$_=$_.tr("A-Z ,-/","a-z ").gsub(/[^\w ]/){}.split*?-

Спробуйте в Інтернеті!

tr()- конвертувати великі літери, пробіл, кома, період та косу рису. Тимчасово замініть -пробіл, щоб потім можна було використовувати strip.
Зауважте, що -символ у "A-Z ,-/"виразі насправді є оператором діапазону, що також робить .персонаж підданим перетворенням. Цей маневр насправді не оббрине байтами, але він фантазійний, тому він може залишитися.

gsub(/[^\w ]/){} - видаліть усіх символів, які не містяться у дозволеному наборі.

split- Технічно нам цей масив точно не потрібен, але splitвиключає провідні та кінцеві пробіли (що насправді є масками -у масках). Як бонус, це стискає прогони кількох пробілів.

*?-- Стенограма для .join("-"); це обертає одночасно і попередню splitоперацію, і трансформацію пробілу. Ще один байт зберігається за допомогою скороченого позначення для символьних літералів , завдяки чому програма потребує Ruby 1.9 або новіших.

Оновлення 1: Використання getsзамість режиму редагування потоку Ruby економить один байт.
Повернено відповідно до пропозиції ValueInk .

Оновлення 2: (+3 байт загалом)

  • Виправлений крайовий регістр ..--hi, $/(→ hi) (+10 байт) - ще раз ввічливість користувача ValueInk
  • Взяв малус за -p (+1 байт)
  • Позбувся squeezeта використав gsubнатомість (+2 байти) , що дозволило мені:
  • Використовуйте stripдля обробки провідних та кінцевих тире (-10 байт) .

Оновлення 3: Hattrick від ValueInk. Ми економимо 11 байтів, використовуючи String#splitзвичку автоматичного стискання прогонів одного і того ж сепаратора, що дозволяє нам скинути весь фінал strip/ gsubланцюг і замінити його на split/ joinкомбо. (-11 байт)


Це повертає лише рядок у середовищі REPL і не працює, якщо запускатись як належна програма Ruby, і це не добре. Повні програми або лише функції / лямбда. Насправді ваша стара версія працювала б з -pпрапором, але це точно не буде.
Значення чорнила

@ValueInk Ви, звичайно, правильні. Я відповідно змінив своє рішення. Дякуємо за Ваш коментар; саме ці настанови я ціную дуже багато, оскільки це моя перша спроба в гольфі.
Синолі

1
Дякуємо вам за виправлення; Я видалив свій потік. Варто зазначити, що за допомогою -pпрапора неявно додається 1 байт до вашого коду (оскільки він змінює виконання вашого коду з ruby -e 'your code'на ruby -pe 'your code'). Я також знайшов один крайній випадок, коли він дає -hi-введення, наприклад, ..--hi, $/коли вам слід видалити всі провідні / кінцеві тире і, таким чином, повертатися hi.
Значення чорнила

2
-2 байти, змінивши gsub(/[^\w ]/){}на tr('^a-z ',''), а потім закінчившись .split*?-замість того, що .strip.gsub...він автоматично обробляє дублікати та кінці рядка, все за один раз!
Значення чорнила

1
Оскільки цього ніхто не сказав, ласкаво просимо до коду-гольфу!
FlipTack

3

JavaScript (ES6), 74 69 байт

f=
s=>s.toLowerCase().replace(/[^-/,. a-z\d]/g,``).match(/\w+/g).join`-`
<input oninput=o.textContent=/[a-z\d]/i.test(this.value)?f(this.value):``><pre id=o>

Редагувати: Збережено 5 байтів, зрозумівши, що я вже видалив усі символи, за винятком -/,. 0-9a-zтого, що я можу використовувати, \wщоб відповідати рештам слова.


Я думаю, що вам потрібно включити HTML код у побічний рахунок, оскільки він використовується для вирішення проблеми
Kritixi Lithos

1
@KritixiLithos Ні, це лише для демонстраційних цілей. Питання говорить про те, що мій код може мати принаймні один буквено-цифровий символ, а HTML-код просто перевіряє це перед тим, як викликати функцію.
Ніл

[a-z\d]міг бути [^\W_]?
edc65

@ edc65 Приємно, але я зрозумів, що це може бути ще простіше!
Ніл

2

PHP, 87 байт

Ідея регулярних виразів виходить із існуючих відповідей.

<?=trim(preg_replace(['@[^ a-z,-9]@','@[ ,-/]+@'],['','-'],strtolower($_GET[T])),'-');

Для цього потрібно мати сервер, на якому працює PHP, та доступ через HTTP.

Заголовок повинен бути на клавіші T, а результат буде надруковано на екрані.

Приклад: http://localhost/title.php?T=<my shiny title>


2

інструменти bash / Unix, 56 байт

tr A-Z\ .,/ a-z-|tr -cds a-z0-9- -|sed s/^-//|sed s/-$//

Замініть великі регістри малими літерами, а потрібні спеціальні символи - тиреми.

Видаліть (-d варіант до tr) символи, відмінні від літер, цифр та тире, а потім видавіть (-s варіант на tr) кілька тире в ряд в один тире.

Видаліть тире спочатку, а потім у кінці.


2

Powershell, 85 байт

($args[0].ToLower()-replace'[ .,/]','-'-replace'[^a-z,-9]'-replace'-+','-').Trim('-')

зробити його в нижньому регістрі, а потім 3 регулярних виразів замінює в рядку, і обрізати будь-які хвостових -«S


може не $inputзекономити 2 байти?
британіст

2

JavaScript, 90 98 94 93 91 90 91 байт

1 байт збережено завдяки @ edc65!

1 байт збережено завдяки @IsmaelMiguel за те, що він виявив провідну напівкрапку!

1 байт, отриманий після відмови для ,a-^-a,

f=s=>s.toLowerCase().replace(/[^ a-z,-9]/g,"").replace(/[ ,-/]+/g,"-").replace(/^-|-$/g,"")

Що найбільше мені подобається в цьому конкретному поданні - це діапазони. У першому replace, ми прибираємо всі , що ні алфавітно - цифровий , а не ,, -, ., /а не простір. Ми використовуємо a-zдля виявлення букв, і ми використовуємо ,-9для виявлення цих спеціальних символів та цифр, оскільки всі символьні коди цих літератур ASCII складаються!

, = 44
- = 45
. = 46
/ = 47
0 = 48
...
9 = 57


Не видаляє провідні тире: "-1" стає "-1", коли він повинен стати "1".
L3viathan

@ L3viathan Має працювати зараз
Kritixi Lithos

Не потрібно рахувати, f=тому кількість байтів зараз 96. І немає необхідності \ в межах діапазону в регулярному вираженні, так що це може бути 95. Але ... все ще не працює: спробуйте...title
edc65

1
Гей! Я не такий уже й старий! (65 не 64)
edc65

1
Я вважаю , що вам не потрібно , f=а ;в кінці. Просто вкажіть, що це анонімна функція. При цьому ваша відповідь повинна бути довжиною 90 байт.
Ісмаїл Мігель

1

Луа, 91 байт

a=a:lower():gsub( '[ .,/]', '-' ):gsub( '[^%w-]', '' ):gsub( '%-+', '-' ):match'%-?(.*)%-?'

Де aрядок URL.

Пояснення:

  • Більшість це досить прямо вперед. a:lower()повертає малу функцію
  • :gsub знаходить відповідність шаблону і замінює його рядком.
  • '[ .,/]': Дужки означають "або", тому це відповідає простору, періоду, комах та косою рисою. Не потрібно бути жадібним, бо :gsubвсі випадки.
  • '[^%w-]': ^означає "не", коли всередині дужок %wозначає щось буквено-цифрове. Таким чином '[^%w-]відповідає всім, що не буквено-цифровим чи тире.
  • '%-+': Зрівняйте стільки тире, скільки зможете, і замініть їх лише одним тире.
  • match'%-?(.*)%-?': У Lua, якщо рядок є єдиним аргументом функції, дужки не потрібні. Потрібно перевірити лише один тире на початку та в кінці, оскільки тире вже зведено до мінімуму. Немає необхідності в якірних персонажах, тому що .*це відповідає всім, жадібним.

1

С, 194 байти

i,j;f(char*s,char*d){if(*s>47&*s<58|*s>96&*s<123)d[i++]=*s;if(*s>64&*s<91)d[i++]=*s+32;if(i-j&&*s>43&*s<48|*s==32&&*(s+1)&&*(s+1)>47|(*(s+1)<44&&*(s+1)^32)){d[i++]=45;j=i;}*++s?f(s,d):(d[i]=0);}

Телефонуйте за допомогою:

int main()
{
    char *in="Loading... Forever";
    char out[128];
    f(in,out);
    puts(out);
}

1

SAS, 108

Один з менш конкурентоспроможних відповідей тут через багатослівний синтаксис SAS - покарання з 9 символів за регулярний вираз дійсно болить - але це було гарним навчанням для регулярного вираження:

t=prxchange('s/^-|-$//',-1,prxchange('s/-+/-/',-1,compress(translate(lowcase(t),'----',' .,/'),'-','adk')));

1

Pyth, 35 байт

:r::rQ0"[-.,/]"d"[^\w ]"k6"[ -]+"\-

Пояснення

    rQ0                              Convert letters to lower case
   :   "[-.,/]"d                     Replace all -.,/ with spaces
  :             "[^\w ]"k            Remove all remaining symbols
 r                       6           Remove leading and trailing spaces
:                         "[ -]+"\-  Turn runs of spaces and dashes to one dash

1

Перл 6, 75

{lc .subst(/<[\ .,/]>/,"-"):g.subst(/<[\W]-[\-]>/,""):g.subst(/\-+/,"-"):g}

0

GNU Sed, 65 байт

s/.*/\L\0/
s@[ .,/]@-@g
s/[^-a-z0-9]//g
s/-\+/-/g
s/^-\|-$//g

Серія підстановок регулярних виразів. Використовує не портативний \Lз GNU sed для малого входу. Запустити з файлу за допомогою sed -f.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.