?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 = Trueoraz dodatkową opcję NUMERIC_INPUT = True.
Wyjaśnienie
Szkielet programu to
?1-( 1 -
1 )!
Czytamy dane wejściowe Nna pierwszym głosie i zmniejszamy je, aby uzyskać N-1. Inicjujemy również drugi głos na 1. Następnie zapętlamy N-1jeden raz, z których każda iteracja otrzymuje następną wartość sekwencji na drugim stosie. Na koniec wypisujemy Nnumer 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 0na 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 0wstawiony 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 0s). Obciążenie idzie więc w ten głos (druga para nawiasów). Musimy tylko temu zapobiec , jeśli szef kolejki 0jeszcze nie jest . Najpierw mamy „pętlę” na trzecim głosie, która przesuwa a 0na drugi głos, jeśli głowa kolejki jest wciąż niezerowa. Dajemy także 0trzeci głos, aby natychmiast opuścić pętlę. #Na trzecim głosem, który następnie albo usuwa 0lub 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 (i0na drugi głos nigdy nie został popchnięty). W takim przypadku zwiększamy bieżącą wartość sekwencji i wciskamy a, 0aby wyjść z pętli. Na koniec zawsze będzie 0stos na szczycie stosu, który musimy odrzucić.
Mówiłem, że logiczna negacja jest denerwująca w Preludium ...
nraczej niż2 - n % 1. Czy masz powód, aby oczekiwać, że odpowiedzi będą się znacznie różnić?