Wyzwanie to jest luźno zainspirowane niewdrożonym esolangiem Pada .
Rozważ tablicę 8 bitów, wszystkie zainicjowane na zero. Wprowadzimy bardzo minimalistyczny zestaw instrukcji do drukowania dowolnych ciągów. Istnieją dwie instrukcje, z których obie pobierają parametr N
będący indeksem bitów:
t N
dla t oggle: Zmienia wartość bituN
.p N
dla p rint: interpretuje wszystkie 8 bitów jako bajt, zaczynając od bituN
i zawijając na końcu . Znak odpowiadający temu bajtowi jest drukowany na STDOUT.
Spójrzmy na przykład. Chcemy wydrukować :=
. Naiwnie osiągamy to w następujący sposób (indeksy bitowe oparte na 0):
t 2 [0 0 1 0 0 0 0 0]
t 3 [0 0 1 1 0 0 0 0]
t 4 [0 0 1 1 1 0 0 0]
t 6 [0 0 1 1 1 0 1 0]
p 0 [0 0 1 1 1 0 1 0] == 58 == ':'
t 5 [0 0 1 1 1 1 1 0]
t 6 [0 0 1 1 1 1 0 0]
t 7 [0 0 1 1 1 1 0 1]
p 0 [0 0 1 1 1 1 0 1] == 61 == '='
Zamiast tego możemy skorzystać z funkcji cyklicznej p
i zapisać dwie instrukcje:
t 2 [0 0 1 0 0 0 0 0]
t 3 [0 0 1 1 0 0 0 0]
t 4 [0 0 1 1 1 0 0 0]
t 6 [0 0 1 1 1 0 1 0]
p 0 [0 0 1 1 1 0 1 0] == 58 == ':'
t 1 [0 1 1 1 1 0 1 0]
p 7 [0 1 1 1 1 0 1 0] == [0 0 1 1 1 1 0 1] == 61 == '='
^
Więc p 7
po prostu zaczyna się odczytywanie wartości bajtu z ostatniego bitu zamiast pierwszego.
Wyzwanie
Biorąc pod uwagę niepusty łańcuch drukowalnych znaków ASCII (od 0x20 do 0x7E włącznie), przygotuj optymalną listę instrukcji (jeden wiersz na instrukcję), aby wydrukować ten ciąg w powyższym systemie. Jeśli istnieje wiele optymalnych rozwiązań (prawie zawsze tak będzie), wygeneruj tylko jedno z nich.
Możesz wybrać indeksowanie bitów od 0 do 1, ale podaj swój wybór.
Możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i wypisując wynik przez STDOUT (lub najbliższą alternatywę), wartość zwracaną funkcji lub parametr funkcji (wyjściowej). Jeśli nie wydrukujesz wyniku do STDOUT, nadal powinien to być pojedynczy ciąg oddzielony znakiem nowej linii.
To jest kod golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach).
Przypadki testowe
Każdy przypadek testowy to pojedynczy wiersz zawierający ciąg wejściowy, po którym następuje optymalna liczba instrukcji, a następnie jedno możliwe rozwiązanie.
Należy nie wyjściowa liczba instrukcji w rozwiązania - jest to zawarte tutaj tylko tak można sprawdzić poprawności kodu, jeśli drukuje inną listę instrukcji.
?
7 instructions
t 2
t 3
t 4
t 5
t 6
t 7
p 0
:=
7 instructions
t 2
t 3
t 4
t 6
p 0
t 1
p 7
0123456789
26 instructions
t 2
t 3
p 0
t 7
p 0
t 6
t 7
p 0
t 7
p 0
t 5
t 6
t 7
p 0
t 7
p 0
t 6
t 7
p 0
t 7
p 0
t 2
t 3
p 3
t 2
p 3
9876543210
28 instructions
t 2
t 3
t 4
t 7
p 0
t 7
p 0
t 0
t 7
p 5
t 4
p 5
t 0
t 5
p 0
t 7
p 0
t 5
t 6
t 7
p 0
t 7
p 0
t 6
t 7
p 0
t 7
p 0
Hello, World!
39 instructions
t 1
t 4
p 0
t 3
t 7
p 2
t 1
t 6
p 2
p 2
t 0
t 1
p 2
t 0
t 1
t 3
p 2
t 6
t 7
p 2
t 0
t 2
t 6
t 7
p 1
t 0
t 1
t 5
p 0
t 2
t 7
p 3
t 2
t 6
p 0
t 4
p 0
t 1
p 3
The quick brown fox jumps over the lazy dog.
150 instructions
t 1
t 3
t 5
p 0
t 1
t 2
p 1
t 1
t 3
t 7
p 0
t 1
t 5
t 7
p 0
t 1
t 3
t 7
p 0
t 5
p 0
t 3
t 4
t 5
p 0
t 4
t 6
p 0
t 4
p 0
t 1
t 4
t 6
t 7
p 0
t 1
t 6
p 0
t 3
p 0
t 0
t 5
p 4
t 0
t 7
p 0
t 1
p 1
t 3
t 5
t 6
t 7
p 0
t 1
t 5
t 6
p 0
t 4
t 7
p 0
t 1
t 2
p 3
t 5
t 6
t 7
p 2
t 1
t 2
t 6
p 0
t 0
p 7
t 0
t 7
p 5
t 3
t 4
t 6
t 7
p 0
t 6
t 7
p 0
t 1
t 3
t 6
t 7
p 0
t 1
t 4
t 5
t 6
t 7
p 0
t 4
p 4
t 6
p 0
t 1
t 6
p 4
t 5
t 6
t 7
p 0
t 1
t 3
t 5
p 0
t 1
p 1
t 1
t 3
t 7
p 0
t 1
t 5
t 7
p 0
t 1
t 4
t 5
p 0
t 1
p 3
t 3
t 7
p 1
t 1
t 5
p 0
t 1
t 3
t 4
t 7
p 0
t 1
t 5
p 0
t 4
t 6
t 7
p 0
t 4
p 0
t 1
t 4
t 7
p 0
Przypadki testowe zostały wygenerowane przy użyciu tej referencyjnej implementacji CJam .
źródło