Symuluj komputer typu bilard (oparty na grawitacji)

12

Maszyna

Maszyna typu kule bilardowe składa się tylko z symboli \ _ /wraz z dużymi i małymi literami, spacjami oraz liczbą 1.

\i /są rampami. Piłka wychodząca z góry zostanie odbita odpowiednio na prawą lub lewą stronę. W przypadku obu ramp, jeśli piłka wychodzi z dowolnej strony, zostanie odchylona w dół.

_jest elementem logicznym. Wykonywana przez nią logika jest najbardziej niestabilną częścią komputera. Po pierwsze, piłka nadchodząca z lewej lub prawej strony kontynuuje w tym samym kierunku. Piłka wychodząca z góry zostanie zatrzymana. Następnie, po zakończeniu jego wykonywania (patrz Uruchamianie maszyny poniżej), jeśli liczba piłek przekraczających / lądujących na niej jest dodatnią liczbą parzystą, wówczas pojedyncza kula jest wypuszczana z dolnej części elementu.

Przestrzeń nic nie robi. Wszelkie piłki pochodzące z dowolnego kierunku spadają prosto w dół z powodu grawitacji.

Małe litery to dane wejściowe. Wszystkie wejścia będą albo pojedynczym 1, albo 0.

Wielkie litery są wyjściami. Liczba wyjściowa będzie liczbą bilardowych kulek, które trafiły w jego lokalizację.

Liczba 1wypuszcza dodatkową piłkę bilardową w tym miejscu. Reprezentuje logiczną 1.

Wszystkie postacie poza tym \_/powodują, że każda piłka nadchodząca z dowolnego kierunku spada prosto w dół z powodu grawitacji.

Kulki nigdy się nie łączą, nie dzielą ani nie zderzają. Są tworzone tylko po zwolnieniu z wejścia, a _lub a 1. Są niszczone tylko wtedy, gdy spadną prosto na _.

Przykładowa maszyna

1 a
\_/ b
  \_/
 \/
 /\ /
_  _
A  B

Nigdy nie będzie żadnych pustych linii w maszynie, ale _mogą sprawiać wrażenie, że jest pusta linia.

Uruchamianie maszyny

Maszyna działa w warstwach lub rzędach. Wszystkie ruchy kule bilardowej na górnej warstwie są wykonywane, zanim cokolwiek stanie się na drugiej warstwie.

Maszyna

ab
\_A
 C

jest uruchamiany w następujący sposób:

Najpierw monituje o wprowadzenie danych aw formularzu a:. Użytkownik wprowadzi następnie 1 lub 0 (a następnie Enter). Powtarza to dla danych wejściowych b. To jest koniec pierwszej warstwy. Zakładam, że użytkownik wprowadził 1 dla obu danych wejściowych.

Następnie wykrywa ścieżkę pierwszej piłki (od a), która biegnie wzdłuż \, przez _, do Ai spada do miejsca pod A. Następnie wykrywa ścieżkę drugiej piłki (z b), która biegnie prosto w dół _i kończy. To koniec drugiej warstwy.

Teraz, przed trzecią warstwą, ponieważ _ma na sobie dwie kule, wypuszcza jedną piłkę. Wyjście Ama nad sobą jedną kulę, więc wyprowadza A:1.

W przypadku trzeciej warstwy śledzi ścieżkę pierwszej piłki (od _), która przechodzi przez Ci spada prosto w dół. Druga piłka (która wpadła przez A) również spada prosto w dół.

Teraz, przed czwartą warstwą, ponieważ wynik Cmiał jedną kulkę nad nią, wyprowadza C:1.

Ponieważ czwarta warstwa jest pusta, program się kończy.

Całkowity wynik powinien wyglądać

a:1     (the user entered the one)
b:1     (same here)
A:1
C:1

Cel

