Zdefiniujmy prosty język 2D, któremu nadamy niezwykle oryginalną nazwę befinge . Befinge ma 5 instrukcji:
<>^v
, jak w większości esolangów 2D, przekieruj wskaźnik instrukcji w odpowiednich kierunkach..
jest zakazem.
Wskaźnik instrukcji zaczyna się w lewym górnym rogu, po prawej stronie. Jeśli wskaźnik instrukcji dojdzie do krawędzi, program zatrzymuje się. Każdy program Befinge oczywiście zatrzyma się lub przejdzie w nieskończoną pętlę, która nic nie robi. Oto dwa przykłady:
Postojowy:
>.v
..<
Bez zatrzymania:
>....v
..v..<
..>v..
^..<..
Problemu zatrzymania nie da się rozwiązać w języku kompletnym Turinga, ale właśnie w tym. Twoim zadaniem jest napisanie programu (lub funkcji), który pobiera jako dane wejściowe ciąg znaków reprezentujący program befinge i zwraca wartość prawdy lub fałszu w zależności od tego, czy się zatrzyma, czy nie.
- Możesz założyć, że dane wejściowe będą składały się tylko z tych znaków i będą wypełnione spacjami, aby utworzyć prostokąt.
- Do instrukcji można użyć dowolnego zestawu pięciu znaków (np
adws
.).
Przypadki testowe
Postojowy:
.
v>
>^
....v....
....>...v
.^..<....
.......v<
.......v.
....^..<.
v<>v>v^
>v^>^>v
<>>^v<v
v^<>v^<
Bez zatrzymania:
>..v
^..<
>v<
v<.
>v.
v<.
>.^
>.>.>.v
.><.<.<
To jest golf golfowy , więc wygrywa najkrótszy program (w bajtach).
źródło
>..>.
lub><
.Odpowiedzi:
ES6 (JavaScript),
111, 101 bajtówEDYCJA: zmieniono wartości wyjściowe na prawda i fałsz , zamiast Y i N , aby zgolić jeszcze 10 bajtów
Grał w golfa
Test
Przykładowe dane wyjściowe
źródło
Y
iN
jako dane wyjściowe, jak w JavaScript , oba są zgodne z prawdą .Python 2 ,
116105 bajtówWypróbuj online!
Wyzwanie jest stare, ale pomyślałem, że ponieważ jest to najkrótszy Python, opublikuję go. Dane wejściowe to lista ciągów znaków, ale użyte znaki są nietypowe.
Na przykład trzeci przykład zatrzymania zmienia się w
['LLLLCLLLL', 'LLLLGLLLC', 'LFLLBLLLL', 'LLLLLLLCB', 'LLLLLLLCL', 'LLLLFLLBL']
. Wyjście odbywa się za pomocą kodu wyjścia, 0 (sukces) w przypadku braku zatrzymania i 1 (błąd) w przypadku zatrzymania. Doceniamy wszelkie porady i wskazówki.źródło
Befunge-98 (PyFunge) ,
217209200 bajtówWypróbuj online!
Problem zatrzymania befinge wymaga rozwiązania befunge. Zwraca 0 dla prawdy i 1 dla falsey. Umieszcza dane wejściowe na siatce, zaczynając od 1,15, a następnie przesuwa się na górę, zastępując strzałki zerami. Gdy tylko osiągniemy zero, wiemy, że się zapętla. Wszystko oprócz> <^ v. a zero jest uważane za zatrzymanie programu, który obejmuje granicę przestrzeni, które omijamy program, umieszczając go na siatce lekko przesuniętej.
Jednym łatwym sposobem na ogolenie kilku kęsów byłoby użycie liczb zamiast> <^ v. ale nie wydaje mi się, żeby było warto.
źródło
A befinge halting problem needs a befunge solution.
Dokładnie. +1Turtlèd , 146 bajtów
Ten program ma inne wejścia / wyjścia: zakończ każdą linię spacją, w tym ostatnią. Turtlèd nie lubi nowych linii, ponieważ wykorzystuje siatkę dla swojego drugiego wymiaru znaków.
Wypróbuj online!
0 dla pętli na zawsze, 1 dla przerw.
Ogólne wyjaśnienie:
Zapisuje dane wejściowe na siatce, a następnie podąża ścieżką, którą strzałki robią wokół siatki, zastępując każdą strzałkę *, gdy idzie, zapisując również kierunek w char var. Jeśli napotka * strzałkę, którą wcześniej uderzył, program się nie zatrzyma, więc ustawia char var na
0
, wyjście z pętli. W przeciwnym razie uderzy w koniec siatki i opuści pętlę. Napiszę char var. Jeśli trafi na koniec siatki, używa kierunku zapisanego w char var, aby wrócić do siatki i ustawia char var na1
, dla zatrzymań. Jeśli char var faktycznie wynosił 0, a nie kierunek, nie musi wracać, ponieważ nadal tam jest, i ustawia go z powrotem na0
. Czyści siatkę, a następnie zapisuje char var,1
dla przerw, w przeciwnym razie0
.źródło
JavaScript (Node.js) , 80 bajtów
Wypróbuj online!
JavaScript (Node.js) , 86 bajtów
Wypróbuj online!
źródło
JavaScript (ES6),
158127 bajtówPobiera dane wejściowe jako dwuwymiarową tablicę znaków i wraca
true
do zatrzymania ifalse
do nieskończonej pętli. Działa poprzez ustawienie odwiedzonych znaków kierunku na~
s, gdy rekurencyjnie je przemierza. Edycja: Zapisano 31 bajtów, aktualizując mój wektor kierunku przed rekurencją.Nadużywanie znaków instrukcji (
1=^ 4=< 5=. 6=> 9=v
) prowadzi mnie do 101 bajtów:źródło
f=
liczbę bajtów, ale nie kod ...SmileBASIC,
158145 bajtówJeśli ta sama strzałka zostanie napotkana więcej niż jeden raz, program nigdy się nie zatrzyma. Kiedy wskaźnik instrukcji mija strzałkę, jest zastępowany innym symbolem, co spowoduje, że funkcja zwróci 0, jeśli zostanie osiągnięta ponownie. Jeśli adres IP wykracza poza granice, zwraca 1.
Pobiera dane wejściowe jako tablicę ciągów.
<any non-digit chracter>
,1
,2
,3
,4
=.
,>
,<
,v
,^
źródło
Python 2, 182 bajty
Pobiera tablicę ciągów jako dane wejściowe. Muszę to jeszcze bardziej pograć w golfa, ale na razie pora stresować się wyborami.
Nie golfowany:
źródło
[-1,1][d=='v'] -> 2*(d>'>')-1
i[-1,1][d=='>'] -> 2*(d>'<')-1
zaoszczędzić łącznie 6 bajtów.["<>"]
Clojure, 143 bajty
Funkcja z 4 argumentami stanu: pozycja
p
, prędkośćv
, wskaźnik krokui
i rozmiar jednej liniis
. Zwraca,1
jeśli nie przekroczyliśmy granic w 10 ^ 9 krokach inil
inaczej. W rzeczywistości ile kroków musimy sprawdzić, aby się upewnić(count %)
? Myślę, że to coś więcej, ponieważ ten sam NOP może być przemierzany poziomo i pionowo.Może być wywoływany w ten sposób (przyjmuje argumenty jako normalne ciągi znaków,
get
zwracanil
gdy jest poza zakresem):Przejścia stanu (+1, -1, + s, -s) są zakodowane w słowniku
{\> 1\< -1\^(- s)\. v\v s}
.źródło
Python 2/3,
201192 bajtyWypróbuj online!
Daje prawidłową odpowiedź dla
["<>"]
źródło
def f(x):
zx=input()
z 0 bajtów różnicę, a następnie usunąć dodatkowe wgłębienie (-8 bajtów), a następnie zastępujereturn x
sięexit(x)
(dostępnego na meta konsensus ), przez dalsze 2 bajtów. W każdym razie fajne rozwiązanie!Java, 477
Wiem, że to nie wygrywa, n = i prawdopodobnie można w nią grać w golfa, ale implikuje podobną metodę do tego, co wykorzystują inne odpowiedzi, ale ta używa hashapy do wyszukiwania. W danych wejściowych używane są symbole> <^ v i cokolwiek innego niż to dla no op. Dane wejściowe pochodzą z argumentów.
GOLFED
UNGOLFED
import java.util. *;
Wyjaśnienie już wkrótce!
źródło
String a[]
, abyString[]a
i pominąć przestrzeń.var
w wielu miejscach, jeśli używasz Java 10.