Twoim zadaniem jest napisanie programu, który wyświetli czytelną listę co pięć liter słów o strukturze:
spółgłoska - samogłoska - spółgłoska - samogłoska - spółgłoska
Dane wyjściowe powinny być sortowane alfabetycznie z jednym słowem w wierszu i bez powtarzania dwóch słów. Może być małe lub wielkie, ale nie mieszane. Aby lista mogła zaczynać się i kończyć w ten sposób:
babab
babac
babad
...
zyzyw
zyzyx
zyzyz
Samogłoski są - e - i - o - u - y , inne 20-angielskie litery alfabetu są spółgłoski.
Słowa nie muszą być rzeczywistymi słowami słownikowymi.
Najkrótszy kod wygrywa.
Uwaga: kilka lat temu natknąłem się na program na stronie uniwersyteckiej, który właśnie to zrobił. Okazało się, że moje imię i nazwisko pasują do ograniczenia cvcvc, a ja googlowałem.
Odpowiedzi:
Mathematica,
726561 bajtówDo 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: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 jestComplement
, ale ostatecznie jest to dłuższe, przy użyciu jednej z następujących opcji:(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:Gdzie przechowujemy produkty spółgłoski i samogłoski odpowiednio w
a
ib
. 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
jako argument do
Tuples
, a te rzeczy wciąż są produktami, a nie listami. Zwykle najkrótszym sposobem na naprawę jest umieszczenieList@@@
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(Tak, dla nieokreślonego
f
.) Otrzymasz:Tak jakbyś użył
List
zamiastf
. Możemy więc przekazać te produkty bezpośrednioTuples
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.źródło
Tuples
sztuczki. To całkowicie nieudokumentowane, prawda? I nieoczekiwane, biorąc pod uwagę, jak forma dwuwejściowaTuples[list,n]
radzi sobie zlist
brakiemList
głowy (przynajmniej dla mnie)!List
. Początek na każdym poziomie w generowanych tablicachTuples
będzie taki sam jak nagłówek listy .Tuples[f[{1,2}, {3,4}]]
daje{f[1, 3], f[1, 4], f[2, 3], f[2, 4]}
zamiast tego. Nie jest udokumentowane, że wewnętrzna głowa jest całkowicie ignorowana.Perl, 47 bajtów
Licząc shebang jako jeden.
Wypróbuj online!
źródło
say
?-M5.01
powinno to być „wolne”.-M5.010
. I ciekawych udział w golfa nie jest zastąpienieprint
zsay
...-E
(i późniejsay
) gratis?Python 3 - 110 bajtów
Prosta zabawa w zapętlanie :)
źródło
Ruby,
72 7152 bajtówDzięki Value Ink za podstawowy pomysł, który sprowadził to do 60 bajtów.
źródło
grep
. Jeśli wygenerujesz zakres, który używa ciągów małych liter, otrzymasz sekwencję tylko słów małych.puts ("babab".."zyzyz").grep /#{["[^aeiouy]"]*3*"[aeiouy]"}/
dla 60 bajtów05AB1E ,
1816 bajtów05AB1E wykorzystuje kodowanie CP-1252 .
Wyjaśnienie
Do celów testowych zalecam zastąpienie
žP
kilkoma spółgłosek ižO
kilkoma samogłoskami.Przykład z użyciem 5 spółgłosek i 3 samogłosek
źródło
Python 2 ,
12010294 bajtyWypróbuj online!
źródło
Pure Bash, 74
Prosta ekspansja nawiasów klamrowych.
Wypróbuj online .
Jeśli każdy element musi znajdować się w osobnej linii, mamy:
Pure Bash, 84
źródło
PHP,
88868480 bajtówładny przyrost łańcucha :)
6 bajtów zapisanych przez @Christoph
zapętla wszystkie ciągi od
bababa
dozyzyz
i sprawdza, czy pasują do wzorca. Uruchom z-nr
.źródło
$a="001";$a++;
pewnego dnia osadzili ukrytą obsadę na liczbę całkowitą . To była bardzo niewygodna zmiana.for($s=$v=aeiouy;++$s<zyzza;)preg_match("#[^$v][$v][^$v][$v][^$v]#",$s)&&print"$s\n";
oszczędza 1 znak. Niestety musisz zmienić echo, aby wydrukować, aby użyć&&
. Zastąpienie\n
prawdziwym podziałem linii ratuje kolejne."#([^$v][$v]){2}[^$v]#"
ale nie przetestowałem tego.([^$v][$v]){2}[^$v]
nie działa w pętli, podczas gdy[^$v]([$v][^$v]){2}
działa. Oba działają jednak samodzielnie (nawet ze zmienną).MATL , 21 bajtów
Wypróbuj online! (ale dane wyjściowe są obcięte).
źródło
11Y2'y'h2Y2yX~yyy&Z*
( Wypróbuj online! )vcvcv
wzór, niecvcvc
zgodnie z wymaganiami. W każdym razie dzięki!Python, 92 bajty
Nie mogę się
itertools
wygrać. Iteratywny jest o 1 bajt dłużej w Pythonie 2.źródło
Haskell,
5451 bajtówmapM func list
buduje wszystkie słowa, biorąc możliwe znaki dla indeksu i z listy zwróconej przezfunc (list!!i)
.Edycja: @xnor znalazł 2 bajty do zapisania i patrząc na swoje rozwiązanie, znalazłem inny.
źródło
mapM id$take 5$cycle["bcdfghjklmnpqrstvwxz","aeiouy"]
zapisuje bajt.mapM(cycle["bcdfghjklmnpqrstvwxz","aeiouy"]!!)[0..4]
lubmapM(["bcdfghjklmnpqrstvwxz","aeiouy"]!!)[0,1,0,1,0]
. Byłoby miło nie kodować samogłosek i spółgłosek, alemapM(\n->[x|x<-['a'..'z'],elem x"aeiou"==odd n])[0..4]
nie do końca to robi.cycle
pierwszego wariantu jawną rekurencją oszczędza dodatkowy bajt.Brachylog , 18 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
g
ib
, ale testując to, to dlatego,j
że wydaje się, że odmawia przyjęcia listy ciągów jako danych wejściowych?:ea
naprawdę pokazuje mocne strony Prolog / Brachylog i jest krokiem, który dla większości innych języków jest znacznie trudniejszy.g
ib
były potrzebne.j
wydaje się być błędny, a to po raz kolejny wynika z trudności w odróżnieniu listy argumentów od samej listy. Mogę to naprawić, ale to jeszcze bardziej skomplikuje implementację. Równie dobrze mogę po prostu tego nie naprawić i poświęcić swój czas na naprawienie podstawowego problemu w nowej wersji Brachylog.JavaScript (ES6),
9190 bajtówEdycje
for
instrukcjiWyjaśnienie
Definiuje to 5-głęboką funkcję rekurencyjną, która wykorzystuje parzystość głębokości wywołania, aby określić, czy iterować samogłoski czy spółgłosek. Przy każdej iteracji sprawdza, czy należy powtórzyć lub drukować, sprawdzając liczbę pozostałych rekurencji, i konkatenuje literę bieżącej iteracji do końca ciągu 5 znaków, który jest obecnie budowany jako głębia pierwsza.
Alternatywne 89-bajtowe rozwiązanie przy założeniu kodowania ISO8859-1:
Alternatywne rozwiązanie 96-bajtowe, które zwraca całe dane wyjściowe jako pojedynczy ciąg:
Działaj na własne ryzyko. W przypadku rozwiązania 91-bajtowego wystarczy użyć,
f()
a w przypadku alternatywy 97-bajtowej użyćconsole.log(f())
.źródło
f=(s='',i=2)=>(for(c of(i%2?'aeiouy':'bcdfghjklmnpqrstvwxz'))for(q of i?f(s+c,i-1):[s+c])q)
Korzystanie ze standardowego formularza jest niestety dłuższym bajtem:function*f(s='',i=2){for(c of(i%2?'aeiouy':'bcdfghjklmnpqrstvwxz'))yield*i?f(s+c,i-1):[s+c]}
Wciąż czekam na dzień, w którym generator jest najkrótszą opcją ...for...of
zestawieniu, aby zapisać bajtC,
201199186184183169163 bajtówRobi to nieco inaczej niż w poprzedniej podstawowej metodzie liczenia:
Nie golfowany:
I napisane w nieco bardziej konwencjonalny sposób:
Zasadniczo, i są licznikami, a s tablicą ciągów znaków zawierających wszystkie znaki, nad którymi powinniśmy iterować, dla każdego licznika. Trick jest wewnętrzną , a pętla: jest używany do zwiększania liczników, od na prawo. Jeśli zobaczymy, że następnym znakiem, który powinniśmy wyświetlić, jest kończący się znak zerowy, restartujemy licznik do zera, a „przeniesienie” zostanie propagowane do następnego licznika.
Dzięki Cristoph!
źródło
char *c
Myślę, że przestrzeń jest niepotrzebna.f(){char*c="bcdfghjklmnpqrstvwxz",*v="aeiouy",i[]={0,0,0,0,0},*s[]={c,v,c,v,c},j=0;while(j>=0){for(j=0;j<5;++j)putchar(s[j][i[j]]);for(;--j>=0&&!s[j][++i[j]];)i[j]=0;puts("");}}
prowadzi do 177. Chodź, możesz zrobić jeszcze lepiej;).i[5]={0}
zamiasti[]={0,0,0,0,0}
oszczędza 7 bajtów.Perl, 71 bajtów
Wypróbuj online!
Wyjaśnienie
Dodam więcej wyjaśnień później.
map{push@{1+/[aeiouy]/},$_}a..z;
tworzy dwie tablice:@1
zawiera spółgłosek i@2
samogłosek.glob
kiedy wywołanie z argumentami takimi jak{a,b}{c,d}
zwraca wszystkie permutacje elementów w nawiasach klamrowych.źródło
Befunge, 95 bajtów
Wypróbuj online! , chociaż należy pamiętać, że dane wyjściowe zostaną obcięte.
Jest to po prostu pętla z zakresu od 0 do 287999, generująca indeks w postaci mieszanej liczby 20-6-20-6-20, z „cyframi” liczby pobranej z tabel w dwóch ostatnich wierszach.
źródło
Perl 6 , 70 bajtów
Wyjaśnienie interesującej części:
Wcześniejszy kod po prostu generuje listę samogłosek (
$_
) i listę spółgłosek (c
), co jest niestety pełne.źródło
Python 2 ,
120117 bajtówDzięki @WheatWizard za poradę dotyczącą zakładek.
Wypróbuj online!
Nie jestem pewien, czy można dużo golfa. Wypróbuj online obcina przy 128 KB, ale pokazuje wystarczająco dużo, aby dać pomysł. Lokalne uruchomienie z kodem debugowania do zliczenia słów dało w sumie 288000. Uruchamia się w około 45 sekund, jeśli ktoś chce przetestować.
Wersja niezgodna, a zatem niekonkurująca (drukuje tablice zagnieżdżone zamiast określonego formatu) dla 110 bajtów:
źródło
Perl 6, 53 bajtów
Zajmuje trochę czasu, aby mieć jakąkolwiek wydajność. Bardzo nieefektywne. Wykonuje pracę.
źródło
xeger , 49 bajtów
Biorąc pod uwagę wyrażenie regularne, xeger po prostu generuje wszystkie pasujące ciągi. Aby nie zabić przeglądarki, zatrzymuje się co 1000 wyników i musisz kliknąć, aby kontynuować, ale w końcu się tam dostanie.
Oto 23-bajtowa wersja z
^
naprawionym błędem :Są to klasy znaków „wszystkie spółgłoski ASCII pisane małymi literami”
[:c]
zy
wyłączeniem^y
, i „wszystkie samogłoski ASCII pisane małymi literami”[:v:]
zy
dodanym.źródło
&
.[bcdfghj-np-tvwxz]
.JavaScript (Firefox 30-57), 82 bajty
Zwraca tablicę ciągów. Bardzo szybka wersja dla
102101 (1 bajt dzięki @ETHproductions) bajtów:źródło
CJam ,
32312928 bajtówZaoszczędzono 2 bajty dzięki Martinowi Enderowi i 1 bajt dzięki Kaine'owi
Wypróbuj online! (Zauważ, że wyjście zostaje odcięte w TIO)
Wyjaśnienie
źródło
'{,97>
zdobyć alfabet. A następnie"aeiouy"_'{,97>^
zapisać na kolejny bajt1$
.Ułożone, niekonkurencyjne, 51 bajtów
Dość proste. Wypróbuj tutaj!
źródło
Perl,
635954 bajtówDla odmiany wypróbowanie golfa Perla.
EDYCJA: Wygląda na to , że muszę się jeszcze wiele nauczyć ... :)
źródło
/$b[^$a]/&&say for"a"x5.."z"x5
aby zaoszczędzić kilka bajtów. Edycja: i możesz upuścić$b
i zrobić$a="aeiouy";/([^$a][$a]){2}[^$a]/&&say for"a"x5.."z"x5
.aeiouy
. Ponadto, ponieważ wyrażenie regularne sprawdza 5 znaków, możesz to zrobića.."z"x5
.$a
i$b
jako nazwy zmiennych, ponieważ nie trzeba ich deklarować nawet w trybie ścisłym ... :) W dzisiejszych czasach często używam Perla 6, który nawet nie ma trybu nie ścisłego.Scala,
8786 bajtówźródło
f"$c$d$e$f$g"
z""+c+d+e+f+g
zapisać bajt.R,
143132 bajtyTo moja pierwsza gra w golfa Code, więc chętnie przyjmę wszelkie sugestie, aby ją jeszcze bardziej pogłębić. Jak dotąd wszystko jest dość standardowe R; jedyną możliwą trudną rzeczą jest to, że paste0 przetwarza swoje argumenty na długość najdłuższego.
Edycja: używana sztuczka przypisania z rturnbull, zastąpiona
sapply(x,length)
przezlengths
.źródło
R,
11198 bajtówDodane
y
jako samogłoska i odgrane 13 bajtów dzięki @Patrick B.Używamy
expand.grid
do generowania wszystkich możliwych kombinacjiV
iwC
macierzy, które definiujemy ze wstępnie ustawionej zmiennejletters
(alfabetu). Odwracamy kombinacje (domyślnie pierwsza zmienna obraca się najszybciej), aby zapewnić kolejność alfabetyczną. Następnie iterujemy każdy rząd matrycy, drukując każdą literę na standardowe wyjście. Używamy tegofill
argumentu, abycat
upewnić się, że każde słowo zaczyna się od nowej linii.źródło
Clojure, 101 bajtów
Nie takie ekscytujące ...
źródło
Rubin,
6561 bajtówZupełnie inne podejście:
Nowe rzeczy, których się dziś nauczyłem: funkcja produktu Array #
źródło
C 361 bajtów
Wersja bez golfa:
Musi być jakiś sposób, aby to zdecydowanie skrócić.
Wyjaśnienie
źródło