To bardzo proste: Twój program lub funkcja powinna wygenerować następujący tekst:
Elizabeth obnoxiously quoted (just too rowdy for my peace): "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG," giving me a look.
Drobnym drukiem
Możesz napisać program lub funkcję , która zwraca dane wyjściowe jako ciąg znaków lub wypisuje je do STDOUT (lub najbliższej alternatywy). Opcjonalnie możesz dołączyć jeden końcowy znak nowej linii do wyniku.
Punktacja
Liczba bajtów w kodzie pomnożona przez liczbę unikalnych bajtów w kodzie
Najniższy wynik wygrywa.
Na przykład uderzenie mózgu lub odpowiedź na spację miałaby tutaj ogromną przewagę, ponieważ mnożnik byłby bardzo niski (odpowiednio 8 i 3). Generalnie jednak pisanie programów w tych językach tworzy znacznie dłuższy kod, co może zneutralizować tę zaletę.
Standardowe luki, które nie są już śmieszne, są zakazane .
code-challenge
string
kolmogorov-complexity
durron597
źródło
źródło
bytecount~Log(X,unique)
, przy X pewnej stałej dla tego problemu. W ten sposób unikalna ^ bytecount ~ stała. Obliczenie tego wyniku (log2) dajepython2_mbomb007 728, python2_carpetpython 744, ruby 756, Fish 825, Insomnia 1148, cjam 1277, whitespace 1484, brainfuck 3546
. Tak więc, z wyjątkiem odpowiedzi naOdpowiedzi:
Bezsenność , 575 bajtów * 4 = 2300
Wykorzystuje 4 znaki
dye=
.Rozwiązanie 1b (niepublikowane): 783 bajtów * 3 = 2349
Używa tylko 3 znaków
ey=
.Rozwiązanie 1: 826 bajtów * 3 = 2478
Używa tylko 3 znaki:
yo~
. Do wygenerowania tego służy program.Obecnie wszystkie programy używają tylko instrukcji 0, 1, 2, 6. Innymi słowy, manipulują bitami w jednym bajcie i wypisują wynik.
źródło
CJam,
266281456 bajtów *14127 unikatowych =372433723192Wypróbuj online.
Wyjaśnienie
Strategia, którą zastosowałem, polega na traktowaniu każdego znaku w łańcuchu jako cyfry podstawowej 123 i kodowania go jako liczby dziesiętnej w programie. Następnie program konwertuje tę liczbę z powrotem na bazę 123 i odwzorowuje każdą cyfrę 123 z powrotem na znak. Ponieważ trudno jest wyjaśnić, dlaczego program jest w obecnym stanie, wyjaśnię każdą jego wersję.
Oto jak wyglądał koniec programu w pierwszej wersji:
To wdraża strategię w najprostszy możliwy sposób. Liczba normalnie zakodowana w bazie 10 jest konwertowana z powrotem na bazę 123, a każda cyfra z bazy 123 jest odwzorowywana z powrotem na znak. Ale wykorzystuje 4 unikalne znaki niecyfrowe, a możliwość pozbycia się któregokolwiek z nich byłaby prawdopodobnie warta trafionego rozmiaru ze względu na konieczność użycia mniej prostego kodu.
Po pierwsze, zdałem sobie sprawę, że mogę pozbyć się
b
a:
operatorami, tworząc je w czasie wykonywania jako ich wartości ASCII przekształcany z powrotem do postaci (z już obecnegoc
operatora) i ocenę ich z~
operatorem. Wykonanie tego z:
operatorem okazało się nieco trudne , ponieważ musi zostać przeanalizowane razem z następującymc
operatorem. Rozwiązałem to, tworząc znaki,:
ac
następnie tworząc i oceniając znak+
, który łączy poprzednie dwa znaki w łańcuch,:c
który można następnie poprawnie ocenić.Po drugie, zdałem sobie sprawę, że
~
operator, który właśnie wprowadziłem, miał przydatny nowy, przeciążony wariant: po podaniu liczby tworzy bitowe uzupełnienie. Używając tego dwa razy z rzędu po numerze, mogłem wprowadzić przerwanie tokena w źródle bez żadnego wynikowego efektu obliczeniowego, pozwalając mi zastąpić spacje używane do oddzielania liczb~~
.Ostateczny wynik to 15 bajtów kodu na końcu, ale koszt ten znacznie przewyższa korzyść polegająca na wyeliminowaniu 2 unikalnych znaków z 14. Oto porównanie końca pierwszej wersji z końcem drugiej wersji:
Używanie mniej niż dwóch operatorów, których używałem, byłoby niemożliwe, ale nadal chciałem mniej unikalnych postaci. Kolejnym krokiem było wyeliminowanie cyfr. Zmieniając kodowanie liczby, tak aby każda cyfra dziesiętna była naprawdę cyfrą podstawową 5, mogłabym potencjalnie wyeliminować cyfry 6-9. Przed wyeliminowaniem czegokolwiek z końca prgoramu wyglądało to tak:
Jak wspomniano wcześniej, eliminacja przestrzeni jest łatwa. Ale
b
,:
ic
nie będzie tak łatwe, jak ich kody znaków są98
,58
i99
, odpowiednio. Wszystkie zawierały cyfry oznaczone do eliminacji, więc musiałem znaleźć sposób, aby je wszystkie wyprowadzić. Jedynymi przydatnymi operatorami numerycznymi o wartościach znaków niezawierających 5-9 były: zmniejszanie, zwiększanie, mnożenie i dodawanie.Ponieważ
98
początkowo użyłem100~~40c~40c~
, który zmniejsza100
dwukrotnie. Ale potem zdałem sobie sprawę, że mogę jeszcze raz użyć~
operatora, ponieważ bitowe uzupełnienie pozwala mi uzyskać liczby ujemne, które po dodaniu pozwalają emulować odejmowanie. Więc następnie wykorzystane100~~1~43c~
, który dodaje,100
i-2
a wynosi 2 bajty mniejsze. Dla58
użyłem44~~14~~43c~
, która dodaje44
i14
. I dla99
, użyłem100~~40c~
, które dekrety100
.Ostateczny wynik jest dość duży i zaciemniony, ale koszt znacznie większej liczby i kodu przetwarzania nieznacznie przewyższył dużą korzyść polegającą na wyeliminowaniu 5 unikatowych znaków z 12. Oto porównanie końcowego końca programu przed eliminacjami i po eliminacje:
źródło
98
,58
, i99
) są wciąż poza zasięgiem. Zwiększenie bazy tylko zmniejsza całkowity rozmiar programu o 8-10%, co nie wystarcza, aby zrekompensować wynik 10-15% uzyskany dzięki nowej, wyjątkowej postaci.b
Podobnie ponowne włączenie operatora nie jest tego warte.floor(log_b(x)+1)
i będzie zawieraćb
różne symbole. Więc wynik jestb*floor(log_b(x)+1)
. x jest daną dużą liczbą, a jeśli spiszesz to dla b, przekonasz się, że minimum wynosi b = 3. To znaczy, długość zmniejsza się nieznacznie, gdy używasz wyższych zasad (log), ale rozmiar zestawu znaków rośnie liniowo, więc nie jest tego warte. Utworzono prosty program do białych znaków, ale otrzymuje on jedynie wynik 4134.Biała spacja,
1157937 bajtów * 3 unikalna =34712811Według popularnego (?) Żądania publikuję moje rozwiązanie białych znaków.
Aby zredukować potrzebny kod, zakodowałem cały ciąg jako jedną liczbę binarną (7 bitów na każdy bajt). Prosta pętla wydobywa znaki i drukuje je.
Kod źródłowy na filebin.ca.
UWAGA: Specyfikacje dopuszczają dowolne duże liczby całkowite , ale interpreter Haskell na oficjalnej stronie jest ograniczony do 20 bitów. Użyj na przykład tego interpretera ruby na github / hostilefork / white spaces.
Skrypt ruby do tworzenia programu białych znaków (l = WHITESPACE, t = TAB, u = NEWLINE, wszystko po // zignorowane, zapisuje do pliku
prog.h
):Na przykład program białych znaków w formie czytelnej dla człowieka. Poniżej znajduje się prosty skrypt do przekonwertowania go na rzeczywisty program do białych znaków.
Zasadniczo ciąg do wyprowadzenia jest długą liczbą całkowitą i musisz zmniejszyć jego wynik.
Tak więc szukałem języka zawierającego tylko 0/1, ale go nie znalazłem, a potem przypomniałem sobie, że jest spacja i wypróbowałem go. W białych znakach możesz bezpośrednio wprowadzać liczby binarne za pomocą zer i jedynek.
Stary kod, gorszy wynik, ale bardziej interesujący
Stary kod na bin pliku .
Skrypt ruby, którego użyłem do utworzenia programu (l = WHITESPACE, t = TAB, u = NEWLINE, wszystko po
//
zignorowaniu zapisuje do plikuprog.h
):Na przykład program białych znaków w formie czytelnej dla człowieka. Poniżej znajduje się prosty skrypt do przekonwertowania go na rzeczywisty program do białych znaków.
Sam program białych znaków jest dość prosty, ale istnieją trzy optymalizacje gry w golfa:
lul
aby sklonować stos, gdy jest zduplikowany znakltl
aby sklonować n-ty stos stosu, jeśli jest on krótszy niż bezpośrednie pchnięcie znakuProsty skrypt ruby do konwersji mojego czytelnego dla człowieka kodu białych znaków na rzeczywisty program białych znaków (odczyt pliku
prog.h
i zapis do plikuprog.ws
):źródło
Rubinowy 144 bajtów * 39 Unikalny = 5616
Czasami najprostsze jest najlepsze.
źródło
Brainfuck, 1264 bajtów * 7 unikalnych = 8848
Tak, to okropny wynik.
źródło
+.
nie jestem pewien, czy będzie mniejszy.+
i.
otrzymuję 15018 * 2 =30,036
.> <> (Ryby) - 578 bajtów * 8 unikalnych = 4624
Mój wynik nie jest tak konkurencyjny, jak się spodziewałem, ale myślałem, że to rozwiązanie jest jeszcze wystarczająco interesujące, aby opublikować.
Wyjaśnienie
Pierwsza sekcja kodu to długi ciąg cyfr 0-4, który reprezentuje 3-cyfrową reprezentację podstawy 5 dla każdego znaku w ciągu. Pozostały kod korzysta z
p
operatora w Fish, który pozwala edytować kod źródłowy programu podczas jego działania. Korzystając z tego operatora, byłem w stanie wygenerować kod Fish niezbędny do konwersji podstawowych 5 znaków z powrotem na bazę 10 i wyprowadzenie ich, a następnie umieścić ten kod z powrotem w kodzie źródłowym na początku pliku, zanim interpreter dotrze do końca linii i owinięty wokół. Gdy interpreter dojdzie do końca linii, kod został zmodyfikowany tak, aby wyglądał następująco:Gdy kod zawija się i uderza
v
operatora, przechodzi do drugiej linii, uderza>
operatora i przechodzi do pętli, za każdym razem konwertując kodowanie podstawy 5 z powrotem na wartość ascii podstawy 10, a następnie wyprowadzając tę wartość. Gdy na stosie nie będzie już więcej wartości,?
operator przejdzie do;
i program się zakończy.źródło
7 , 273 bajtów × 7 unikalnych bajtów = 1911, niekonkurencyjne (wyzwanie dla postdate)
Wypróbuj online!
Niestety jest to stare wyzwanie, co oznacza, że nie mogę wygrać jednym z moich najnowszych języków. Jednak język został stworzony bez wiedzy o wyzwaniu (po prostu przypadkowo natknąłem się na niego w „powiązanych pytaniach”), ale mimo wszystko okazało się, że idealnie pasuje.
7 programów PPCG jest zwykle przesyłanych w formacie spakowanym, pakując osiem poleceń w trzy bajty (język ma dwanaście poleceń, ale tylko osiem może pojawić się w pliku źródłowym, co oznacza, że wystarczą trzy bity). Jednak język obsługuje również format ósemkowy, w którym każde polecenie jest zapisywane jako cyfra ASCII, i tego właśnie użyłem tutaj, co oznacza, że użyto tylko siedmiu różnych bajtów (
6
polecenie nie jest konieczne w programie, który po prostu drukuje prosty ciąg).Program jest bardzo prosty; składa się z dwóch elementów stosu, długiego łańcucha, który właśnie jest drukowany dosłownie, a
7
do oddzielania elementów (niestety nieuniknionego) i403
który jest prostym sposobem drukowania stałego łańcucha w 7 (40
ucieka z drugiego elementu stosu, przenosząc go do u góry stosu, a następnie3
drukuje go i odrzuca stary pierwszy element stosu, czyli403
sam).Więc w jaki sposób otrzymałem ciąg tak krótki jak 269 bajtów? 7 obsługuje wiele formatów I / O, a jednym z nich jest US-TTY , zestaw znaków (konkretnie wariant Baudot), który był szeroko stosowany przed wynalezieniem ASCII. (The
5
na początku drugiego elementu stosu, czyli początek programu, określa kodowanie ciąg jest, reszta jest zawartość ciąg sam.) Jest to zestaw znaków pięć-bitowy, a komendy0
do5
można bezpiecznie przechowywać w ciągach, jednocześnie zachowując nieskalowanie (tak, że uniknięcie go raz dokładnie odtworzy oryginał), więc język używa par poleceń (36 opcji) do kodowania znaków US-TTY (32 opcje, z 4 używanych dla dyrektywy do samego 7 tłumacza). Oczywiście istnieje ponad 32 unikalnych znaków, które ludzie mogą chcieć wypisać (a więcej niż 32 znaki pojawiają się w ciągu), więc dwa z tych znaków to „kody przesuwne”, które przełączają się między czterema zestawami znaków (wielkie i małe , cyfry i zdefiniowane przez użytkownika „rozszerzenie figur”, które 7 używa dla pozostałych znaków ASCII, których nie ma w innych zestawach znaków, jednak wszystkie znaki w ciągu są „natywnie” w US-TTY, więc szczegóły rozszerzenie nie miało znaczenia). Tutaj'Liczę dziesięć zmian dodanych do 124 znaków wejściowych, dość nieistotny stosunek. Jako taka, możliwość użycia tylko nieco ponad dwóch bajtów danych wejściowych na znak wejściowy, razy 7 unikatowych bajtów, oznacza, że wynik w tym wyzwaniu jest niesamowicie dobry. (Wydaje mi się, że język, który został zaprojektowany specjalnie do tego wyzwania, używałby pewnego rodzaju kompresji łańcuchów, zamiast wcześniej istniejącego zestawu znaków, ale mimo że Baudot i US-TTY nie zostały zaprojektowane do gry w golfa, nadal są dość zwięzłe .)
źródło
Python 2,
163147145143 bajtów *353635 unikalny =5705529252205005To chyba tak dobre, jak to zamierzam.
Edycje:
.capitalize()
na korzyść korzystaniaE
.'
zamiast odwrotnego cudzysłowu z odwrotnym ukośnikiem.+
i niektóre spacje do użycia przecinków wprint
instrukcji.źródło
Python 2,
14508 11700 11088 10164 9486 9746 7860145 bajtów * 36 unikalny = 5220Widziałem tytuł i pomyślałem, że jest to interesujące wyzwanie dla dość nieporadnego Pythona. To są moje notatki, gdy rozwiązałem ten problem.
Moja pierwsza próba zredukowała unikalność do 31:
Myślałem, że dam radę lepiej. Używając
map
, unikalność spadła do 26:Mniej więcej w tym czasie zauważyłem w tekście pytania, że wynik był
uniques * bytes
nie tylko wyjątkowy! Oznaczało to, że moje wyniki dla powyższych wyniosły 14508 i 11700. Niezbyt konkurencyjne. Teraz zmniejszam bajty, przechowując tekst jako ciąg szesnastkowy:Rozmiar został zmniejszony, ale bardziej unikalne znaki. Ale jeśli użyłem spakowanego dwucyfrowego ciągu dziesiętnego z przesunięciem 32:
Ma taką samą liczbę bajtów, ale zapisuje 3 unikalne.
Wykluwam nowy plan. Jeśli spakuję długą liczbę całkowitą Pythona z 7-bitowymi znakami, mogę wyodrębnić każdą z nich, przesuwając:
Cóż, to obniżyło wynik do 9486. Ciekawy eksperyment, ale nigdzie nie wystarczająco dobry. Co teraz, jeśli pozbędę się nazw funkcji i polegam na formatowaniu ciągów?
Mam teraz tylko 22 unikaty, ale wynik nie poprawia się.
Ok, co jeśli wybrałbym oczywisty sposób i po prostu wydrukowałem napis:
Wynik 7860. Powinienem był to zrobić pierwszy. Ale nie nauczyłbym się tak wiele.
Myślę, że mógłbym zmniejszyć liczbę uników o 26, jeśli dynamicznie produkowałem duże litery, więc:
Myślę, że Python nie będzie lepszy niż 5220. Zadanie minimalizacji unikalnych znaków w Pythonie z pewnością było pouczające.
Aktualizacja: mbomb007 ma lepsze rozwiązanie Python z wynikiem 5005. Dobra robota.
źródło
> <> (Ryby) - 138 bajtów * 65 Unikalne = 8970
Prosta trasa, tj. Hello World:
Cóż, dla mojego pierwszego wypadu do> <> było to wyzwanie. Myślę, że widzę pewne ulepszenia, ale nauka była fajna :)
Lub zbyt skomplikowane - 1567 bajtów * 27 Unikalne = 42309
źródło
r
stos odwracając :) Możesz także przenieść finało
do pustego miejsca na początku drugiej linii.f f + 2 + o
tyle razy w skomplikowanym?05AB1E , 380 bajtów * 11 znaków = 4180 punktów
Jest to potencjalnie niekonkurencyjne
Wypróbuj online!
Przesuwa podstawową reprezentację 5 znaków ASCII połączonych ze sobą.
Dzieli się na 3 części, konwertuje z powrotem na dziesiętne.
Konwertuje liczbę całkowitą ASCII z powrotem na znak.
Łączy się z powrotem.
źródło
Perl 6, 139 bajtów * 36 unikalny = 5004
źródło
Java 8, 141 bajtów * 64 unikalnych znaków = 9 024
141 bajtów, 64 unikalnych znaków. Podejścia inne niż zwykłe „zwróć ciąg” zwiększają liczbę bajtów bez znacznego oszczędzania na używanych znakach.
źródło
Perl 5 , 137 bajtów * 35 unikalny = 4795
Wypróbuj online!
źródło
Tcl , 345 bajtów, 345 x 13 = 4485
Wypróbuj online!
Tcl , 337 bajtów, 337 x 15 = 5055
Wypróbuj online!
Tcl , 329 bajtów, 329 x 16 = 5264
Wypróbuj online!
Tcl , 333 bajty, 333 x 16 = 5328
Wypróbuj online!
Tcl , 148 bajtów, 148 x 37 = 5476
Wypróbuj online!
Tcl , 277 bajtów, 277 x 21 = 5817
Wypróbuj online!
Tcl , 371 bajtów, 371 x 16 = 5936
Wypróbuj online!
Tcl , 401 bajtów, 401 x 16 = 6416
Wypróbuj online!
Tcl , 403 bajty, 403 x 16 = 6448
Wypróbuj online!
Tcl , 433 bajty, 433 x 15 = 6495
Wypróbuj online!
Tcl , 473 bajtów, 473 x 14 = 6622
Wypróbuj online!
Tcl , 133 bajty, 133 x 60 = 7980
Wypróbuj online!
źródło