?1-(v #1)-
1 0v ^(# 0 (1+0)#)!
(#) ^#1-(0)#
Jeśli używany jest standardowy zgodny interpreter, przyjmuje on dane wejściowe i wyjściowe jako wartości bajtów . Aby właściwie używać liczb dziesiętnych na STDIN / STDOUT, że trzeba interpreter Pythona z NUMERIC_OUTPUT = True
oraz dodatkową opcję NUMERIC_INPUT = True
.
Wyjaśnienie
Szkielet programu to
?1-( 1 -
1 )!
Czytamy dane wejściowe N
na pierwszym głosie i zmniejszamy je, aby uzyskać N-1
. Inicjujemy również drugi głos na 1
. Następnie zapętlamy N-1
jeden raz, z których każda iteracja otrzymuje następną wartość sekwencji na drugim stosie. Na koniec wypisujemy N
numer th.
Ideą programu jest umieszczenie każdego elementu sekwencji w kolejce na trzecim głosie i zmniejszenie nagłówka tej kolejki w każdej iteracji. Kiedy głowa osiągnie 0
, zwiększamy wartość sekwencji i ją usuwamy 0
.
Problem polega na tym, że Prelude używa stosów, a nie kolejek. Musimy więc trochę przesunąć ten stos, aby użyć go jak kolejki.
v #
0v ^
(#)
Spowoduje to skopiowanie bieżącej wartości sekwencji do pierwszego głosu (jako kopia tymczasowa), wypycha a 0
na drugi głos (aby zaznaczyć koniec kolejki). Następnie wykonuje pętlę, aby przesunąć (a tym samym odwrócić) trzeci stos na drugi. Po pętli umieszczamy kopię bieżącej wartości sekwencji na drugim stosie (który jest ogonem naszej kolejki).
)
(#
^#1-
To wygląda trochę brzydko, ale w zasadzie jest to pętla, która przesuwa stos z powrotem na trzeci głos. Ponieważ )
jest w tej samej kolumnie, co instrukcje dotyczące przesunięcia, wcześniej 0
wstawiony drugi głos również skończy na trzecim, więc musimy go usunąć innym #
. Następnie zmniejsz górną część trzeciego głosu, tj. Głowę kolejki.
Teraz robi się to trochę denerwujące - chcemy uruchomić kod, gdy ta wartość jest 0
, ale jedyna struktura kontrolna Preludium (pętla) reaguje tylko na wartości niezerowe.
0 (1+0)#
(0)#
Zauważ, że góra drugiego głosu jest prawdziwa (ponieważ sekwencja Golomb nie zawiera żadnych 0
s). Obciążenie idzie więc w ten głos (druga para nawiasów). Musimy tylko temu zapobiec , jeśli szef kolejki 0
jeszcze nie jest . Najpierw mamy „pętlę” na trzecim głosie, która przesuwa a 0
na drugi głos, jeśli głowa kolejki jest wciąż niezerowa. Dajemy także 0
trzeci głos, aby natychmiast opuścić pętlę. #
Na trzecim głosem, który następnie albo usuwa 0
lub usuwa głowę kolejce jeśli to już było zera. Teraz ta druga pętla jest wprowadzana tylko wtedy, gdy na początku kolejki było zero (i0
na drugi głos nigdy nie został popchnięty). W takim przypadku zwiększamy bieżącą wartość sekwencji i wciskamy a, 0
aby wyjść z pętli. Na koniec zawsze będzie 0
stos na szczycie stosu, który musimy odrzucić.
Mówiłem, że logiczna negacja jest denerwująca w Preludium ...
n
raczej niż2 - n % 1
. Czy masz powód, aby oczekiwać, że odpowiedzi będą się znacznie różnić?