Napisać symulator maszyny Turinga .
Dla uproszczenia możemy przyjąć statusy jako liczby całkowite, symbole jako char, pusty symbol równa się spacji
5 krotek w postaci aktualnego stanu, symbolu wejściowego, następnego stanu, symbolu wyjściowego, kierunku (w lewo lub w prawo) kolejność nie jest obowiązkowa, ale określ, czy chcesz ją zamienić
Maszyna musi zatrzymać się po osiągnięciu nieznanego stanu, niedozwolone są żadne inne warunki zatrzymania.
Taśma jest nieskończona w obu kierunkach i zawsze możesz odczytać pusty znak.
Dane wejściowe: taśma początkowa, stan początkowy i program. możesz czytać dane z dowolnego miejsca w wybranym przez siebie formacie
Wyjście: taśma po wykonaniu programu
Wymagane: przykładowy program działający na symulatorze
To jest kod-colf, więc wygrywa najkrótszy kod.
W ciągu kilku godzin opublikuję implementację i kilka przykładowych programów.
źródło
Odpowiedzi:
GolfScript, 92 znaki
Maszyna Turinga w GolfScript stała się znacznie dłuższa niż zamierzona. Wciąż bawię się różnymi przedstawieniami taśmy.
Pierwszy wiersz wejścia to stan pierwotny, drugi wiersz początkowa taśma, a następnie tablica przejść (z bieżącym stanem zamówienia, symbolem wejściowym, następnym stanem, kierunkiem, symbolem wyjściowym).
Przykład ( dostępny również online )
źródło
GNU sed z
-r
-13311711193 znakamiTak, sed jest już gotowy. GNU sed i
-r
(rozszerzone wyrażenia regularne) służą tylko do zapisania kilku znaków, to tylko niewielka zmiana w pracy z POSIX sed.Format wejściowy to
Separatory
@
,#
i charakter głowa>
nie może być używany jako symbol na taśmie. Etykiety państwowe nie mogą zawierać@
>
lub#
.Uruchomi wszystkie programy na wejściu, po jednym w wierszu
Przykłady:
Marco to n b n programu
Cześć Marco! program
źródło
Trochę się spóźniłem, ale pomyślałem, że zostawię to tutaj ...
Maszyna Turinga Symulacja maszyny Turinga: 370 bajtów?
Tutaj używam struktury Turinga zastosowanej w jego artykule z 1936 roku. Używam jednego symbolu = jeden bajt, w tym m-config i operacji.
Oto jeden z przykładów Turinga z powyższego artykułu na moją maszynę:
Wypróbuj online! (Używa Pythona 3 jako interpretera) - Edycja: Właśnie sprawdziłem TIO i wydaje się, że tak naprawdę nie działa poprawnie ... Wypróbuj go na komputerze lokalnym i (mam nadzieję) powinien działać. To działa na moją.
źródło
APL (110)
(To nie jest nawet takie krótkie ...)
Czyta z klawiatury dwa wiersze: pierwszy to program, a drugi to początkowa taśma.
Format to
i wszyscy powinni być na tej samej linii. „Ruch” to 0, aby przejść w prawo i 1, aby przejść w lewo.
Przykładowy program (wstawione linie podziału dla zachowania przejrzystości, powinny znajdować się w jednym wierszu).
Program dodaje razem dwie liczby jednoargumentowe, na przykład:
Przykład 2 (dostosowany z programu przyrostowego binarnego z wpisu Marco Martinelli):
źródło
Python,
101189152142b i p są wejściami, b jest początkową taśmą, p koduje reguły jako (ciąg reprezentujący) dykta z krotki (w stanie, na taśmie) do krotki (w stanie, ruchu głowy, poza taśmą) krotki . Jeśli ruch wynosi 0, program kończy się, 1 to ruch w prawo, a -1 to ruch w lewo.
Ten przykładowy program sprawdza, czy ostatnia litera łańcucha (przed pustą taśmą) to „a”, jeśli tak, zapisuje „Y” na końcu łańcucha (pierwsza pusta spacja).
Edycja 1:
Zmieniono taśmę, aby była reprezentowana jako dyktando, ponieważ wydawało się to najkrótszym sposobem na napisanie rozszerzalnej struktury danych. Przedostatni wiersz w większości przekształca go z powrotem w czytelną formę na wyjście.
Edycja 2:
Dzięki Strigoides za wiele ulepszeń.
Edycja 3:
Zrobiłem to niepotrzebnie, więc 0, ponieważ wyjście opuszczałoby to miejsce. Usunąłem to, ponieważ zawsze możemy zapisać dane wyjściowe tak samo jak dane wejściowe.
źródło
r=0;s=0
możesz stać sięr=s=0
(a średnik na końcu tego wiersza nie jest potrzebny), możesz usunąć funkcjęw
, ponieważ nie jest używana, można usunąć nawiasy(s,m,t)=r[s,c]
, skrócić bloktry
/except
using dict.get;c=a.get(i,' ')
, ponieważm
ma wartość 0 lub 1, możesz użyćif m-1:
i możesz skrócićmap()
połączenie, przekształcając je w funkcję czytania listy.Postscriptum
(205)(156)(150)(135)Prawdopodobnie jest to oszustwo, ale tabela przejścia zawiera kod do wykonywania przejść. Ponieważ taśma jest reprezentowana przez odwzorowanie liczb całkowitych na liczby całkowite, przedstawiłem stany jako odwzorowanie nazw na słowniki, więc taśma i program współistnieją w tym samym anonimowym słowniku.
Dodatkowe oszczędności dzięki możliwości wykonywania wszystkich nazw stanów, dzięki czemu są one automatycznie ładowane.
Niegolfowany z wbudowanym programem „Hello”.
Dodatkowe 52 znaki kupują pętlę do odczytu taśmy ze standardowego wejścia.Uruchom zgsnd -q tm.ps
.Tak więc format tabeli to
gdzie
in-state
jest nazwą,in-tape
iout-tape
są znakami (tj. liczbami całkowitymi lub wyrażeniami, które dają liczby całkowite),movement
jest-1
dla lewej lub1
prawej iout-state
jest nazwą wykonywalną . Wielein-tape
przejść dla tego samego stanu należy połączyć jak powyżej.źródło
currentdict{search-for-min-and-max}forall juggle-params-for-for
. :(0 1 0 not{(%stdin)(r)file read not{exit}if def}for
. Nie jestem pewien, dlaczego myślałem, że mogę uciec od pominięcia tego w wersji golfowej. : P0 not
powinno być16#7fffffff
. Przepraszam. Aha! dlatego zostało to skomentowane! Wyszedł prosto z notebooka, nie został przetestowany, i skasowałem wszystkie komentarze, nie patrząc, kiedy grałem w golfa. Nie mów facetowi Pythonowi! : PC (jeszcze nie grał w golfa)
Chyba nie mogę z tym wygrać, ale fajnie było go uruchomić. Jest to tym bardziej prawdziwe, że teraz to naprawdę robi pracę. :)
Tyle że jest nieskończony tylko w jednym kierunku. Przypuszczam, że potrzebuje też taśmy negatywnej. Westchnienie....
Negatywne nie było takie złe. Przeplatamy obie strony jako wyrównania i szanse. Komplikacja polega teraz na tym, że musi wyświetlać taśmę w kolejności sekwencyjnej , ponieważ sam plik jest teraz pomieszany. Myślę, że to uzasadniona zmiana. Turing się uprościł w ten sposób.
A oto przebieg próbny:
Program wysyła taśmę w kolejności sekwencyjnej, ale plik przedstawia przeplecione strony negatywne i pozytywne.
źródło
0 'a' 0 'b' R; 0 'b' 0 'a' R
z wejściem aaa, wyjściem jest bab zamiast bbb. I są problemy z poruszaniem się w lewo.Groovy
234228154153149139124Sformatowane dla czytelności
t jest funkcją, która ustawia taśmę e jest funkcją, która ocenia program
Przykład 1 - Wydrukuj „Hello!” na taśmie :)
Przykład 2 - Pozostaw literę T na taśmie, jeśli początkowy ciąg znaków ma postać n b n , w przeciwnym razie zatrzymaj się.
Przykład 3 - Przyrost liczby binarnej
w przykładach 1 oznacza ruch w prawo, a -1 oznacza ruch w lewo
źródło