Mathematica, 72 65 61 bajtów
Print@@@Tuples@{a=##/(b=#5#9#15#21#25#)&@@Alphabet[],b,a,b,a}
Do testowania, polecam zastąpienie Print@@@
z ""<>#&/@
. Mathematica wyświetli wtedy skróconą formę pokazującą kilka pierwszych i ostatnich słów, zamiast ciągłego drukowania 288 000 wierszy.
Wyjaśnienie
W końcu znalazłem zastosowanie do dzielenia ciągów. :)
Intryguje mnie możliwość dodawania lub mnożenia ciągów przez jakiś czas, ale rzeczywiste przypadki użycia są dość ograniczone. Chodzi przede wszystkim o to, że coś podobnego "foo"+"bar"
lub "foo"*"bar"
(a zatem krótka forma "foo""bar"
) jest całkowicie poprawne w Mathematica. Jednak tak naprawdę nie wie, co zrobić z ciągami w wyrażeniach arytmetycznych, więc te rzeczy pozostają niedocenione. Mathematica ma zastosowanie ogólnie obowiązujące uproszczeń chociaż. W szczególności ciągi znaków zostaną posortowane w porządku kanonicznym (co jest dość pomieszane w Mathematica, gdy zaczniesz sortować ciągi zawierające litery różnych przypadków, cyfr i nieliterów), co często jest łamaczem, ale nie ma tutaj znaczenia . Ponadto "abc""abc"
zostanie uproszczony do"abc"^2
(co jest problemem, gdy powtarzasz ciągi, ale my też tego nie mamy), a coś takiego "abc"/"abc"
faktycznie anuluje (z którego będziemy nawet korzystać).
Więc co próbujemy tutaj grać w golfa? Potrzebujemy listy samogłosek i listy spółgłosek, abyśmy mogli je karmić, Tuples
aby wygenerować wszystkie możliwe kombinacje. Moje pierwsze podejście było naiwnym rozwiązaniem:
Characters@{a="bcdfghjklmnpqrstvwxz",b="aeiouy",a,b,a}
Ta zakodowana lista spółgłosek trochę boli. Mathematica ma Alphabet
wbudowaną funkcję, która pozwoliłaby mi tego uniknąć, gdybym był w stanie usunąć samogłoski w tani sposób. Tutaj jest jednak trudniej. Najprostszym sposobem na usunięcie elementów jest Complement
, ale ostatecznie jest to dłuższe, przy użyciu jednej z następujących opcji:
{a=Complement[Alphabet[],b=Characters@"aeiouy"],b,a,b,a}
{a=Complement[x=Alphabet[],b=x[[{1,5,9,15,21,25}]]],b,a,b,a}
(Pamiętaj, że nie musimy już stosować Characters
się do całości, ponieważ Alphabet[]
podaje listę liter, a nie ciąg znaków).
Spróbujmy więc tego biznesu arytmetycznego. Jeśli reprezentujemy cały alfabet jako iloczyn liter zamiast listy, możemy usunąć litery przez prosty podział, z powodu reguły anulowania. To oszczędza wiele bajtów, ponieważ nie będziemy potrzebować Complement
. Co więcej, "a""e""i""o""u""y"
jest tak naprawdę bajtem krótszym niż Characters@"aeiouy"
. Robimy to z:
a=##/(b="a""e""i""o""u""y")&@@Alphabet[]
Gdzie przechowujemy produkty spółgłoski i samogłoski odpowiednio w a
i b
. Działa to poprzez napisanie funkcji, która zwielokrotnia wszystkie argumenty ##
i dzieli je przez iloczyn samogłosek. Ta funkcja jest stosowana do listy alfabetycznej, która przekazuje każdą literę jako osobny argument.
Jak dotąd tak dobrze, ale teraz mamy
{a=##/(b="a""e""i""o""u""y")&@@Alphabet[],b,a,b,a}
jako argument do Tuples
, a te rzeczy wciąż są produktami, a nie listami. Zwykle najkrótszym sposobem na naprawę jest umieszczenie List@@@
z przodu, który ponownie zamienia produkty w listy. Niestety dodanie tych 7 bajtów wydłuża czas naiwności.
Okazuje się jednak, że Tuples
wcale nie przejmuje się głowami list wewnętrznych. Jeśli zrobisz
Tuples[{f[1, 2], f[3, 4]}]
(Tak, dla nieokreślonego f
.) Otrzymasz:
{{1, 3}, {1, 4}, {2, 3}, {2, 4}}
Tak jakbyś użył List
zamiast f
. Możemy więc przekazać te produkty bezpośrednio Tuples
i nadal uzyskać właściwy wynik. To oszczędza 5 bajtów w stosunku do naiwnego podejścia przy użyciu dwóch zakodowanych ciągów.
Teraz "a""e""i""o""u""y"
jest to wciąż dość irytujące. Ale poczekaj, możemy też tutaj zapisać kilka bajtów! Argumentami naszej funkcji są pojedyncze litery. Jeśli więc wybieramy odpowiednie argumenty, możemy użyć ich zamiast literałów łańcuchowych, co jest krótsze dla trzech z nich. Chcemy argumenty #
(skrót #1
), #5
, #9
, #15
, #21
i #25
. Jeśli umieścimy #
na końcu, nie musimy też dodawać żadnych, *
aby je pomnożyć, ponieważ (regex) #\d+
jest kompletnym tokenem, do którego nie można dołączyć żadnych cyfr innych niż cyfry. W efekcie #5#9#15#21#25#
oszczędzamy kolejne 4 bajty.