Z powodów historycznych bash jest dość mieszanką paradygmatów składniowych i programistycznych - może to sprawiać, że gra w golfa jest niewygodna, a czasem frustrująca. Ma jednak kilka sztuczek, które często sprawiają, że jest konkurencyjny w stosunku do innych skryptów głównego nurtu Języki. Jednym z nich jest rozszerzenie nawiasów klamrowych .
Istnieją dwa podstawowe typy rozszerzania nawiasów:
- Nawiasy klamrowe mogą zawierać rozdzielone przecinkami listy dowolnych ciągów (w tym duplikatów i pustych ciągów). Na przykład
{a,b,c,,pp,cg,pp,}
zostanie rozwinięty doa b c pp cg pp
(zwróć uwagę na spacje wokół pustych ciągów). - Nawiasy klamrowe mogą zawierać punkty końcowe sekwencji oddzielone
..
. Opcjonalnie..
może nastąpić inny , a następnie rozmiar kroku. Punktami końcowymi sekwencji mogą być liczby całkowite lub znaki. Sekwencja automatycznie wzniesie się lub zejdzie w zależności od tego, który punkt końcowy jest większy. Na przykład:{0..15}
rozwinie się do0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
{-10..-5}
rozwinie się do-10 -9 -8 -7 -6 -5
{3..-6..2}
rozwinie się do3 1 -1 -3 -5
{a..f}
rozwinie się doa b c d e f
{Z..P..3}
rozwinie się doZ W T Q
Poza tym nawiasy klamrowe sekwencji i list mogą istnieć z nawiasami klamrowymi:
{a,b,{f..k},p}
rozwinie się doa b f g h i j k p
{a,{b,c}}
rozwinie się doa b c
Nawiasy klamrowe rozszerzają się z ciągami znaków spacji po każdej ich stronie. Na przykład:
c{a,o,ha,}t
rozwinie się docat cot chat ct
Działa to również w przypadku wielu nawiasów klamrowych połączonych razem:
{ab,fg}{1..3}
rozwinie się doab1 ab2 ab3 fg1 fg2 fg3
To może stać się dość skomplikowane. Na przykład:
{A..C}{x,{ab,fg}{1..3},y,}
rozwinie się doAx Aab1 Aab2 Aab3 Afg1 Afg2 Afg3 Ay A Bx Bab1 Bab2 Bab3 Bfg1 Bfg2 Bfg3 By B Cx Cab1 Cab2 Cab3 Cfg1 Cfg2 Cfg3 Cy C
Jeśli jednak między rozwinięciami występuje spacja, wówczas rozwijają się one po prostu jako osobne rozszerzenia. Na przykład:
{a..c} {1..5}
rozwinie się doa b c 1 2 3 4 5
Zwróć uwagę, jak porządek jest zawsze zachowany.
Wpisy dotyczące tego wyzwania będą rozszerzać rozszerzenia nawiasów klamrowych, jak opisano powyżej. W szczególności:
- eval przez
bash
(lub inne powłoki, które wykonują podobne rozszerzenie) jest niedozwolone - nawiasy klamrowe sekwencji zawsze będą numer-na-numer, małe na małe lub duże na duże bez mieszania. Liczby będą liczbami całkowitymi w zakresie 32-bitowym ze znakiem. Jeśli podano, opcjonalny rozmiar kroku zawsze będzie dodatnią liczbą całkowitą. (Pamiętaj, że bash również się rozwinie
{A..z}
, ale można to zignorować w przypadku tego wyzwania) - poszczególne elementy w nawiasach listowych zawsze będą się składać wyłącznie ze znaków alfanumerycznych pisanych wielkimi i małymi literami (w tym pusty ciąg znaków)
- nawiasy klamrowe mogą zawierać dowolne zagnieżdżenia innych rozszerzeń nawiasów klamrowych
- nawiasy klamrowe mogą być konkatenowane dowolną liczbę razy. Będzie to ograniczone pamięcią twojego języka, więc oczekuje się, że teoretycznie możesz wykonać dowolną liczbę konkatenacji, ale jeśli / kiedy zabraknie ci pamięci, nie będziesz się liczył.
Przykłady w powyższym tekście służą jako przypadki testowe. Podsumowując, każdy wiersz danych wejściowych odpowiada tej samej linii danych wyjściowych:
Wejście
{0..15}
{-10..-5}
{3..-6..2}
{a..f}
{Z..P..3}
{a,b,{f..k},p}
{a,{b,c}}
c{a,o,ha,}t
{ab,fg}{1..3}
{A..C}{x,{ab,fg}{1..3},y,}
{a..c} {1..5}
{a{0..100..10},200}r
Wynik
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-10 -9 -8 -7 -6 -5
3 1 -1 -3 -5
a b c d e f
Z W T Q
a b f g h i j k p
a b c
cat cot chat ct
ab1 ab2 ab3 fg1 fg2 fg3
Ax Aab1 Aab2 Aab3 Afg1 Afg2 Afg3 Ay A Bx Bab1 Bab2 Bab3 Bfg1 Bfg2 Bfg3 By B Cx Cab1 Cab2 Cab3 Cfg1 Cfg2 Cfg3 Cy C
a b c 1 2 3 4 5
a0r a10r a20r a30r a40r a50r a60r a70r a80r a90r a100r 200r
Odpowiedzi:
Ruby,
405403401400 bajtówMądry człowiek (Jamie Zawiński) powiedział kiedyś: „Niektórzy ludzie, gdy mają do czynienia z problemem, myślą:„ Wiem, użyję wyrażeń regularnych ”. Teraz mają dwa problemy ”.
Nie sądzę, że w pełni doceniłem ten cytat, dopóki nie spróbowałem rozwiązać tego problemu za pomocą rekursywnego wyrażenia regularnego. Początkowo przypadki wyrażeń regularnych wydawały się proste, dopóki nie miałem do czynienia z przypadkowymi przypadkami obejmującymi litery sąsiadujące z nawiasami, a potem wiedziałem, że jestem w piekle.
W każdym razie uruchom go tutaj online z przypadkami testowymi
Nie golfowany:
źródło
Python 2.7,
752bajtówWow, to jest jak gra w golfa z kodem w jednym wyzwaniu!
Dzięki @Neil za skrócenie lambda
Wyjaśnienie
b
: oblicza zakres zgodnie ze specyfikacją.e
: zwraca pozycję pierwszego najbardziej zewnętrznego zamkniętego nawiasu. Wielokrotny.m
: dzieli najbardziej oddalone elementy na przecinki. Rekurencyjne.n
: łączy tablice podczas sprawdzania pustek.Nie mogłem dostać sięand/or
do pracy.p
: Gdzie wykonuje się większość pracy. Sprawdza wszystkie przypadki (Zasięg, tylko lista, należy połączyć). Rekurencyjne.o
: Co należy wziąć wkład. Formaty wejścia / wyjścia dop
.Czuję, że mogę poprawić się w niektórych miejscach, więc postaram się pograć bardziej w golfa. Powinienem też bardziej szczegółowo wyjaśnić.
źródło
[c+d for c in a for d in b] or a or b
się pracy.JavaScript (Firefox 30-57),
465427425 bajtówWersja ES6
f
waży dodatkowe 10 bajtów:Objaśnienie: Zaczyna się od zamiany spacji w przecinki i zawinięcie całego łańcucha
{}
dla zachowania spójności (dzięki @Blue za pomysł). Następnie wyszukuje wszystkie{..}
konstrukty i rozwija je do{,}
konstrukcji. Następnie używa rekurencji, aby wielokrotnie rozszerzać wszystkie{,}
konstrukcje od wewnątrz. Na koniec zastępuje wszystkie przecinki spacjami.źródło