Wyzwanie:
Drukuj każde 2-literowe słowo dopuszczalne w języku Scrabble, używając jak najmniej bajtów. Utworzyłem tutaj listę plików tekstowych . Zobacz także poniżej. Jest 101 słów. Żadne słowo nie zaczyna się od C lub V. Kreatywne, nawet jeśli nieoptymalne rozwiązania są zachęcane.
AA
AB
AD
...
ZA
Zasady:
- Wyprowadzane słowa należy jakoś rozdzielić.
- Sprawa nie ma znaczenia, ale powinna być spójna.
- Końcowe spacje i znaki nowej linii są dozwolone. Żadne inne znaki nie powinny być wyprowadzane.
- Program nie powinien pobierać żadnych danych wejściowych. Nie można używać zasobów zewnętrznych (słowników).
- Brak standardowych luk.
Lista słów:
AA AB AD AE AG AH AI AL AM AN AR AS AT AW AX AY
BA BE BI BO BY
DE DO
ED EF EH EL EM EN ER ES ET EX
FA FE
GO
HA HE HI HM HO
ID IF IN IS IT
JO
KA KI
LA LI LO
MA ME MI MM MO MU MY
NA NE NO NU
OD OE OF OH OI OM ON OP OR OS OW OX OY
PA PE PI
QI
RE
SH SI SO
TA TI TO
UH UM UN UP US UT
WE WO
XI XU
YA YE YO
ZA
Odpowiedzi:
Python 3,
194188 bajtówZdecydowanie nie jest to najkrótsza metoda, ale pomyślałem, że to dobry początek. Spróbuj spakować każdą parę w ścieżki, nakładając się jak najwięcej (np.
"ODEX..."
=["OD", "DE", "EX", ...]
). Spacje służą do oddzielania ścieżek, a wszelkie pary ze spacją są usuwane (spacja końcowa ma zapobiegaćE
drukowaniu pojedynczej na końcu).Próbowałem też gry w golfa regularnego, ale było to dłuższe.
źródło
AYAHOYOWOMUNUHAID
!CJam,
9694 bajtówPowyżej jest zrzut heksowy, który można odwrócić za pomocą
xxd -r -c 16 -g 1
.Wypróbuj online w interpretatorze CJam .
W zależności od tego, co dokładnie liczy się jako rozdzielone , liczbę bajtów można obniżyć do 93, a nawet 92 :
Jeśli zastąpić
-55
ze59
słowa będą oddzielone przez nie miejscach łamania (0xa0).Jeśli zastąpimy
-55
zW
wyrazy zostaną rozdzielone na znaki (0x40).Pomysł
Możemy zakodować każdą parę liter xy jako (ord (x) - 65) × 25 + (ord (y) - 65) . 1
Zamiast przechowywać wynikowe liczby całkowite, będziemy przechowywać różnice wszystkich par, które odpowiadają dwóm sąsiednim słowom (posortowanym alfabetycznie).
Największa różnica wynosi 35 , więc uważamy je za cyfry liczby całkowitej 36 i przekształcamy tę liczbę całkowitą na ciąg bajtów.
Kod
1 Ponieważ druga litera nigdy nie jest literą Z , wystarczy użyć 25 zamiast 26 .
źródło
PHP
224, 218, 210206Zdecydowanie niezbyt dobry wynik, ale podobało mi się wyzwanie.
Tworzę tabelę opcji, utworzyłem system bitowy, aby oznaczyć, które opcje są prawidłowe.
Następnie I-36 zakodowałem te opcje, aby uzyskać ciąg:
Zwróć uwagę, że trzeci wpis w tej tablicy łańcuchów nie ma wartości, ponieważ C nie ma opcji.
Aby wydrukować wartości, wystarczy przekonwertować prawidłowe opcje na znaki.
Może być coś, co mogę zrobić, aby zmniejszyć rozpoznawanie, że nie ma słów kończących się na C, J, K, Q, V lub Z, ale nie mogę wymyślić metody zmniejszenia tego atm.
Po transponowaniu tabeli jest więcej pustych elementów, a dane kodują się nieco bardziej zwięźle, co zmniejszyło liczbę bajtów. Tablica jest teraz drukowana w innej kolejności:
Dzięki Ismael za wybuch i wskazówki dla pętli.
Z aktualizacją do php5.6
pow(,)
można zastąpić**
zapisując kolejne 4 bajty.źródło
","
, możesz użyćexplode(0,UB1YB0100CUP[...])
3
mogę tego użyć! Dzięki$e++;for($f=0;$f<26;$f++)
jefor($e++,$f=0;$f<26;$f++)
, a teraz możesz usunąć te nieznośne{}
. A jeśli chcesz przekonwertować znaki na małe litery, użyj$e^' '
.Perl,
167164157 bajtówNapisałem osobny skrypt, aby pogrupować litery tak zwarte, jak to możliwe, w ciąg zawierający wszystkie prawidłowe 2-literowe słowa. Następnie iteruje wszystkie dwa słowa z literami i wypisuje prawidłowe, po jednym w wierszu. Uruchom z
perl -M5.10.1 script.pl
.źródło
-M5.10.1
aby użyćsay
słowa kluczowego dodanego w tej wersji, lub dodaj treśćuse feature 'say';
skryptu.C, 155 bajtów
Wersja golfowa
Wydajność
Wersja bez golfa
51-bajtowy ciąg znaków w wersji golfowej zawiera wiele znaków poza ASCII 126, które prawie na pewno zostały zamienione w odpowiedniki Unicode. Wersja bez golfa używa zamiast tego hexa i jako stała zamiast literału. Ponadto wersja bez golfa oddziela słowa znakiem nowej linii, co ułatwia kopiowanie i wklejanie do programu Excel, porządkowanie listy i porównywanie z wymaganym.
Wyjaśnienie
Jeśli rozszerzymy definicję samogłoski o 8 liter AHMEIOUY, zauważymy, że wszystkie słowa składają się z jednej samogłoski i jednej innej litery (która może, ale nie musi być samogłoską). Dlatego też, dla wszystkich słów kończących się samogłoską, potrzebuję tabeli 26 bajtów, po jednej na każdą pierwszą literę, z poszczególnymi bitami odpowiadającymi samogłosce. Potrzebujemy podobnej tabeli dla słów zaczynających się od samogłoski, z tym wyjątkiem, że tym razem potrzebujemy tylko 25 bajtów, ponieważ nie ma słowa kończącego się na Z. Dwie tabele są ze sobą połączone, aby utworzyć końcową tabelę.
Aby uniknąć jakichkolwiek kodów ASCII w regionie 0..31, dwie najmniej wspólne „samogłoski” M i H są przypisane do 6. i 7. bitu, a kodowanie uwzględnia 1 dla niepoprawnego słowa i 0 dla prawidłowego słowa. Ponieważ nie ma spółgłoski, która łączy się zarówno z M, jak i H, można zapewnić, że co najmniej jeden z tych bitów ma wartość 1.
8-ty bit jest przypisany do A, która jest najczęstszą samogłoską, aby spróbować ograniczyć znaki spoza ASCII (wciąż jest ich dość dużo).
Stosowane tabele znajdują się poniżej. W przypadku słów zawierających 2 samogłoski pierwszą literę uznałem za „samogłoskę”, a drugą literę jako „literę”. Wyjątkiem są słowa zaczynające się na M, ponieważ pozwala to uniknąć starcia między MM a HM.
Kodowanie szesnastkowe słów zaczynających się od samogłoski
Kodowanie szesnastkowe słów kończących się samogłoską
źródło
Java,
484448407391389 bajtówMoja pierwsza próba
Sformatowany:
Wypróbuj online
źródło
\n
go tylko spacją. Nie muszą być oddzielone nowymi wierszami."".format
jest bolesne, ale przezabawne.Rubin, 166 bajtów
Pożyczanie zgrabnej metody sp3000 do kodowania słów w zwarty ciąg. Kickerem jest tutaj krótka metoda dekodowania go z powrotem na dwuliterowe słowa: użycie lookahead w wyrażeniu regularnym przekazanym do metody skanowania String w celu wyodrębnienia nakładających się dopasowań, nie zajmując miejsca:
Rubinowy, 179 bajtów
Moje własne podejście: Wygeneruj wszystkie dwuliterowe słowa pomiędzy
AA
iZA
, i wybierz poprawne, używając zakodowanej w bazie 36 maski bitowej:źródło
Matlab, 177 bajtów
Wygeneruj macierz binarną definiującą wszystkie dozwolone pary liter, przekształć ją i zakoduj w base-64. Łańcuch (64) zakodowany w standardzie base-64
'CR+ ... % '
jest używany jako dane w programie. Program odwraca operacje w celu rozpakowania macierzy, a następnie odczytuje dozwolone pary:źródło
Malbolge , 2118 bajtów
Wypróbuj online!
źródło
Bash, 179 bajtów
Wykorzystuje
sed
się do wymiany wyrażeń regularnych. Pierwsze wyrażenie regularne oparte jest na pomyśle Sp3000, podczas gdy drugie wyrażenie regularne używa wspólnego wprowadzania bez spacji.Wyjaśnienie:
źródło
`grep -o ..
w miejscu`sed -r 's/ / &/g'
, trick z moją odpowiedź poniżej.Ponieważ wszystkie słowa składają się z dwóch znaków, możemy je wszystkie zmiażdżyć, a następnie rozerwać na części za pomocą prostego wyrażenia regularnego.
Każdy język przyjazny wyrażeniom regularnym może to zrobić, niektóre bardziej efektywnie niż inne:
Grep (via Bash), 215 bajtów
JavaScript, 224 bajty
Perl, 225 bajtów
Python, 245 bajtów
Uwaga: niektóre odpowiedzi tutaj są dłuższe niż
echo
, co uważam za punkt odniesienia:Powłoka POSIX, 307 bajtów
źródło
C -
228217 bajtów - GCCZaktualizuje się, jeśli uda mi się go zmniejszyć, po prostu skompiluj z wyjściami gcc -w, ./a.out. Daj mi znać, jeśli zainteresuje Cię nie golfista.
Nie mogę wymyślić żadnego sposobu, aby skrócić go z czubka głowy (możesz technicznie usunąć cytaty w putach i nadal otrzymasz poprawną odpowiedź, wynik wygląda jak śmieci), więc daj mi znać o tak czy inaczej, aby go skrócić
źródło
_;main(){char*z="AABDEGHILMNRSTWXY AEIOY EO DFHLMNRSTX AE O AEIMO DFNST O AI AIO AEIMOUY AEOU DEFHIMNPRSWXY AEI I E HIO AIO HMNPST EOU IEO A A ";for(;_++^26;)for(;*++z^32;printf("%c%c ",_+64,*z));}
Zmieniłem separator wyjściowy z nowego wiersza na spację, ale jeśli wolisz nowy wiersz (jeden dodatkowy bajt) zmień ciąg formatu printf na"%c%c\n"
C #, 348 bajtów
Miałem okazję:
Nie golfowany:
źródło
Pyth , 140 bajtów
Wypróbuj online!
Metoda kompresji: Ponieważ nie ma
Z
drugiej pozycji żadnego słowa, użyj zmienionego alfabetu,bcdfghjklmnpqrstvwxyaeiou
aby zakodować ważność każdej z tych liter jako drugiej litery dla każdej pierwszej litery (pierwsze litery są w kolejności alfabetycznej).To 25 bitów na literę lub dokładnie 5 cyfr Base-32. Ponieważ większość spółgłosek bierze samogłoski tylko jako drugą literę, wstawiam samogłoski na końcu, aby uzyskać dla nich głównie liczby 1-cyfrowe. Jestem pewien, że ogólnie można by to ulepszyć poprzez dalszą analizę i zmianę kolejności alfabetu, chociaż wtedy definicja zmienionego alfabetu zajęłaby więcej bajtów.
Wyjaśnienie
źródło
PHP:
211209204Musisz wyłączyć ostrzeżenia, w przeciwnym razie wydrukuje się w odniesieniu do domniemanego utworzenia
$b
Bardzo zabawne. Wczesne próby były w zakresie 250, ale to moja najcieńsza jak dotąd.
źródło
!
jeśli potrzebujesz tego.CJam (99 bajtów)
Obejmuje to kilka znaków specjalnych, więc najbezpieczniej jest dać zrzut heksowy. (W szczególności postać z wartością
0xa0
odpowiadającą niełamliwej spacji sprawiła mi sporo kłopotów z konfiguracją demonstracji online).Demo online .
Podejście polega na kodowaniu różnic w bazie 26.
źródło
65f+:c
z'Af+
.md
jest genialnym poprawa, ale nie zdawał sobie sprawy, jak blisko jest moja odpowiedź na twoje.CJam,
10098 bajtów(bezpośredni link)
To mój pierwszy wpis do CJam, więc prawdopodobnie istnieje potencjał do gry w golfa. Wymyśliłem jednak sposób na skompresowanie listy znaków do 63 bajtów, co, mam nadzieję, pomoże komuś innemu.
Metoda kompresji
Jak dotąd większość metod, które widziałem, kodowała obie litery każdego słowa. Kiedy jednak umieszczamy słowa w kolejności alfabetycznej, pierwsza litera nie zmienia się bardzo często, więc jawne kodowanie wydaje się marnotrawstwem.
Koduję tylko ostatni znak każdego słowa i dołączam specjalny element za każdym razem, gdy pierwszy znak powinien zwiększać. Znaki są kodowane jako pierwszy znak, a następnie lista różnic. Ponieważ nie ma zduplikowanych słów, wszystkie różnice muszą być przynajmniej
1
. W ten sposób mogę użyć0
jako elementu separatora. (Należy pamiętać, że muszę najpierw zapisać pierwszą literę każdego podsekwencji jako jeden indeks, w przeciwnym razie powstałoby zamieszanie między „pierwszym znakiem najazdu0
” a „zacznij od A0
”).Ponieważ różnice w tym przypadku nigdy nie są większe niż 15, możemy użyć base-16 i spakować dwa (4-bitowe) elementy do każdego (8-bitowego) bajtu. (W rzeczywistym kodzie przekonwertowałem z base-260 zamiast base-256, aby uniknąć problemów ze znakami niedrukowalnymi).
źródło
G
iN
, które wypychają 16 i przesuw linii.%-3<
je/;;
lub nawet/&
. (Druga opcja spowoduje wygenerowanie komunikatu o błędzie. Konsensus w sprawie meta jest taki, że można to zrobić.)pieprzenie mózgu , 1371 bajtów
Całkiem golfowy, ale nie włożyłem w to zbyt wiele wysiłku.
Wypróbuj online!
źródło
Zsh, 175 bajtów
W tym rozwiązaniu zastosowano ciąg znaków o długości 125 znaków, w którym małe litery służą jako ograniczniki i pierwsza litera poniższej sekwencji wielkich liter.
Iterujemy literami
$L
. Jeśli bieżąca litera$X
jest porównywana małymi literami, ustaw$W
na$X
. W przeciwnym razie drukuj$W
połączony z,$X
aby utworzyć bieżące słowo.Wypróbuj online!
Edycja: dołączana,
:l
aby konsekwentnie ustawiać małe litery, zgodnie z wymaganiamiEdycja2: -4 bajty przy użyciu
$X
zmiennej i uproszczona, jeśli[[..]]
warunekEdytuj3: -4 bajty poprzez usunięcie cudzysłowów (
"
)Edycja5: -5 bajtów przy użyciu konwersji tablic zamiast iteracji
L
na niżejEdycja4: Alternatywne podejście dla 182 bajty , wykorzystujące odwracalne ciągi w pierwszych 33 literach,
$L
to tylko 107 literźródło
Stax , 91 bajtów
Uruchom i debuguj
Jedyną ciekawą sztuczką, jakiej używa ta odpowiedź, jest użycie tokena „,”, aby pokazać zmianę w pierwszej literze, zamiast zapisywania jej dla każdego słowa.
Dzięki rekursywnemu za pomysł użycia operatora m
źródło
M
zamiast1/
i użyj skróconej mapym
zamiast wyraźnego wymyślania i drukowania{ ... PF
. Ten pakuje do 89.Python 3, 224 bajty
Wykorzystuje maski bitów o zmiennej długości do kodowania, które drugie litery istnieją dla każdej możliwej pierwszej litery. Maski bitów mogą mieć długość 0,1,3,7,15 lub 31 bitów. Bity są odwzorowywane na litery za pomocą
for d in 'AOIEHMUSTMNDFPYBCGJKLQRVWXZ':
, wcześniejsze bity są używane do bardziej powszechnych liter, dzięki czemu maski bitów mogą być krótkie w większości przypadków (zwykle 3 lub 7 bitów, ponieważ po większości spółgłosek występuje tylko jedna z 5 samogłosek lub YM lub H). Niestety kod do jego dekodowania neguje oszczędności w porównaniu z prostszymi metodami (oryginalna lista ma tylko 303 bajty).źródło
Haskell, 192 bajty
Dla każdego oddzielonego spacją słowa w ciągu umieść pierwszą literę przed wszystkimi innymi literami i dodaj spację, np.
SHIO
->SH SI SO
.źródło
Java, 334 bajty
Sformatowany:
Oddzielnie zakodowałem listę słów na długość 26 x 26 = 676 BitSet, przekonwertowałem ją na tablicę bajtów, a następnie ostatecznie na Bazę 64. Ten ciąg jest zakodowany na stałe w tym programie, a do odtworzenia BitSet używana jest procedura odwrotna, i ostatecznie wydrukuj listę słów
źródło
Java, 356 bajtów
Używa generatora liczb losowych, aby uzyskać słowa:
Nie golfowany:
Możesz spróbować tutaj: http://ideone.com/Qni32q
źródło
Perl, 248 bajtów
Pierwszy raz korzystam z Perla (i po raz pierwszy w golfa), więc zdecydowanie jest miejsce na ulepszenia. Dokonano podziału samogłosek i pogrupowano pozostałe litery na podstawie tego, w jaki sposób powstało słowo wynikowe - dodając samogłoskę jako pierwszą, ostatnią lub obie samogłoski jako pierwszą i ostatnią, tworząc słowo na liście.
źródło
"MM "."MY "."BY "."HM "."SH "
można go skrócić"MM MY BY HM SH"
.JavaScript (ES6), 214
Być może nie jest to najkrótszy sposób, ale zdecydowanie interesujący.
Pętle przechodzą przez każdą literę w pierwszym ciągu, dodając ją do każdej litery w odpowiednim wierszu drugiego. Zwraca słowa w kolejności od ostatniej litery, tak jak poniżej:
Sugestie mile widziane!
źródło
Java,
255254 bajtówZnalazłem sposób na wyciśnięcie z niego jeszcze jednego bajtu.
Lub (choć niewiele wyraźniej):
źródło
'A'
na65
.Haskell,
333308298 bajtówDla żartu!
Ewaluacja
s
wydrukuje wszystkie słowa w dziwnej kolejności - wykorzystałem fakt, że większość kombinacji to samogłoska-spółgłoska lub odwrotnie, prawdopodobnie mogłaby jeszcze bardziej zoptymalizować za pomocą „klas” znaków niestandardowych, skracając zakodowaną macierz (tutajw
ik
).Czy ktoś zna krótszy sposób drukowania ciągów bez cudzysłowów i nawiasów niż mój monadyczny? O ile wiem, klasy typów są jeszcze dłuższe.
Ponadto może istnieć krótszy sposób wykonywania
p
pracy ...źródło
sequence_
to samo covoid$sequence
? Następnie możesz pominąć równieżimport
.void
musiał zostać zaimportowany. W każdym razie, muszę to zapamiętać.sequence_$map putStrLn
jestmapM_ putStrLn
. Zamień(
,)
wokół naconcat$...
inny$
.05AB1E , 143 bajty ( zakaz konkurowania)
Wypróbuj online!
źródło
PHP, 170 bajtów
najkrótsze podejście, jakie udało mi się znaleźć ...
awaria
Uwaga Najkrótsza wersja z mapowaniem bitów z drukowanym ascii kosztuje 190 bajtów (113 bajtów danych + 77 bajtów dekodowania) przy użyciu 6 bitów = podstawa 64, 174 bajtów (97 danych, 77 dekodowania) przy użyciu 7 bitów (podstawa 128); być może trochę więcej za ucieczkę.
Baza 224 (używając ascii 32..255) zajmuje 87 bajtów danych (+ ucieczka); ale myślę, że dekodowanie będzie kosztowało więcej niż 10 bajtów dodatkowych.
Wykluczenie C i V z mapy pozwoliłoby zaoszczędzić 16/14/13 bajtów na danych, ale kosztowało dużo w dekodowaniu.
źródło