Wireworld to automat komórkowy, który został zaprojektowany tak, aby przypominać elektrony przepływające przez przewody. Jego prosta mechanika pozwala na budowę obwodów cyfrowych. Pozwoliło to nawet na budowę całego komputera .
Twoim zadaniem jest stworzenie najkrótszej implementacji Wireworld w wybranym języku.
Każda komórka w siatce ma jeden z czterech stanów. Cztery stany to „pusty”, „miedź”, „głowa elektronu” lub „ogon elektronu”.
- Pusta komórka zawsze pozostanie pustą komórką
- Głowa elektronowa zawsze będzie ogonem elektronowym
- Ogon elektronowy zawsze będzie miedziany
- Ogniwo miedzi stanie się głowicą elektronów, a dokładnie jeden lub dwa z ośmiu sąsiadów to głowy elektronów, w przeciwnym razie pozostanie miedzią
Ten konkurs będzie miał podobny styl jak konkurs Najkrótszej gry życia , ale z kilkoma zmianami.
- Siatka musi mieć co najmniej 40 na 40 komórek
- Krawędzie siatki NIE mogą się owijać (nie torus). Traktuj komórki poza polem jako stale „puste”.
- Użytkownicy muszą mieć możliwość wprowadzenia własnej konfiguracji początkowej.
- Patrzenie na puste ekrany nie jest zabawne. Program musi wyświetlać symulację w trakcie działania.
To jest kod golfowy, najmniej bajtów wygrywa.
źródło
ALPACA, 82 znaki
ALPACA to język specjalnie zaprojektowany dla automatów komórkowych.
o jest niczym; c jest przewodnikiem; e oznacza elektron; t jest ogonem elektronowym.
źródło
GolfScript (
125 120 105100 znaków)Zauważ, że liczę
\033
jako jeden znak, ponieważ można je zastąpić dosłownieESC
. Używa kodów kontrolnych ANSI, więc polega na kompatybilnym tty. Należy również pamiętać, że ramki są drukowane począwszy od siatki wejściowej.W pewnym stopniu nakłada się na Generuj siatkę sum , która również wykorzystuje sąsiedztwo Moore.
Kodowanie: puste miejsce =>
; głowa elektronu =>
i
; ogon elektronowy =>`
; miedź =>X
.Przerwa między iteracjami to czas wymagany do obliczenia 46656 46656 . Zmiana
6.?.?
na inne wyrażenie pozwala kontrolować prędkość; następny najwolniejszy dla tej samej liczby znaków jest7.?.?
, który jest znacznie wolniejszy (wynik jest 22 razy większy i nie jest to obliczenie liniowej złożoności).Do testu użyłem
z konkursu Rosewta Code Wireworld .
źródło
Znaki Python
371341Tak, nie jest tak krótki, ale ma interaktywne GUI!
Instrukcje:
Kliknij lewym przyciskiem myszy, aby umieścić drut
Kliknij prawym przyciskiem myszy, aby wyczyścić
Kliknij środkowym przyciskiem myszy, aby umieścić głowicę elektronową
Kliknij poza osiami, aby przejść do automatu
źródło
(x>0)&(x<3)
->(0<x<3)
. :)Python (
243214)Próbowałem stworzyć skrzyżowanie użyteczności z postaciami. Siatka ma wymiary 40 x 40. Dane wejściowe podano na stdin. Głowica elektronowa jest
h
, ogon elektronowyt
, miedź jestc
, wszystko inne jest puste.Pętla while (linia 3) nieskompresowana (nie będzie działać, jeśli zostanie umieszczona w kodzie):
źródło
g[e]='h'if(t=='c')&...else't'if i=='h'else'c'if i=='t'else i
. Nie jestem pewien, czy to działa dokładnie tak, jak jest, ale coś w tym stylu powinno działaćC,
355347300294 znakówEdycja: zdałem sobie sprawę, że nie potrzebuję
feof()
Edycja: Zapisano 47 znaków! Usunąłem Sen, pozbyłem się prawie wszystkich aparatów ortodontycznych, połączyłem wiele operacji.
Edytuj: Ostatni dzisiaj, odkąd złamałem 300 znaków. Zmieniono
printf
naputs
, znalazłem uroczą małą optymalizację przy pierwszym porównaniu.C nie nadaje się dobrze do tego rodzaju problemów, ale hej, gra w golfa jest fajna. Jest to dość brutalna implementacja, ale chciałem zobaczyć, jak daleko mogę grać w golfa.
Dane wejściowe to plik tekstowy o nazwie
i
. Zawiera przedstawienie stanu początkowego,*
dla miedzi,+
dla głowy elektronowej,-
dla ogona elektronowego, przestrzeni dla pustych komórek. Do testowania używam bramki XOR ze strony wiki.źródło
cond?43:42
być napisany42+(cond)
? I jestem pewien, żer=s[j][i++];*p=r==43?45:r;if(r==45)*p=42;
można zredukować do,r=s[j][i++];*p=r==43?45:r==45?42:r;
jeśli nie dor=s[j][i++]-43;*p=!r?45:r==2?42:r;
Python,
234218 znakówWpisujesz tablicę jako trzy listy liczb zespolonych reprezentujących współrzędne komórek miedzi (które muszą zawierać listy głów i ogonów), głów i ogonów. Oto przykład:
Zauważ, że mamy
eval
dane wejściowe, dzięki czemu możesz używać dowolnie złożonych wyrażeń do list liczb zespolonych.źródło
QBasic, 309 bajtów
Ostrzeżenie: wersja gry w golfa nie jest przyjazna dla użytkownika: ma dziwną metodę wprowadzania, działa jako nieskończona pętla i nie ma żadnych opóźnień (dlatego działa zbyt szybko w niektórych systemach). Uruchom go tylko, jeśli wiesz, jak zakończyć program w środowisku QBasic. Zalecana jest wersja bez golfa (patrz poniżej).
Aby uruchomić, w wierszu poleceń podaj szerokość
w
i wysokość konfiguracjih
. 1 Następnie wpiszw*h
jednocyfrowe kody komórek (od lewej do prawej, a następnie od góry do dołu), za pomocą0
= pusty6
= drut7
= głowica sygnalizacyjna1
= ogon sygnałowyPo wprowadzeniu wszystkich komórek rozpocznie się symulacja (i będzie trwała wiecznie, aż do momentu zabicia programu).
Bez golfa
Bardziej przyjazna dla użytkownika wersja. Aby zmodyfikować układ, zmodyfikuj
DATA
instrukcje na końcu.Kod wykorzystuje
POINT
funkcję, która odczytuje wartość koloru piksela z ekranu. Oznacza to, że nie musimy przechowywać komórek osobno jako tablicy. Aby upewnić się, że wszystkie komórki aktualizują się jednocześnie, wykonujemy aktualizacje na drugiej „stronie”. Możemy przełączać aktywną stronę za pomocą wersjiSCREEN
instrukcji i kopiować zawartość jednej strony na drugą za pomocąPCOPY
instrukcji.1 Maksymalne wartości szerokości i wysokości zależą od używanego trybu ekranu. W
SCREEN 9
, szerokość może wynosić do 638, a wysokość do 348.SCREEN 7
ma mniejszą rozdzielczość (maksymalny rozmiar konfiguracji 318 na 198), ale piksele są większe i dlatego łatwiej je zobaczyć (na DOS QBasic lub emulatorze DOSBox - niestety QB64 tylko daje mniejsze okno).Przykładowy przebieg
Wersja bez golfa na archive.org , z trybem ekranu 7:
źródło