Celem jest napisanie programu, który koduje inny program (wejście) z możliwie najmniejszą liczbą znaków.
Punktacja
- Wynik jest równy różnej liczbie znaków potrzebnej do wydruku.
- Niższy wynik jest lepszy.
Zasady
- Brak języków docelowych z ograniczonym zestawem poleceń. (Bez Brainf ** k, Biała spacja itp.)
Edycja : Mam na myśli co najmniej 26 znaczących znaków,A
nie zmienia sposobu działania programu brainf ** k, więc nie możesz policzyć tej postaci. To samo dotyczy białych znaków. - Język docelowy musi istnieć w momencie pisania tego pytania.
- Musisz załączyć małe wyjaśnienie, jak zarchiwizować swój wynik.
- Program wejściowy jest prawidłowy.
- Zakodowany program musi być poprawnym programem w tym samym języku, co dane wejściowe.
- Zakodowany program musi wykonać to samo zadanie, co program oryginalny.
- Twój koder musi działać dla każdego poprawnego programu w tym języku.
- Uwzględnij przykładowe dane wejściowe i wyjściowe.
Notatki
- Koder może być napisany w dowolnym języku, nie tylko w języku, na który jest kierowany.
- To nie jest gra w golfa , zachęca się do programów czytelnych.
- Wielkim celem jest sprawdzenie, ile różnych znaków potrzeba do napisania czegokolwiek w tym języku. Niedozwoliłem BF itp., Ponieważ nie byłoby żadnego wyzwania.
- Zostało to zainspirowane wydrukowaniem łańcucha w jak najmniejszej liczbie różnych znaków , możesz wziąć to jako metagolf w przypadku tego pytania.
Przykład
W Javie możesz używać \uXXXX
innych znaków. Prawidłowy wpis koduje w ten sposób każdy znak z wejścia. Miałoby to wynik 18 ( \ 0-9a-f
)
Kod w Tcl, koduje program Java:
set res {}
foreach char [split [read stdin] {}] {
append res [format \\u%04x [scan $char %c]]
}
puts $res
atomic-code-golf
generation
metagolf
Johannes Kuhn
źródło
źródło
gets
czytam tylko jednego wiersza danych wejściowych? I przegapiłeśu
koder (ale z drugiej strony nie potrzebujesz miejsca i dlatego wynik pozostaje taki sam).Odpowiedzi:
GolfScript / GolfScript, wynik 4
Sam koder jest programem GolfScript, który pobiera oryginalny kod na STDIN i przekształca go w ciąg znaków
',+~
. To samo wyjście jest poprawnym kodem GolfScript, który wykonuje te same operacje, co wersja oryginalna.Podstawowa metoda polega na kodowaniu kodu jako łańcucha (za pomocą znaków
',+
, patrz poniżej), a następnie ocenieniu tego łańcucha za pomocą polecenia eval~
.Jeśli połączy się dowolny ciąg wraz z tablicą liczb w GolfScript, liczby są konwertowane na punkty kodowe, a wynikiem jest sam ciąg znaków. Tak więc kodowanie ciągów znaków tworzy po prostu listę liczb (z punktów kodowych kodu wejściowego), a następnie konkatenuje wszystkie z pustym ciągiem znaków.
Przykład:
Kod wejściowy
jest przetłumaczony na (uwaga: wstawiono podział wiersza i dodano komentarze w celu zwiększenia czytelności)
źródło
Python -> Python, 8 różnych znaków
Używa formatowania modulo do przebudowania ciągu wejściowego. Na przykład
print 1
wyniki w tym programie:Teoretycznie możesz zakodować dowolny program taki jak ten, ale wynikowy program zawsze będzie miał więcej niż 2 n znaków, gdzie n jest liczbą znaków na wejściu, nie włączając
%
symboli.źródło
2**n+3*n-1 + 6
znaki, w tym wszystkie znaki wejściowe (jeśli założymy, że każdy znak to bajt NUL). To pochodzi z OEIS A132074 , plus 6 dlaexec''
. Jeśli przyjmujesz, że znaki muszą być drukowalne ASCII, to dolna granica jest wyższa. repl.it/EHENCJam -> CJam, wynik: 3
CJam jest nowszy od pytania, więc nie można wygrać.
Używa
')~
.')
jest postacią)
, a każdy dodatkowy)
zwiększa ją o jeden.~
może ocenić znak lub ciąg. Cały program jest oceniany po połączeniu wszystkich znaków przez ocenę+
. I dla każdego znaku oceniana jest liczba całkowita wartości znaku i operacja liczby na znak mniej niż)
.Przykłady
jest przetłumaczony na:
i
jest przetłumaczony na:
źródło
APL (wynik: 10)
Znaki użyte w kodowaniu:
⍎⎕AV[(⍴⍬)]
Program APL do kodowania musi ograniczać się do zestawu znaków APL i nie może używać żadnego dodatkowego kodu Unicode.
Kodowanie dla programu
42
(który wysyła odpowiedź na Życie, Wszechświat i Wszystko):Jak to działa:
⍬
jest pustą listą,⍬⍬⍬⍬
dlatego jest listą czterech pustych list,⍴⍬⍬⍬⍬
jest długością listy czterech pustych list, czyli czterech. Dyadic⍴
jest przekształcany, więc instrukcje długości list muszą być owinięte w nawiasach, dając ostateczne kodowanie znaku numer cztery jako(⍴⍬⍬⍬⍬)
.Liczby te są następnie sprawdzane, w
⎕AV
którym jest zestaw znaków, i⍎
wykonuje wynikowy ciąg.(Na pierwszy rzut oka wygląda na to, że wynik mógłby zostać podniesiony do 9 za pomocą
⎕UCS
zamiast⎕AV
i zapisywania[]
, ale to nie działa, ponieważ(⍴⍬)(⍴⍬)
jest to lista list skalarów, tj.[[1], [1]]
Zamiast tych,[1, 1]
które byłyby wymagane, i obejście tego wymagałoby przeplatania zakodowanych wartości przecinkami, co doprowadziłoby do powrotu wyniku do 10.)źródło
RProgN , 7 odrębnych znaków, niekonkurujące
RProgN jest nowszy niż to pytanie.
' do.Lc
Konwertuj program na
'oooo...' L c 'ooooo...' L c 'oo...' L c . . . do
, gdzie każdy „oo ...” reprezentuje kod znakowy w o, otoczony apostrofami, aby utworzyć z nich ciąg znaków. Lc następnie przekształca je w stałą liczbową. Po umieszczeniu wszystkich ciągów na stosie, łańcuch o wartości równej liczbie znaków w zakodowanym ciągu minus jeden odbudowuje zakodowany ciąg i wykonuje go.Enkoder, również napisany w RProgN.
Wypróbuj online!
źródło
Ruby -> Ruby, 8
Próba:
Implementuje rozwiązanie Ruby podane w powiązanym problemie i zastępuje we / wy eval.
źródło
05AB1E , 8 różnych bajtów (niekonkurujące)
Niekonkurencyjne, ponieważ ta wersja 05AB1E została wydana w połowie 2018 r. (A pierwsza wersja starszej wersji 05AB1E została wydana w grudniu 2015 r., Chociaż i tak ta wersja nie miała wbudowanego
žĆ
).Wypróbuj online.
Wyjaśnienie:
Spowoduje to utworzenie programu z 8 odrębnymi bajtami
žĆ0>èJ.V
w następującym formacie:Wielokrotność
žĆ0>...>è
dla każdego znaku programu, który wprowadzamy (gdzie nie>...>
ma między nimi, a maksymalnie 256>
):žĆ
: Naciśnij stronę kodową 05AB1E0
: Naciśnij a0
>
(potencjalnie żadna, maksymalnie 256), która zwiększa się o 1è
: Zindeksuj tę liczbę całkowitą do ciągu strony kodowejI potem:
J
: Połącz te indeksowane znaki na stosie razem bez separatora.V
: I oceń ten ciąg jako kod 05AB1EWypróbuj taki program dla
Aû
(Aû
będzie naciskać małe litery i palindromizować je).źródło