Twoim celem jest pobranie maszyny ze STDIN i jej symulacja poprzez pobranie danych wejściowych i wydruków w razie potrzeby do STDOUT. Pierwsza część danych wejściowych do programu będzie składała się z maszyny, która ma być uruchomiona, a następnie będzie pusta linia. Wszelkie napotkane litery wejściowe powinny powodować wyświetlanie przez program monitów o wprowadzenie danych w formie nazwy wejściowej, po której następuje dwukropek. Każde wyjście powinno być pokazane w postaci nazwy wyjścia, dwukropka, a następnie liczby kulek przechodzących nad tym miejscem.

To jest golf.

Przykłady

Przecięcie drutu

ab
\/
AB

Brama XOR

ab1
\_/
 C

Pełny sumator

1 a
\_/ b
  \_/
 \/
 /\
_ __/
 \_/ 
  \/c
 \\_/ 
  _S1
\  \/
 __/
  /
 _
\__
 C
PhiNotPi
źródło
Dlaczego w pierwszym przykładzie pierwsza piłka spada pod literą A? Czy istnieje niepisana zasada, że ​​kule zatrzymują się, gdy przechodzą na postać, która nie jest \_/?
Peter Taylor
@PeterTaylor Tak, powinienem dodać, że wszystkie litery zachowują się jak puste miejsce, jeśli chodzi o wpływanie na piłkę, a grawitacja pociąga piłkę w dół.
PhiNotPi
1
Czy przypadkiem masz na myśli „płetwę”, a nie „bilard”?
użytkownik nieznany
ROBIĆ DIS ESOLANG
Matthew Roh
1
@AlexL. Również istotne: Marbelous
PhiNotPi

Odpowiedzi:

3

JavaScript ( 392 423)

Zakłada, że ​​maszyna jest ustawiona w zmiennej o nazwie m, a następnie ostrzega o końcowym wyniku.

l=m.split(q='\n');o='';for(r=Array(z=l[i=0].length);i<l.length;i++){L=l[i];n=Array(z);for(c=0;c<z;n[c]=N,r[c++]=R){C=L[c];N=~~n[c];R=~~r[c];if(C>'`'){N+=x=~~prompt(C);R+=x;o+=C+': '+x+q}else if(C=='\\'||C=='/'){for(d=c+(g=C=='/'?-1:1);L[d]=='_';r[d]+=R,d+=g);if(L[d]>'@'&L[d]<'[')r[d]+=r[c];n[d]=~~n[d]+R}else if(C<'2')N+=R+=~~C;else if(C!='_')o+=C+': '+R+q}for(c=0;c<z;c++)if(L[c]=='_')n[c]+=(r[c]%2)?0:r[c]>0;r=n}alert(o)

Przykładowe źródło (uruchamia maszynę dodającą, zobacz historię dla mniej golfowych źródeł): http://jsfiddle.net/96yLj/12/

Spoilery:

- rśledzi liczbę piłek w bieżącym rzędzie, nśledzi liczbę piłek w następnym rzędzie.
- Algorytm: przetwarzaj każdy wiersz znak po znaku, ale proces _jest ostatni.
- Algorytm: \-> podążaj _i zwiększaj, raż nie będzie _. To samo dotyczy, /ale w odwrotnym kierunku. Na koniec zwiększ ngrawitację, ciągnąc piłki w dół. gtrzyma kierunek.
- if(L[d]>'@'&L[d]<'[')r[d]+=r[c];dotyczy błędu wymienionego w Edycji 1 . Nie możemy po prostu powiedzieć, r[d]+=r[c];że \_/podczas podwójnego liczenia piłek podczas przetwarzania /
- else if(C<'2')obsługuje oba przypadki '1'i ' ', które ~~Czamieniają się odpowiednio w 1 i 0.


Edycja 1: Napraw błąd powodujący, że kula nie działa _w Aprzykładowym kodzie.

mellamokb
źródło
Zauważ, że zawsze ignoruję wymagania STDIN i STDOUT, ponieważ są to nieciekawe ograniczenia. Używam promptdo danych wejściowych i alertwyjściowych, co jest dość standardem dla JavaScript :-)
mellamokb