To wyzwanie powstało z okazji mojego pierwszego ezoterycznego języka, Backhand !
Język odręczny jest językiem jednowymiarowym z nieliniowym przepływem wskaźnika. Wskaźnik przesuwa się o trzy kroki naraz, wykonując tylko co trzecią instrukcję.
Program 1..1..+..O..@
doda 1 + 1 i wyjście 2 przed zakończeniem. Instrukcje pośrednie są pomijane, więc 1<>1()+{}O[]@
jest to dokładnie ten sam program.
Gdy wskaźnik ma zamiar zejść z końca taśmy, zamiast tego zmienia kierunek i przesuwa się w drugą stronę, podobnie jak [email protected]+.
ten sam program. Zauważ, że liczy tylko instrukcję końcową tylko raz. To pozwala nam kompresować większość programów liniowych, takich jak1O+1@
Wyzwanie polega tutaj na napisaniu programu lub funkcji, która pobierze ciąg znaków i wyświetli instrukcje, które zostałyby wykonane, gdyby program był interpretowany jak Backhand (nie trzeba obsługiwać żadnych rzeczywistych instrukcji Backhand). Wyprowadzasz dane wyjściowe, dopóki wskaźnik nie wyląduje na ostatnim znaku ciągu (w tym momencie wykonanie normalnie byłoby cofane).
Ale czekaj , to nie wszystko! Gdy sam program jest interpretowany w ten sposób, wynikowy kod powinien wypisać jedno z poniższych:
(Mostly) works
Turing complete
'Recreational'
(cytaty mogą być'
albo"
, ale nie oba)Perfectly okay
Only a few bugs
Na przykład, jeśli twój kod źródłowy to code 2 backhand
, to program ce cankb od2ahd
powinien wypisać jedną z tych fraz.
Przypadki testowe:
"1 1 + O @" -> "11+O@"
"1O+1@" -> "11+O@"
"HoreWll dlo!" -> "Hello World!"
"abcdefghijklmnopqrstuvwxyz" -> "adgjmpsvyxurolifcbehknqtwz"
"0123456789" -> "0369" (not "0369630369")
"@" -> "@"
"io" -> "io" (Cat program in Backhand)
"!?O" -> "!?O" (Outputs random bits forever in Backhand)
"---!---!" -> "-!-----!"
I program referencyjny napisany oczywiście w Backhand ( może to być trochę wadliwy. Ok, myślę, że to naprawiłem).
Zasady
- Standardowe luki są zabronione
- Dane wejściowe pierwszego programu będą zawierać tylko drukowalne ASCII i znaki nowej linii (to znaczy bajty
0x20
-0x7E
a także 0x0A) - Możesz wybrać, czy drugi program ma być konwertowany z pierwszego bajtu, czy ze znaków UTF-8.
- Drugi program:
- Wielkość liter nie ma znaczenia, więc wynik może być,
pErFectLy OKay
jeśli chcesz. - Każda ilość spacji końcowych / wiodących białych znaków (nowa linia, tabulatory, spacje) jest również w porządku.
- Drugi program powinien być w tym samym języku co pierwszy, choć niekoniecznie ten sam format (program / funkcja)
- Z przyjemnością dołączam sugestie z komentarzy do dodatkowych zwrotów (o ile nie są zbyt krótkie)
- Wielkość liter nie ma znaczenia, więc wynik może być,
- Ponieważ jest to golf golfowy , Twoim celem jest uzyskanie najkrótszej odpowiedzi dla Twojego języka!
- Za dwa tygodnie przyznam 200 nagród za najkrótszą odpowiedź odręczną.
źródło
"---!---!"
Odpowiedzi:
R 187 bajtów
Wypróbuj online!
Pojedyncza spacja na końcu jest potrzebna, aby
\n
nigdy nie została wydrukowana, gdy program zostanie zastosowany do siebie.Wyjaśnienie
Część 1:
Nie golfowany:
Część 2:
Funkcja generuje to, gdy działa na cały program:
źródło
Python 2 ,
1631301271211159996 bajtówWypróbuj online!
Wyjścia:
źródło
Perl 6 ,
10186 bajtówWow, -25 bajtów dzięki nwellnhof dzięki drastycznemu ulepszeniu pierwszego programu
Wypróbuj online!
Mam nadzieję, że więcej osób skorzysta z takiego odbicia. Program Backhanded to
Które komentarze do just
{"(Mostly) works"}
.źródło
05AB1E ,
43403837 bajtów-2 bajty (40 → 38) dzięki @Emigna .
Wypróbuj online . (PS: Zmień język z 05AB1E (starsza wersja) na 05AB1E dla przypadku testowego
0123456789
. Starsza wersja jest szybsza, ale pokazuje niepoprawne wyniki dla wprowadzania liczb z wiodącymi zerami.)Program „backhanded” będzie wyglądał następująco:
Które będą wyświetlać się
perfectly okay
małymi literami.Wypróbuj online.
Objaśnienie programu podstawowego:
Objaśnienie programu „odręcznie”:
Krok po kroku dzieje się:
„ÃеÝ
: STOSOWANIE staje się["perfectly okay"]
[
: Uruchom nieskończoną pętlęN©
: STOSOWANIE staje się["perfectly okay", 0]
I
: STOSOWANIE pozostaje,["perfectly okay", 0]
ponieważ nie ma danych wejściowych#
: STOSOWANIE staje się["perfectly okay"]
, a pętla trwaN
: STOSOWANIE staje się["perfectly okay", 0]
#
: STOSOWANIE staje się["perfectly okay"]
, a pętla trwaN©
: STOSOWANIE staje się["perfectly okay", 1]
I
: STOSOWANIE pozostaje,["perfectly okay", 1]
ponieważ nie ma danych wejściowych#
: STOSOWANIE staje się["perfectly okay"]
, a pętla pęka z powodu1
(prawdy)perfectly okay
Zobacz kroki tutaj z włączonym debuggerem na TIO.
Zobacz tę końcówkę 05AB1E kopalni (sekcja Jak używać słownika? ) , Aby zrozumieć, dlaczego
„€€Ã€„Ѐ€µ'€Ý
sąthe pointed
,dm one
ibeen
i„ÃеÝ
jestperfectly okay
.Stara 38-bajtowa wersja:
Wypróbuj online . (PS: Przełącz język z 05AB1E (starsza wersja) na 05AB1E dla przypadków testowych
0123456789
i@
. Starsza wersja jest szybsza, ale pokazuje niepoprawne wyniki dla wprowadzania liczb z wiodącymi zerami lub wejściami jednoznakowymi.)Program „backhanded” będzie wyglądał następująco:
(Tam, gdzie
q
wychodzi z programu i sprawia, że wszystko inne przestaje działać).Wypróbuj online.
źródło
/
powinno być `\`?N>3*©
zamiastXU
zapisywania 2. Wydaje mi się również, że powinien być jakiś sposób drukowania w pętli, co pozwoliłoby zaoszczędzić jeszcze więcej bajtów./
powinno być\
... I dzięki za -2. Rzeczywiście mam wrażenie, że można dalej grać w golfa. Wydaje się, że podstawowa funkcjonalność drukowania co 3 wartości wydaje się zbyt długa, w tym odbijanie.[ûDN3*©è?®IgD#<ÖNĀ*#
bez if-else, który jest o 2 bajty krótszy niż if-else z pętlą. Niestety nadal potrzebujemyq
programu backhanded, więc będzie to również 38 bajtów . Ale mam wrażenie, że przerwa może być w jakiś sposób poprawiona, mając na uwadze dane wejściowe o jednym znaku, indeks 0 i podzielność według długości-1 w tym samym czasie.Python 2 , 130 bajtów
Wypróbuj online!
źródło
JavaScript (ES6), 130 bajtów
Wczesna próba. Niezbyt satysfakcjonujące.
Wypróbuj online!
Gdy kod jest przetwarzany sam, izolowane są następujące znaki:
co daje:
źródło
Galaretka , 34 bajty
Pełny program lub łącze monadyczne akceptujące listę znaków, które są drukowane lub dają (odpowiednio).
Wypróbuj online! Lub zobacz pakiet testowy .
Następnie parsowany kod odręczny to:
Pełny program lub niladyczne drukowanie łącza lub tworzenie (odpowiednio) Turinga zakończone .
W jaki sposób?
wówczas przeanalizowany kod odręczny to:
źródło
Runiczne Zaklęcia , 294 bajty
Wypróbuj online!
Wersja nieskompresowana (i prawie czytelna):
Wypróbuj online!
To ... jest tak blisko, jak tylko mogę.
Dalsze kompresowanie wymagałoby wymyślenia sposobu obsługi różnych punktów wymiany pętli bez kolizji z innymi rzeczami. Pierwszy wiersz (który jest jedyną częścią, którą należy przekazać jako dane wejściowe do siebie) musi pozostać osobny: cały ciąg nie może zmieścić się w drugim wierszu bez powodowania problemów (w
_
przypadku wymaganych spacji):Tego
?
nie można oderwać od tego,!
co samo nie może być odsuwane od\
i żaden z dozwolonych komunikatów nie pozwala na żadną z tych trzech postaci w tej pozycji.Alternatywą byłoby użycie przekierowania przepływu, ale prowadzi to do problemu w dolnej linii:
Ponieważ musimy unikać przełączania pętli w programie głównym.
Znane problemy:
abcdefghijklmnopqrstuvwxyz
ale nie całe własne źródło). I istnieje limit niezależnie od liczby połączeń. Może obsłużyć do 58 bajtów danych wejściowych w stanie obecnym (dodatkowo zwiększenie liczby adresów IP wymaga wymyślenia, jak je połączyć, bez zajmowania więcej miejsca). Może zmieścić dwa kolejne wpisy IP w linii powrotu pętli (po prawejU
stronie linii rozpoczynającej się\y<<
w wersji nieskompresowanej lub jeden w lewo powyżej liniiy<<
w wersji skompresowanej), zwiększając maksymalną długość wejściową do 78.1\ \ 1\ \ +\ \ O\ \ @
.). Jest to ograniczenie analizy składniowej języka.0
s (tak jak po przekształceniu w liczbę na stosie,0
gubi się). Ponownie, ograniczenie analizy wejściowej języka.Jak to działa
Wejście:
Główna pętla (wszystko, co wyskakuje na stosie, poprzedza duplikat):
@
. Prawda: zakończ. (Wykonaj polecenie Zakończ)Pętla wtórna:
źródło