,{-?>}-):(=?
#}<<.{?_<.<.<.<.<.
Dane wejściowe w postaci wartości bajtowej , np. Dane wejściowe! dają węża o długości 33.
Wypróbuj online!
Minęło trochę czasu...
Wyjaśnienie
Szybki podkład Brian & Chuck:
- Pierwsza linia programu to Brian, druga to Chuck.
- Brian i Chuck są dwoma instancjami podobnymi do Brainfuck. Głównym haczykiem jest to, że program Chucka to taśma Briana i odwrotnie. Głowice taśmy / wskaźniki instrukcji zaczynają się na pierwszej komórce każdej taśmy, a wykonywanie rozpoczyna się na Brianie.
- Jeśli chodzi o polecenia, istnieje kilka różnic. Tylko Brian może używać
,(dane wejściowe) i tylko Chuck może używać .(dane wyjściowe). Oprócz <i >są {i }które przesuwają głowicę taśmy do następnej komórki zerowej (lub w przypadku {lewego końca taśmy, jeśli po drodze nie ma komórki zerowej). Zamiast [...]tego jedynym przepływem kontrolnym jest ?przełączenie sterowania na inne wystąpienie, jeśli bieżąca komórka jest niezerowa. Pierwsza wykonana instrukcja w drugiej komórce to ta po warunku. I na koniec, _to tylko alias dla zerowych bajtów, dla wygody.
Teraz kod. Brian zaczyna od tego:
,{-?
Odczytuje dane wejściowe do pierwszej komórki Chucka, a następnie przesuwa głowicę taśmy w lewo za pomocą {(obecnie nic nie robi) i zmniejsza wartość wejściową -przed przełączeniem kontroli dla Chucka, jeśli wartość jest wciąż niezerowa. To zaczyna główną pętlę. Następnie Chuck uruchamia ten bit:
}<<.{?
To przesuwa głowicę taśmy na Brianie do samego końca, przesuwa dwie komórki w lewo na = i drukuje ją przed głowicą taśmy do końca w lewo i przełącza sterowanie z powrotem na Briana. Tak zwykle działają pętle w B&C.
Gdy wejście zostanie zredukowane do zera, ?taśma Briana nic nie zrobi. Następnie Brian wykonuje tę część:
>}-):(=?
Nie ):(=ma operacji, więc rzeczywisty kod jest po prostu >}-?. Przechodzimy od komórki zerowej za pomocą >, przechodzimy do góry _z }, zmniejszamy ją, aby stała się niezerowa i przełączamy na Chucka za pomocą ?. Następnie uruchamiany jest ostatni bit na Chucku:
<.<.<.<.<.
To po prostu drukuje pięć znaków przed Chuckiem, tj =(:)-. Zauważ, że musimy wydrukować kolejną, =ponieważ główna pętla jest wykonywana tylko N-1razy dla danych wejściowych N.