Jest to ograniczone-source , Kołmogorowa-złożoność , code-golf wyzwaniem produkować stałą wyjście bez wejścia.
Format wyjściowy jest jednak elastyczny - może być drukowany na standardowe wyjście, drukowany na standardowy błąd, zwracany jako lista znaków, zwracany jako lista bajtów lub zwracany jako lista liczb całkowitych. Jeśli uważasz, że cokolwiek innego wydaje się uzasadnione, po prostu zapytaj w komentarzach!
Oto prosty, wielkoliterowy kodek ASCII CODEGOLF :
CCCC OOO DDDD EEEEE GGG OOO L FFFFF
C O O D D E G O O L F
C O O D D EEE G GG O O L FFF
C O O D D E G G O O L F
CCCC OOO DDDD EEEEE GGGG OOO LLLLL F
Bez znaków nowej linii (lub spacji w dowolnych wierszach) ma 256 znaków:
CCCC OOO DDDD EEEEE GGG OOO L FFFFFC O O D D E G O O L FC O O D D EEE G GG O O L FFFC O O D D E G G O O L F CCCC OOO DDDD EEEEE GGGG OOO LLLLL F
Indeksy (oparte na 0) znaków spacji są następujące:
1, 2, 3, 4, 8, 9, 10, 14, 15, 16, 17, 21, 22, 23, 24, 25, 29, 30, 31, 36, 37, 38, 42, 49, 50, 51, 52, 53, 54, 61, 65, 68, 72, 75, 82, 89, 93, 96, 103, 104, 111, 115, 118, 122, 125, 126, 127, 132, 135, 136, 139, 143, 146, 153, 154, 155, 156, 163, 167, 170, 174, 177, 184, 188, 191, 195, 198, 205, 207, 208, 209, 210, 214, 215, 216, 220, 221, 222, 223, 227, 228, 229, 230, 231, 235, 236, 237, 238, 242, 243, 244, 248, 249, 250, 251, 252, 255
Nie możesz używać żadnego z tych 97 bajtów w kodzie, ale musisz utworzyć listę (lub podobnie wyprowadzić) te bajty, w tej kolejności, a brakujące bajty zastąpiono 32 bajtem na używanej stronie kodowej (w wielu, wielu strony kodowe spacja).
Jeśli to pomaga, możesz dołączyć ładnie drukujące * znaki nowej linii (ale bez końcowych spacji na liniach).
Na przykład przy użyciu strony kodowej Jelly takie wyjście jest dopuszczalne:
¢£¤¥ ®µ½ ÇÐÑ× ßæçðı øœþ $%& * 12345
6 = A D H K R Y ] ` g
h o s v z }~¶ ⁴ ⁷⁸ ⁻ Ɓ Ƒ ƲȤɓ
ƈ ɲ ʂ ȥ Ẹ Ḳ Ṭ Ỵ Ḃ Ḟ İ Ṡ
ẆẊẎŻ ẹḥị ṇọṛṣ ẉỵẓȧḃ ḟġḣŀ ṗṙṡ ẏż«»‘ ”
... ale tak jest:
¢£¤¥ ®µ½ ÇÐÑ× ßæçðı øœþ $%& * 123456 = A D H K R Y ] ` gh o s v z }~¶ ⁴ ⁷⁸ ⁻ Ɓ Ƒ ƲȤɓƈ ɲ ʂ ȥ Ẹ Ḳ Ṭ Ỵ Ḃ Ḟ İ Ṡ ẆẊẎŻ ẹḥị ṇọṛṣ ẉỵẓȧḃ ḟġḣŀ ṗṙṡ ẏż«»‘ ”
...tak więc jest:
[32, 1, 2, 3, 4, 32, 32, 32, 8, 9, 10, 32, 32, 32, 14, 15, 16, 17, 32, 32, 32, 21, 22, 23, 24, 25, 32, 32, 32, 29, 30, 31, 32, 32, 32, 32, 36, 37, 38, 32, 32, 32, 42, 32, 32, 32, 32, 32, 32, 49, 50, 51, 52, 53, 54, 32, 32, 32, 32, 32, 32, 61, 32, 32, 32, 65, 32, 32, 68, 32, 32, 32, 72, 32, 32, 75, 32, 32, 32, 32, 32, 32, 82, 32, 32, 32, 32, 32, 32, 89, 32, 32, 32, 93, 32, 32, 96, 32, 32, 32, 32, 32, 32, 103, 104, 32, 32, 32, 32, 32, 32, 111, 32, 32, 32, 115, 32, 32, 118, 32, 32, 32, 122, 32, 32, 125, 126, 127, 32, 32, 32, 32, 132, 32, 32, 135, 136, 32, 32, 139, 32, 32, 32, 143, 32, 32, 146, 32, 32, 32, 32, 32, 32, 153, 154, 155, 156, 32, 32, 32, 32, 32, 32, 163, 32, 32, 32, 167, 32, 32, 170, 32, 32, 32, 174, 32, 32, 177, 32, 32, 32, 32, 32, 32, 184, 32, 32, 32, 188, 32, 32, 191, 32, 32, 32, 195, 32, 32, 198, 32, 32, 32, 32, 32, 32, 205, 32, 207, 208, 209, 210, 32, 32, 32, 214, 215, 216, 32, 32, 32, 220, 221, 222, 223, 32, 32, 32, 227, 228, 229, 230, 231, 32, 32, 32, 235, 236, 237, 238, 32, 32, 32, 242, 243, 244, 32, 32, 32, 248, 249, 250, 251, 252, 32, 32, 255]
(Ten ostatni jest prawidłowym wyjściem listy w dowolnym języku z dowolną stroną kodową i można również użyć dowolnego rozsądnego formatowania listy).
Oto kod Python 3, który pokazuje niedostępne bajty ASCII.
* Chociaż sam druk może nie być aż tak ładny!
źródło
$%&*123456=ADHKRY]``ghosvz}~
i nie ma nowego wiersza?array_map(function($n){return sprintf("%6b",$n);},...)
bez$
(mógłbym to zrobić) ORAZ bez}
(bez pojęcia). Tak; Chcę spakować dane!Odpowiedzi:
Python 2 ,
321203 bajtówWypróbuj online!
Wyjaśnienie:
od wewnątrz:
cfjdbljcibkeajjejiljjlcbjddlafklebajjlceljdeadficijflealkeklkljadfbbckjebclk
to liczba25731972618407747697792173390589410779249734035626759409848989703511287412985
zakodowana za pomocą dozwolonych znaków. (Nie123456
wolno)reduce(lambda x,y:x+repr('abcdefijkl'.find(y)),'cfjdbl..bclkf','')
odwzorowuje ciąg na ciąg dziesiętny:reduce(lambda x,y:x+y,'..','')
jest taki sam jak''.join('..')
(Nieo
wolno)repr('..')
zamiaststr('..')
(Nies
wolno)'abcdefijkl'.find(y)
odwzorowuje znak na cyfrę.enumerate(bin(int(...)))
konwertuje ciąg liczbowy na ciąg binarny i wylicza. To daje pary[(0,0), (1,b), (2,1), (3,1), ...]
map(lambda(i,x):(x>'0'and i-8-8-8-8)+8+8+8+8, ... )
konwertuje wyliczoną listę do końcowego wyniku.map(lambda(i,x):.. , .. )
zamiast[... for(i,x)in ...]
(Nieo]
wolno)lambda(i,x): ..
konwertuje każdą parę (indeks, wartość) na indeks lub32
.(x>'0'and i-8-8-8-8)+8+8+8+8
jest taki sam jak:x>'0'and i or 8+8+8+8
, (Nieo
wolno)[8+8+8+8,i][x>'0']
lub[8<<9-7,i][x>'0']
(Nie]
wolno)8+8+8+8
=32
(Nie23
wolno)Oznacza to, że program jest zasadniczo taki sam jak:
źródło
C (gcc) , 318 bajtów
Wypróbuj online!
To jest trochę podróż ...
1. Kompresowanie listy
Jakoś będziemy musieli sprawdzić, czy dana liczba całkowita jest jednym ze specjalnych punktów kodowych. Każda „naga” lista będzie zdecydowanie za długa, dlatego używamy listy kontrolnej. Ta lista ma niezerową wartość w punktach kodowych, które są „ograniczone” i zerową w tych, które nie są.
Niestety nadal zajmuje to 512 bajtów, aby mieć listę (wygląda na to
0,0,7,7,0,7,0,...
). Można to skrócić za pomocą maski bitowej.Aby skorzystać z maski bitowej, podzielimy każdy bajt na dwie części. Pierwsze 3 bity wybiorą maskę z tablicy, a ostatnie 5 bitów wybierze bit z tablicy. Nie możemy dalej zmniejszać tablicy, ponieważ 32-bitowe liczby całkowite używane domyślnie nie obsługują więcej niż 2 ^ 5 = 32 bity.
Korzystając z referencyjnej implementacji napisałem:
Byłem w stanie wygenerować odpowiednie wartości dla tej nowej tablicy za pomocą polecenia
echo "obase=16;ibase=2;$(./a.out | rev)" | bc
. To przekazuje wyjście powyższego programu (./a.out
) dorev
programu, który odwraca każdą linię. Drukuje to wraz z nagłówkiem do bc, który ustawia bazę wyjściową na 16, a bazę wejściową na 2. W ten sposób bc konwertuje cyfry binarne na szesnastkową maskę bitową.Powstałą tablicę można zobaczyć w tym rozwiązaniu „beta”:
2. Radzenie sobie z ograniczeniami
Istnieje wiele ograniczeń, które należy nałożyć na powyższy kod. Tutaj przeglądam każdy z nich 1 na 1.
Jest to odczuwalne również w innych językach, bez przypisania w C bardzo trudno jest uzyskać gwarantowane wartości w zmiennych. Najłatwiejszym sposobem jest napisanie naszej funkcji jako pełnego programu. Pierwszy argument
main
zostanie przekazany, którego wartośćargc
wyniesie 1, jeśli zostanie wywołany bez argumentów.Jedyne przelotowe konstrukcje w C są
for
,while
igoto
z których wszystkie zawierają zastrzeżonych znaków. To pozostawia nam korzystanie z rekurencji. Główna funkcja rozpocznie się od 1 i będzie powtarzać się, dopóki argument nie będzie> 256, tymczasem zmniejszy wewnętrznie argument, aby użyć wartości o indeksie 0.Wartości w powyższej tablicy są szesnastkowe, nawet jeśli są konwertowane na dziesiętne, zawierają pewne ograniczone symbole, w szczególności 123456 (AD może być pisane małymi literami). Aby obejść ten problem, każda stała jest XORowana z inną, tak że usuwane są ograniczone znaki. 1 staje się 9 ^ B, 2 staje się C ^ E, 3 staje się B ^ 8, 4 staje się 8 ^ C, 5 staje się 9 ^ C, a 6 staje się 9 ^ F (jest więcej sposobów na zrobienie tego, wybrałem w ten sposób) .
Ograniczenia nie pozostawiają nam wielu funkcji drukowania.
putchar
iputs
oba są ograniczone, odchodzącprintf
. Niestety musimy wysłaćprintf
ciąg formatu, najlepiej „% c”. Wszystkie takie ciągi mają ten brzydki znak procentu, który chcemy usunąć. Na szczęście zakładamy maszynę typu endian (ponieważ najwyraźniej tego używa TIO i to dość typowe). Konstruując liczbę całkowitą, której bajty w pamięci to 0x25 (%), 0x63 (c), 0x00 (\ 0), cokolwiek (nie ma znaczenia, jest to po terminatorze zerowym) możemy po prostu przekazać jego adresprintf
i to założy jest ciągiem. Jednym z takich numerów, który działa, jest -989830363 (0xC5006325). Można to łatwo utworzyć pod ograniczeniami 77707-989908070.Nadal istnieje problem polegający na tym, że nie możemy odwoływać się do żadnych wartości (ponieważ nie możemy ich przypisać i ponieważ nie możemy użyć &), więc musimy użyć literału tablicowego (int []) {...}. Właściwie używamy tego również dla powyższej tablicy maski bitowej.
Nie możemy używać „]” lub „}” do zamykania naszych tablic lub funkcji. Na szczęście C ma działające digrafy i trygrafy.
:>
stanie się]
, a??>
stanie się}
. Wymaga to przejęcia-trigraphs
przełącznika przez gcc , ponieważ domyślnie ignoruje trygrafy (z naruszeniem standardu).Nie możemy użyć
&
do maskowania bitów z naszego indeksu, ani nie możemy użyć,%
aby dostać się tam w staromodny sposób. Dlatego polegamy na zachowaniu specyficznym dla implementacji. W szczególności przesuwamy nasze 32-bitowe liczby całkowite wystarczająco daleko w lewo, aby stracić bity, a następnie z powrotem w prawo. Na przykład, aby uzyskać ostatnie 5 bitów naszego numeru, najpierw przesuwamy go w lewo o 27 bitów (pozostawiającabcde00000...
), a następnie przesuwamy z powrotem w prawo o 27 bitów (pozostawiając...00000abcde
).Potrzebujemy jeszcze kilku dosłownych wartości w całym kodzie - są one zaczerpnięte z odpowiedzi JS Arnaulda, plus 27 (z powyższego powodu) dodałem jako
9+9+9
.3. Złóż to razem
Oto opis źródła ze wszystkimi tymi zmianami razem.
źródło
?:
rozszerzenia g ++ , nadużywaj bitowego przesunięcia modulo 32, 273 bajtów-trigraphs
opcji w niektórych kompilatorach języka C, a?:
wymaga gcc, który wymaga-trigraphs
.pieprzenie mózgu , 635 bajtów
Wypróbuj online!
W odpowiedzi na to, że w końcu zostałem pokonany przez Javascript, grałem w golfa, co mogę z tego:
Zapisano 1 bajt, mając 32 w komórce 0 i zwiększając komórkę 1 (jedynym powodem, dla którego początkowo miałem inny sposób, była szybka poprawka, gdy OrjanJohansen wskazał, że nie mogę użyć
]
)1 bajt zapisany przez zmniejszenie trzeciej komórki (początkowo w 0) w celu wygenerowania
255
=-1
2 bajty zapisane przez drukowanie spacji między znakami 31 i 36 bez użycia,
<>
ale zamiast tego po prostu zatrzymując się na 32, aby drukować z komórki 0 przy zwiększaniu z 31 do 33.pieprzenie mózgu , 639 bajtów
Wypróbuj online!
Najpierw generujemy liczbę 32. Następnie po prostu zwiększamy jedną komórkę i przełączamy drukowanie między tą komórką a tą zawierającą 32. Ciągłe zwiększanie liczb to coś, co Brainfuck robi dobrze.
Fajnie jest pokonać Javascript za pomocą Brainfuck, nie zdarza się to często!
źródło
]
nie jest dozwoloną postacią. Chociaż nadal powinieneś być w stanie to naprawić i pokonać Javascript. :)]
jest to niedozwolone, myślę, że moja odpowiedź BF jest teraz prawdopodobnie optymalna.JavaScript (SpiderMonkey) ,
1918159814871431 bajtówZaoszczędzono 56 bajtów dzięki @ user202729
Wypróbuj online!
W jaki sposób?
Fakt, że
=
nie jest dozwolony, jest zabójcą show w JS. Nie możemy wykonać żadnego przypisania zmiennej, a także nie możemy użyć żadnej funkcji strzałki.+
-
/
|
^
<<
>>
8<<98
8<<2
źródło
32
jak8<<9-7
zapisuje bajt dla każdego32
.32 = 8<<98
Haskell,
623617614594360342 bajtówEdytuj: -234 bajty dzięki @Lynn, znajdując kodowanie wzorca jako ciąg znaków. -18 bajtów dzięki @ Ørjan Johansen.
Wypróbuj online!
Jak to działa
źródło
(id:pure(\_->8+8+8+8))
przezuntil((||" XXXX XXX XXXX XXXXX XXX XXX X XXXXXX X X X X X X X X X XX X X X X XXX X XX X X X XXXX X X X X X X X X X X X XXXX XXX XXXX XXXXX XXXX XXX XXXXX X"!!i<'X').(<1))pred 1
i zapisać pęczek bajtów.filter
zamiastuntil
do gałęzi (icycle
aby uniknąć zbędnego++pure(...)
).Brain-Flak -r,
41904188 bajtówWypróbuj online!
Ten jest trochę trudny dla Brain-flak, ponieważ nie możemy użyć
]
lub}
. Oznacza to, że jedynymi przydatnymi postaciami są<>()
.Oto program Haskell, który pomógł mi to napisać
Liczy się tylko pomijanie tam, gdzie muszą być spacje, i popychanie ich indywidualnie.
źródło
{}
wyszukiwania, komputer może znaleźć optymalny w skończonym czasie.JavaScript (SpiderMonkey) ,
1001919789441 bajtówWypróbuj online!
Wreszcie bije BF !!!
Główny pomysł
Konwertuj każdy znak długiego łańcucha na indeks lub 32, zależnie od wartości.
Array.prototype.map
? Jak zdobyć tablicęBrutalna siła, aby zobaczyć, które obiekty są dostępne poprzez dostęp do właściwości obiektu (ponieważ
]
jest to niedozwolone, więc dostępne są tylko właściwości o nazwie pasującej do identyfikatora).RegExp.prototype.exec
zwraca obiekt podobny do tablicy, gdy występuje dopasowanie. Jeśli nie podano żadnego argumentu, domyślnie jest to argumentundefined
, więc/u/.exec()
dopasowuje i zwraca tablicę.Uzyskaj 2 dowolne odrębne wartości dla 2 różnych znaków
Chcemy mieć
(x,y)=>x=='0'?32:y
, ale nie możemy użyć=
.Zamiast tego zrobimy
Możemy
map
napisać nad jakąś funkcją, ale=>
nie jest to dozwolone, więc można użyć tylko kilku funkcji. Może mieć związanethis
i niektóre powiązane argumenty (więc ma formę(x,y,z)=>pre_filled_function.call(pre,filled,args,etc,x,y,z)
)Po rozważeniu listy funkcji (
repeat exec bind create map indexOf replace fill find reduce filter findIndex call bind apply
) postanawiam, że zostaną użyte następujące funkcje (po rozważeniu wszystkich innych kombinacji)repeat
: liczba -> różne ciągi.find
: thisArg -> pierwszy element w dopasowaniu tablicowym.Ogólny pomysł byłby następujący:
gdzie
somefunction
rozważathis
argument (x
) i pierwszy argument (elem1
lubelem2
) i zwraca, czy pasuje.Ostatnia funkcja strzałki jest przepisana na
[].find.bind([elem1,elem2],somefunction)
.Dosłownie tablica
Możemy użyć regex exec, aby uzyskać tablicę
fill
o różnych wartościach. Na przykład/()/.exec()
zwraca tablicę o długości 2, a następnie możemy wypełnić ją w razie potrzeby.Który
somefunction
potrzebujemy?Potrzebujemy takiego, który zwraca wartość prawdy / fałszu zależy od
this
(która jest 1 z 2 funkcji, którą zwrócimy) i pierwszego argumentu (musi być łańcuchem lub tablicą).Użyłem do tego
indexOf
- zwraca wartość fałszowania, jeśli pierwszy argument jest przedrostkiemthis
argumentu.Reprezentują literały funkcji
źródło
TI-Basic (seria 83), 578 bajtów
TI-Basic ma swoją własną specjalną „stronę kodową” z dziwnymi opcjami projektowania, takimi jak przeniesienie znaku spacji na 0x29, aby 0x20 mógł być
randM(
poleceniem.Trudno jest wymyślić, jak uzyskać TI-Basic, aby wyświetlał odpowiedni rodzaj obiektu. Łańcuchy nie działałyby z wielu powodów: nie ma sposobu na odwołanie się do tokena bez użycia tokena, a także nie wolno nam tej
"
postaci. Nie możemy po prostu napisać listy, ponieważ{
i}
są zabronione. Dozwolone są znaki[
i]
dla macierzy, ale macierz 1 na 256 nie działa, ponieważ macierze są dozwolone maksymalnie 99 wierszy i kolumn. Nie możemy użyć→
do przypisania do zmiennych, i nie możemy dostać się do zmiennych listyʟ
aniL₁
wL₆
żaden sposób.Tutaj zapisujemy skomplikowaną logiczną formułę z nierównościami, która mówi, że znak jest jednym z tych, które chcemy wyprowadzić. Następnie używamy
seq(
polecenia, aby wygenerować listę z1
tymi pozycjami i0
gdzie indziej. Stamtąd kolejneseq(
polecenie i trochę arytmetyki kończy zadanie.To była ekscytująca część; reszta gra w golfa w stałe i prawdopodobnie nie zrobiłem tego tak dużo, jak to możliwe. Jedną z sztuczek, których używam, jest to, że domyślnie
Xmax
jest to 10,XFact
to 4 iΔTbl
to 1.źródło
(
jest to zabronione.[A](I,J)
, co rozumiem, chcesz zrobić coś takiego, jak[A](int(I/99),I-99int(I/99))
odczytanie wszystkich elementów macierzy[A]
- nie możemy tego zrobić. (Nawiasem mówiąc,)
jest również zabronione. Na szczęście nie musimy zamykać nawiasów końcowych, ale ogranicza to sposób, w jaki możemy używać wielu poleceń.)Brain-Flak -r, 3894 bajtów
Wypróbuj online!
Napisałem program do generowania optymalnego programu Brain-Flak dla każdego wyjścia. Zakładać, że:
<>
nie jest używany, to rozwiązanie jest optymalne.
źródło
Python 2 ,
162157 bajtówOstrzeżenie : Przedmioty niedrukowalne przed nami!
Wypróbuj online!
Na podstawie istniejącej odpowiedzi TFeld , ale z kilkoma zmianami:
0xe0/7
zamiast8+8+8+8
do reprezentowania 32. ( program do znalezienia najkrótszej reprezentacji liczby )bytearray
aby przedstawić ogromny literał.A
bytearray
jest podobny dostr
tego, że jest iterowalny, jednak iteracja daje liczby całkowite, a nie znaki. Możemy go użyć do zakodowania literału base-N ireduce(lambda x,y: x*N+y, my_bytearray)
odkodowania go.Ponieważ pliki Pythona 2 nie mają domyślnie kodowania, można używać tylko znaków w ASCII (0..127). Bajt zerowy, znaki nowej linii, ukośniki odwrotne i cytaty zajmują jeszcze 1 bajt.
Ponadto nie można używać wszystkich baz.
Napisałem program, aby znaleźć najkrótszą reprezentację
n
, biorąc pod uwagę te ograniczenia.źródło