Komórka na końcu tęczy


31

Wszyscy znamy, a przynajmniej słyszeliśmy o pieprzeniu mózgu , jednym z najbardziej znanych i wpływowych języków ezoterycznych. Podczas gdy obecnie większość implementacji używa nieskończonej taśmy, oryginalny kompilator Urban Müller miał taśmę 30000 komórek. Mało znanym faktem * jest to, że na końcu taśmy znajduje się specjalna wartość, z którą prawie nigdy nie wchodzi się w interakcję w typowym programie do pieprzenia mózgu.

Chociaż możesz wydrukować tę wartość za pomocą 29999 >si A ., brainfuck jest znany z krótkich i zwięzłych rozwiązań, więc Twoim celem jest wydrukowanie tej wartości z minimalną liczbą znaków.

*fikcja

Zasady:

  • Odświeżenie instrukcji pieprzenia mózgu:
    • +/ -: Zwiększanie / zmniejszanie bieżącej komórki, zawijanie od 255 do 0, gdy 255 jest zwiększane i odwrotnie
    • </ >: Przesuń wskaźnik w lewo / w prawo na taśmie
    • .: Wydrukuj wartość bieżącej komórki.
    • [: Przejdź do odpowiedniego, ]jeśli wartość w komórce wynosi 0
    • ]: Przejdź do odpowiedniego, [jeśli wartość w komórce nie jest równa 0
  • W tym przypadku ,(Pobierz dane wejściowe) nic nie robi, ponieważ oryginalny kompilator pozostawia komórkę bez zmian w EOF, a ten program nie powinien otrzymywać żadnych danych wejściowych.
  • Taśma jest początkowo wypełniona wszystkimi zerami, z wyjątkiem komórki 30000, która zawiera nieznaną wartość
  • Wskaźnik zaczyna się od komórki 1 i powinien kończyć się na komórce 30000 po wydrukowaniu go.
  • Komórki po lewej stronie 1 i po prawej stronie 30000 mają niezdefiniowane zachowanie, więc rozwiązania nie powinny odwiedzać tych komórek.
  • Należy zauważyć, że wartość na 30000 to może być 0, więc po prostu zapętlenie aż trafisz niezerowej komórka nie będzie działać.
  • Powinieneś wydrukować tylko wartość z komórki 30000
  • Najkrótsze rozwiązanie wygrywa!
    • Tie-breaker jest bardziej wydajnym programem (wykonuje się w najmniejszej liczbie kroków), po którym następuje najszybszy czas przesyłania.

Wskazówka: Esolanging Fruit sugeruje użycie https://copy.sh/brainfuck do przetestowania kodu. Specyfikacje są zgodne z opisem w tym wyzwaniu i możesz wybrać tę abortopcję, aby program zatrzymał się, jeśli przekroczy on granice.


Piaskownica (usunięto)
Jo King

3
1 bajt: .. Wygrałem.
Esolanging Fruit

1
@EsolangingFruit Proszę pozwolić mi mieć złudzenia, proszę ...
Jo King

1
Sugeruję zmianę reguły na „początkowo wszystkie komórki mają wartość 0, z wyjątkiem ostatniej komórki, która ma nieznaną wartość”.
user202729,

4
Wskazówka dla każdego, kto to robi: copy.sh/brainfuck jest prawdopodobnie najlepszą witryną do tego, ponieważ implementuje BF, jak opisano w tym wyzwaniu i domyślnie ma taśmę 30 000. Przesunięcie tuż obok końca taśmy powoduje zawieszenie się interpretera.
Esolanging Fruit

Odpowiedzi:


17

54 bajtów

------[>+++<--]>[->----[-[->+<]<[->+<]>>]<]>>>>>>>>>>.

119 x 252 = 29988. Prosto zagnieżdżona pętla.

Użyłem tego narzędzia do sprawdzenia, czy wskaźnik zatrzymuje się na 29999.


12

50 bajtów

>+[>+[<]>->+]>-<<[>>-------[[>]+[<]>-]<<-]>>>[>]>.

Wypróbuj tutaj!

Pierwsza sekcja ( >+[>+[<]>->+]>-<<) ustawia taśmę jako

0*12 121' 0 110

Następna sekcja ( [>>-------[[>]+[<]>-]<<-]) iteruje 121 razy, dodając 249 1s na końcu taśmy za każdym razem. Jeśli jesteś szybki w matematyce, możesz zauważyć, że 121 * 249 wyników w 30129 1s, ale pierwsza iteracja ma resztę 110 do załatwienia i dołącza ( 110-7) 103 1s do taśmy, co oznacza, że ​​jest tylko 29983 1s. Ostateczna taśma wygląda następująco:

0*12 0' 0 0 1*29983 0 ???

I finał >>>[>]>.do wydrukowania wartości.

Kilka innych ważnych algorytmów:

  • 252 * 119 = 29988 (także 50 bajtów)
  • 163 * 184 = 29992 (56 bajtów)
  • 204 * 147 = 29988 (60 bajtów)
  • 153 * 196 = 29988 (56 bajtów)
  • 191 * 157 = 29987 (57 bajtów)
  • 254 * 118 = 29972 (56 bajtów)
    • Ten jest tym, który uważam za najbliższy pobiciu 50, ponieważ dodatkowe bajty w zasadzie po prostu pokonują dodatkową odległość. Gdybym mógł znaleźć algorytm, który generuje 118 i podróżuje dalej niż 14 komórek, to może go pobić.

3

81

-[+>+[<]>++]<<+[-->-[-<]>]>-[>[->+[[->+<]<]>>>]<[-<<+>>]<<<-]>-------[[->+<]>-]>.

To przesuwa się o 150 komórek 200 razy.

Jest to znacznie dłużej, niż chciałbym, i istnieje poważna przeszkoda w grze w golfa:

Nie wiem już, dlaczego pracuję.

Jest to zaśmiecone rekompensatami za off-by-one do tego stopnia, że ​​niektóre z nich prawdopodobnie mogłyby się anulować. Dodałem i usunąłem różne segmenty tak bardzo, że nie pamiętam już, dlaczego umieszczam pewne rzeczy tam, gdzie one są (na przykład, dlaczego pierwsza część inicjuje komórki taśm na 199 i 151 zamiast 200 i 150?).

Oto i tak moja skomentowana wersja tej potworności, w nadziei, że ja (lub ktoś inny) może się im przydać:

-[+>+[<]>++]<<+[-->-[-<]>]>-

0 0 0 199' 155

[
  n' k 0
  >[
    n k' j
    ->+[[->+<]<]>
    0' n k-1 j+1 OR
    n 0 0' j+1
    >>
  ]
  0*k n 0 0 k 0'
  <[-<<+>>]<<<-
  0*k n-1' k
]
>-------[[->+<]>-]>.

To nie drukuje wartości, a jeśli wartość jest dodatnia, przepełnia się. Ale świetna próba
Jo King

Następnie dodaj ., czy to pomogłoby?
user202729,

1
@JoKing Naprawiono to.
Esolanging Fruit
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.