Monday Mini-Golf: Seria krótkich golfowych wyzwań, opublikowanych (miejmy nadzieję!) W każdy poniedziałek.
Prawdziwa historia 1 : Pewnego dnia bawiłem się na tablecie, gdy wpadłem na pomysł, aby odwiedzić stronę, której zwykle używam na komputerze do testowania JavaScript. Po załadowaniu strony wszedłem do tego prostego programu:
alert("Hello!")
Następnie nacisnąłem przycisk Wykonaj i byłem zaskoczony, gdy powiedział mi, że wprowadzony kod jest nieprawidłowy. Spojrzałem na pole tekstowe i zobaczyłem to:
alllelelerlerlertlert("Heeelelellellelloello!")
Co ??? Nie do tego wszedłem! Co się tu stało? Aby to rozgryźć, wprowadziłem dwie proste linie:
abcdefg
0123456
Okazało się to:
abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefg
0112123123412345123456
Do tej pory nadal nie miałem pojęcia, co się stało z literami, ale liczby wydawały się prostsze, więc przyjrzałem się bliżej. Jak się okazało, strona po prostu wpisywała pierwszy znak, a następnie powtarzała całą resztę w ciągu za każdym razem, gdy naciskany był nowy:
0112123123412345123456
0
1
12
123
1234
12345
123456
Ale co z sekcjami liter? Po chwili zastanowienia zdałem sobie sprawę, że jest tak samo, ale zamiast powtarzać każdą podsekcję raz, powtarza ją dwa razy :
abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefg
a
bb
bcbc
bcdbcd
bcdebcde
bcdefbcdef
bcdefgbcdefg
Połączenie dwóch działa z kombinacją tych technik:
abc123z
abbbcbcbc1bc12bc123bc123zbc123z
a
bb
bcbc
bc1
bc12
bc123
bc123zbc123z
Cokolwiek powoduje usterka, wydaje się, że resetuje się przy interpunkcji i spacjach, więc tak się abc def
dzieje abbbcbc deeefef
.
W tym momencie byłem tak pochłonięty rozpracowaniem go i przekształceniem go w ciekawe wyzwanie, że zapomniałem, dlaczego tam byłem. (Jednak wymyśliłem, jak pisać normalnie: naciskanie spacji po każdym znaku. Dość nudne, ale musisz robić to, co musisz.)
Wyzwanie
Celem wyzwania jest napisanie programu lub funkcji, która pobiera tekst do przetworzenia, wprowadza zmiany wymienione powyżej i wyświetla / zwraca wynik.
Detale
- Dane wejściowe będą zawierały tylko ASCII do wydruku i nie będą zawierać zakładek ani znaków nowej linii.
Przypadki testowe
Wejścia: (jeden na linię)
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!
Wyjścia:
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!
Punktacja
To jest golf golfowy , więc wygrywa najkrótszy prawidłowy kod w bajtach. Tiebreaker przechodzi do przesyłania, które jako pierwsze osiągnęło końcową liczbę bajtów. Zwycięzca zostanie wybrany w poniedziałek, 2 listopada. Powodzenia!
Edit: A zwycięzcą jest ... @ MartinBüttner użyciu Retina dla niesamowitej 43-bajtowy rozwiązanie!
1 Tak, ta historia jest całkowicie prawdziwa, a jeśli potrzebujesz więcej wyjaśnień, patrz przypis 1.
' '.join(x[0]+''.join(2*x[1:i]for i in range(1,len(x)+1)) for x in raw_input().split())
Odpowiedzi:
Siatkówka , 43 bajty
Uruchom kod z jednego pliku z
-s
flagą. Ponieważ jest to tylko jedno podstawienie wyrażenia regularnego, możesz go przetestować tutaj (kliknij kartę Kontekst, aby zobaczyć wyniki).Wyjaśnienie
Odpowiada każdej cyfrze i literze, która nie jest pierwszą w serii. Chociaż
.
może pasować do dowolnego znaku nieciągłego, to lookbehinds zapewniają pozostałe warunki:To pasuje do tyłu od pozycji po
.
. Najpierw dopasowuje jeden lub więcej znaków alfanumerycznych i przechwytuje je do grupy za1
pomocą([^_\W]+)
. To natychmiast zapewnia, że.
odpowiada samemu znakowi alfanumerycznemu. Następnie dodatkowe[^_\W]
upewnia się, że w bieżącym przebiegu jest jeszcze jeden znak alfanumeryczny, którego nie uwzględniamy. Teraz grupą1
jest to, co chcemy zastąpić dopasowaniem, jeśli jest to cyfra - jeśli jest to litera, chcemy zastąpić ją dwukrotnością tego ciągu. Właśnie tutaj pojawia się drugi wygląd:Ten jest opcjonalny, więc jeśli zawiedzie, nie wpłynie w ogóle na dopasowanie. Najpierw upewnia się, że nie
.
była to cyfra przez - więc ten wygląd ma znaczenie tylko wtedy, gdy dopasowujemy litery. W takim przypadku ponownie dopasowujemy grupę (to zawsze pasuje, ponieważ złapaliśmy grupę z tej samej pozycji), ale przechwytujemy ją do grupy .(?<=\D)
\1
2
Dlatego po prostu zastępujemy wyrażenie regularne zawartością obu grup (
$1$2
). Jeśli dopasowanie było cyfrą,$2
nadal będzie puste, a prefiks wypisujemy tylko raz. Jeśli to był list,$2
jest taki sam jak$1
i odpisujemy go dwa razy.źródło
JavaScript (ES6) 82
Korzystanie z optymalizacji wyrażeń regularnych sugerowanej przez Mwr247
Przetestuj poniższy fragment kodu w dowolnej najnowszej przeglądarce
źródło
JavaScript (ES6),
928887Nie mam pojęcia, jak zagrać w golfa ...
Dzięki Mwir247 za wyrażenie regularne w golfa i produkcje ETH dla jednego bajtu golfa w funkcji zmniejszania .
źródło
/[^_\W]+/g
(zapisuje 3 znaki).reduce
funkcji:(a,e)=>a+=(y+=e,++e?y:y+y)
(1 bajt krótszy)Haskell,
215200 bajtówTo bałagan.
Miłej zabawy, czytając wszystkie te dziwactwa, nigdy nie myślałem, że
id
tyle skorzystam.Szkoda tylko, że rzeczy, które już robi pół pracę tutaj musi być importowane (
isDigit
,isAlpha
,inits
).źródło
lang-hs
nielang-haskell
. Podanielang-haskell
go prawdopodobnie spowoduje użycie domyślnego zakreślacza.Gema, 57 znaków
Przykładowy przebieg:
źródło
Haskell,
183181 bajtówStosowanie:
Nie wiem, czy zasadniczo różni się odpowiedź Leifa Willertsa. Ale oto algorytm.
Jakoś trzymam nawiasy klamrowe.
źródło
T-SQL, 357 bajtów
np .:
exec x(@s='1337 numb3r5')
zwraca1333337 nuuumumumbumbumb3umb3rumb3rumb3r5
źródło
Python 2, 131 bajtów
Pętle przechodzą przez znaki i zapisują / powtarzają się w razie potrzeby.
źródło
Pip, 41 bajtów
Traktuje tekst jako argument wiersza polecenia. Używamy wyrażenia regularnego, aby zastąpić wszystkie biegi alfanumeryczne (
[^_\W]+
) funkcją wywołania zwrotnego. Ta funkcja odwzorowuje inną funkcję na każdy znak słowa, generując stopniowo większe ciągi znaków (ze zmienną globalnąy
śledzącą indeks) i powtarzając je X2, jeśli znak nie jest liczbą. (Logika, za pomocą której następuje+
konwersja na liczbę, a następnieQ
sprawdzenie, czy jest ona równa ciągowi znaków z oryginalnym znakiem.) Ten proces pomija jednak pierwszy znak, więc musimy go później dodać (a@0.
).źródło
Python 3 , 86 bajtów
Wypróbuj online!
źródło