Ludzie na tej stronie naprawdę lubią upiększać tytuły swoich postów ...
Stewie's sequence: + * - / + * - /
Jednak gdy tytuł ten musi być zawarty w adresie URL strony, jest uproszczony:
stewies-sequence
Wyzwanie
Twoim zadaniem jest stworzenie programu lub funkcji, która, biorąc pod uwagę ciąg znaków reprezentujący tytuł postu, wyświetla / zwraca konwersję „przyjazną adresowi URL”.
Algorytm to:
- Konwertuj na małe litery (w stosownych przypadkach)
- Zamień każdą spację (
), kropkę (
.
), przecinek (,
) lub ukośnik (/
) na myślnik (-
) - Usuń wszystkie znaki niealfanumeryczne, z wyjątkiem myślników.
- Zminimalizuj grupy sąsiadujących myślników (
a---b -> a-b
), usuń te, które prowadzą / kończą.
Należy pamiętać, że ten algorytm jest uproszczeniem i nie zawsze może dawać takie same wyniki, jak prawdziwa metoda witryny.
Zasady
- Możesz założyć, że dane wejściowe:
- Nie będzie pusty.
- Będzie zawierać co najmniej jeden znak alfanumeryczny.
- Będzie zawierał tylko znaki z zakresu ASCII 32-126 (do wydruku)
- Pełne programy lub funkcje są dozwolone.
- Wbudowanym poleceniem, które ma zadanie dokładną specyfikację jest nie dozwolone.
- To jest golf golfowy , więc wygrywa najkrótsze rozwiązanie (w bajtach)!
Przypadki testowe
Większość postów na tej stronie będzie służyć jako testy, ale oto przydatna lista:
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
Niektóre dłuższe ...
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
I niektóre próbki sprawdzające wielkość liter (możesz zaproponować więcej):
0123 -> 0123
a a1 -> a-a1
2-1=1 -> 2-11
-
? Czy będą musiały zostać usunięte? Na przykład zaasdf-
czy ostatnie będą-
musiały zostać usunięte?if(isalphanum(ch))...
_
podkreśleniami? Mój kod działa poza przypadkami podkreślenia.Odpowiedzi:
Retina,
3331 bajtów(Program ma końcowy znak nowej linii)
Nie jestem pewien, czy mogę z tego wycisnąć więcej. To powinno obejmować wszystko. Przyszedł podobny do Mama Fun Roll's. Kolejna 33-bajtowa wersja z rekursywnymi wyrażeniami regularnymi
Wypróbuj online!
Wyjaśnienie
Ta linia jest prosta, konwertuje się na małe litery przez T ransliterating
A-Z
(L
) naa-z
(l
, małe litery).Ten etap jest prosty, zasadniczo pozbywa się wszystkich niepotrzebnych postaci, aby później zaoszczędzić sobie wielu kłopotów
[^a-z ,-9]
Pasuje do każdego znaku, który NIE jest:a-z
: małe litery (pamiętaj, że cały ciąg jest pisany małymi literami z powodu poprzedniego elementu): znak kosmiczny
,-9
Zakres ten jest kod z char,
do9
których dzieje się,-./0123456789
dokładnie znaki musimyNastępnie konwertujemy wszystkie znaki alfanumeryczne na myślniki (co jest teraz sprawiedliwe
i
,./-
.To nie będzie (nie) pasowało
_
do\w
(uwzględnionego\W
), ponieważ zostało usunięte w poprzednim etapieźródło
a = b
.a = b
:(JavaScript (ES6),
90827975 bajtówJest to próba wykonania zadania za pomocą jednego
replace()
. Ten kod wyodrębnia tylko znaki, którymi jesteśmy zainteresowani, i ignoruje wszystko inne. Istnieje pewna dodatkowa logika przetwarzania łączników.Przypadki testowe
Pokaż fragment kodu
źródło
,a^a,
ten kod podaje-aa-
(są łączniki wiodące / końcowe)V ,
41, 40, 37, 36 bajtówWypróbuj online! lub Sprawdź wszystkie przypadki testowe jednocześnie!
Jak zwykle tutaj zawiera kilka znaków niedrukowalnych i nie-ASCII, więc oto zrzut heksowy:
Takie wyzwania jak te, w których przydaje się system „Compressed regex”.
Wyjaśnienie
Po pierwsze, przekonwertujemy wszystko na małe litery. Na szczęście istnieje naprawdę wygodny sposób na zrobienie tego w dwóch bajtach. Tutaj napisałem o tym wskazówkę . Tak robimy
Następnie wykonujemy kilka skompresowanych poleceń zastępczych. Fajny przegląd działania skompresowanego wyrażenia regularnego V można tutaj znaleźć , ale podstawową ideą jest to, że możemy ustawić wysoki bit, aby uniknąć konieczności ucieczki przed niektórymi postaciami. Inną wygodą jest to, że zakresy (podobne
:%
) i flagi (podobne/g
) są automatycznie wypełniane. Ale ostatecznie wszystko to przekłada się na polecenia zastępujące vim. W rzeczywistości moglibyśmy nawet bezpośrednio przetłumaczyć resztę programu na vim. To dałoby nam to:Jeśli mówisz vim-regex, powinno być bardziej jasne, co robi teraz reszta programu. Oto reszta programu:
źródło
JavaScript (ES6) 91
961 bajt zaoszczędzony dzięki produkcji @ETH
Test
źródło
*
w ostatnim wyrażeniu regularnym, chociaż mogę się mylićPython 3,
1031009695 bajtów5 bajtów zapisanych dzięki Flp.Tkc
źródło
Retina, 34 bajty
Wypróbuj online!
Zwróć uwagę na końcowy znak nowej linii. Zasadniczo wdrożenie PO.
źródło
T`L`l
aby przejść do małych liter z mniejsząa..
[\W]
jest po prostu\W
MATL , 38 bajtów
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
źródło
Rubinowy ,
6160616453 bajtów(52 bajty kodu plus jeden bajt dla
-p
)Wypróbuj online!
Aktualizacja 1:
Użyciegets
zamiast trybu edycji strumienia Ruby oszczędza jeden bajt.Powrócił jak za sugestią ValueInk użytkownika .
Aktualizacja 2: (+3 bajty ogółem)
..--hi, $/
(→hi
) (+10 bajtów) - ponownie dzięki uprzejmości użytkownika ValueInk-p
(+1 bajt)squeeze
i wykorzystałemgsub
zamiast tego (+2 bajty) , co pozwoliło mi:strip
do obsługi wiodących i końcowych myślników (-10 bajtów) .Aktualizacja 3: Hattrick firmy ValueInk. Oszczędzamy 11 bajtów, wykorzystując
String#split
nawyk automatycznego ściskania przebiegów tego samego separatora, co pozwala nam porzucić cały finałstrip
/gsub
łańcuch i zastąpić go kombinacjąsplit
/join
. (-11 bajtów)źródło
-p
flagą, ale na pewno nie.-p
flagi niejawnie dodaje 1 bajt do kodu (ponieważ zmienia wykonanie kodu zruby -e 'your code'
naruby -pe 'your code'
). Znalazłem również jeden przypadek zbocza, w którym daje on-hi-
dane wejściowe, na przykład..--hi, $/
kiedy powinieneś usunąć wszystkie wiodące / końcowe myślniki i w ten sposób powrócićhi
.gsub(/[^\w ]/){}
natr('^a-z ','')
, a następnie kończąc na.split*?-
zamiast,.strip.gsub...
ponieważ automatycznie obsługuje duplikaty i końce łańcucha, wszystko za jednym razem!JavaScript (ES6),
7469 bajtówEdycja: Zapisałem 5 bajtów, wiedząc, że już usunąłem wszystkie znaki, z wyjątkiem
-/,. 0-9a-z
tego, że mogę użyć,\w
aby dopasować pozostałe słowa.źródło
[a-z\d]
może być[^\W_]
?PHP, 87 bajtów
Idea wyrażeń regularnych pochodzi z istniejących odpowiedzi.
Wymaga posiadania serwera z PHP i dostępu przez HTTP.
Tytuł musi znajdować się na klawiszu
T
, a wynik zostanie wydrukowany na ekranie.Przykład:
http://localhost/title.php?T=<my shiny title>
źródło
narzędzia bash / Unix, 56 bajtów
Zamień wielkie litery na małe litery, a wymagane znaki specjalne na myślniki.
Usuń (-d opcję do tr) znaków innych niż litery, cyfry i myślniki, a następnie ściśnij (-s opcję do tr) wielu myślników z rzędu w jednym myślniku.
Usuń myślniki na początku, a następnie na końcu.
źródło
PowerShell, 85 bajtów
uczynić go małymi literami, a następnie 3 regex replaces w rzędzie i przycinania wszelkie końcowe
-
„sźródło
$input
zaoszczędzić Ci 2 bajtów?JavaScript,
90989493919091 bajtów1 bajt zapisany dzięki @ edc65!
1 bajt zapisany dzięki @IsmaelMiguel za wykrycie wiodącego średnika!
1 bajt uzyskany po nieudanej próbie
,a-^-a,
Najbardziej podoba mi się to zgłoszenie. W pierwszym
replace
, usuwamy wszystko, co nie jest alfanumeryczny, a nie,
,-
,.
,/
a nie przestrzeń. Używamya-z
do wykrywania liter i,-9
wykrywamy te znaki specjalne i liczby, ponieważ kody znaków tych literałów ASCII wszystkie są w jednej linii!Pokaż fragment kodu
źródło
f=
więc liczba bajtów wynosi teraz 96. I nie potrzeba \ wewnątrz zakresu w...title
f=
, a;
na końcu. Po prostu określ, że jest to funkcja anonimowa. Dzięki temu Twoja odpowiedź powinna mieć długość 90 bajtów.Lua, 91 bajtów
Gdzie
a
jest ciąg adresu URL.Wyjaśnienie:
a:lower()
zwraca funkcję małych liter:gsub
znajduje dopasowanie wzorca i zastępuje go łańcuchem.'[ .,/]'
: Nawiasy oznaczają „lub”, więc pasuje do spacji, kropki, przecinka i ukośnika. Nie trzeba być chciwym, ponieważ:gsub
robi to wszystko.'[^%w-]'
:^
oznacza „nie” w nawiasach,%w
oznacza cokolwiek alfanumerycznego.'[^%w-]
Dopasowuje więc wszystko, co nie jest alfanumeryczne ani myślnik.'%-+'
: Dopasuj jak najwięcej myślników i zastąp je jednym myślnikiem.match'%-?(.*)%-?'
: W Lua, jeśli ciąg jest jedynym argumentem funkcji, nawiasy nie są potrzebne. Wystarczy sprawdzić tylko jedną kreskę na początku i na końcu, ponieważ kreski zostały już zminimalizowane. Nie ma potrzeby używania znaków kotwicy, ponieważ.*
pasuje do wszystkiego, chciwy.źródło
C, 194 bajty
Zadzwoń z:
źródło
SAS, 108
Jedna z mniej konkurencyjnych odpowiedzi tutaj ze względu na pełną składnię SAS - kara 9 znaków za wyrażenie regularne naprawdę boli - ale było to dobre ćwiczenie uczenia się wyrażeń regularnych:
źródło
Pyth, 35 bajtów
Wyjaśnienie
źródło
Perl 6, 75
źródło
GNU Sed, 65 bajtów
Seria podstawień wyrażeń regularnych. Używa nieprzenośnych danych
\L
z GNU sed do wprowadzania małych liter. Uruchom z pliku za pomocąsed -f
.źródło