Twoim zadaniem jest interpretacja schematu obwodu wraz z bramkami logicznymi.
Bramki logiczne (tak naprawdę nie musisz wiedzieć, co one robią / są, aby ukończyć to wyzwanie):
- i brama:
a
- lub brama:
o
- Nand Gate:
A
- ani brama:
O
- brama xor:
x
- brama xnor:
X
- nie brama:
~
Każda bramka, ale ostatnia, przyjmuje dwa wejścia. Dane wejściowe pochodzą od a .
w lewym górnym i lewym dolnym rogu kwadratu 3 na 3 wyśrodkowanego na bramie. W przeciwnym razie dane wejściowe znajdują się bezpośrednio po lewej stronie. Dane wyjściowe znajdują się .
bezpośrednio po prawej stronie.
Przewody są reprezentowane przez -|\/.=
-
styka się z dwoma przewodami, jeden po prawej i jeden po lewej:c-c
|
styka się z dwoma przewodami, jednym powyżej i jednym poniżej:c | c
/
i\
pracuj w następujący sposób:c c \ / c c
.
styka się z każdym otaczającym drutem:ccc c.c ccc
=
jest wyjątkowy; łączy sąsiednie przewody:-=-
łączy dwa przewody. W następującym
\|/ -=- /|\
każdy przeciwny drut jest połączony ze sobą, ale nie z innymi (tutaj się różni
.
).- Aby prąd przepływał, oba przewody muszą być połączone z drugim, tak więc
|-
prąd nie płynie.
Przykład okablowania:
.-.
= \
.--. .---=---
-. = .--
.--. .-------
wejście jest podzielone na dwa przewody, a następnie na trzy. W tym podziale dolny drut przesuwa się na środek, a dolny podział górnego drutu pojawia się na dole. Następnie górna część trzech drutów zostaje przesunięta na środek.
Przykładowe okablowanie z bramkami:
--.
o..~..
--. o.---
a.---.
--.
Format wejściowy:
- każdy przewód wejściowy będzie oznaczony cyfrą. Na końcu (tuż przed znakiem nowej linii) każde wyjście będzie oznaczone
:
(a drut zawsze będzie bezpośrednio w nim wchodził, tj.-:
Lub.:
lub=:
) - dane wejściowe zawsze będą ważne; nie będzie pętli ani przewodów łączących się bez bramki. Pamiętaj, że mogą istnieć druty o luźnych końcach.
=
będą używane tylko w razie potrzeby.
Format wyjściowy:
- każde wejście jest oznaczone odpowiednim numerem.
- wyprowadzane jest wyrażenie. Na przykład, jeśli przewody obliczają wejście 1 i wejście 2, wynikiem jest
1a2
. - wszelkie wyjściowe funkcje muszą odpowiadać bramkom logicznym na początku.
- aby nie pokazać, umieść
~
przed właściwym miejscem. w przypadku wielu funkcji użyj nawiasów, aby pokazać kolejność wykonywania. Nawiasów można także używać, gdy jest tylko jedna funkcja. Na przykład,
1-.~.-. A.~.-: . 2-. / x. 3-.
ma jedno możliwe wyjście
~((2x3)A(~1))
- wiele wyników musi być oddzielonych znakiem nowej linii (lub równoważnym)
Przykładowe dane wejściowe:
1--.---.
x. \
2--. x.-=---------.
. .~. X.--.
3---. . a.----. /
O.~.-. \ /
. =
4-. / / .-:
X. .----:
5-.
Jedno możliwe odpowiednie wyjście:
(~1)a(~(3O(4X5))
((1x2)x3)X((~1)a(~(3O(4X5))))
Odpowiedzi:
Python
24881567806706697657653Tak dla gzip + exec!
Ograniczenia i założenia
Obecnie obsługiwanych jest tylko do 9 wejść - wiele cyfr nie jest obsługiwanych poprawnie. Ponieważ specyfikacja wskazuje, że dane wejściowe są oznaczone cyfrą , a nie liczbą , jest to dozwolone.
Wejście i wyjście
Wejście jest pobierane poprzez standardowe wejście, a wyjście przez standardowe wyjście.
Testowanie
Przykładowe dane wejściowe i wyjściowe:
Testowany tutaj: http://ideone.com/gP4CIq
Algorytm
Zasadniczo jest to dość naiwny DFS z wyjść. Dla każdego wyjścia zaczyna się od znaku jeden po lewej stronie i śledzi drut, rozgałęziając się (i dodając do wyrażenia) przy każdej bramie. Kiedy osiągnie wejście, dodaje je do wyrażenia i cofa do ostatniego punktu, w którym rozgałęził się, ponieważ możemy być pewni, że rozgałęzienie nie jest możliwe bez bramki. I oczywiście wszelkie nieważne przypadki są odrzucane. Nie ma w tym nic specjalnego - dlatego prawdopodobnie jest on dłuższy niż mógł być.
Notatki
Rozmiar można prawdopodobnie nieco zmniejszyć przy pewnej restrukturyzacji, ale poświęciłem na to wystarczająco dużo czasu na dziś. Wersja ręcznie golfowa była skompresowana.
Kompresja gzip sprawia, że gra w golfa jest interesująca, ponieważ pewne buforowanie (np.
d=(-1,0,1)
) Faktycznie zajmuje więcej miejsca niż pozwalanie na to algorytmowi kompresji. Jednak zdecydowałem się na grę w golfa w wersji ręcznej, o ile to możliwe, zamiast optymalizować kompresję.Gra w golfa ręcznie (
909895840803):Pełna nie golfa (2488):
źródło
0
jako cyfra? Co powiesz na zamieniające się zamówienia, które2
pojawią się wcześniej1
itp..isdigit()
, co jest efektywnie równoważne z wyrażeniem regularnym,[0-9]
o ile wiem. Czy to zgodne z twoją specyfikacją? Co rozumiesz przez zamienianie zamówień? Sposób, w jaki jest zaimplementowany, będzie najpierw kierował się ku odgałęzieniu dowolnej bramki logicznej, ale nie ma gwarancji kolejności wprowadzania danych.isdigit()
jest spójny. Zamieniane porządkowanie oznacza coś takiego2
jak pierwsze wejście i1
drugie wejście (posortowane pionowo).Java:
15231512 znakówDaje to wynik dla przykładowego wejścia:
Aby wycisnąć jego rozmiar:
r
bez rozszerzenia nazwy.Jestem pewien, że powinno być możliwe jej ograniczenie, ale tylko odrobinę.
Tłumacz jest zaimplementowany w postaci pewnego rodzaju automatów komórkowych. Skanuje całe wartości ustawień pola, powtarzając je tyle razy, ile potrzeba, dopóki nie zostaną wykryte żadne zmiany.
Oto wersja bez golfa:
źródło
try{}catch(Exception e){}
niż dwathrows Exception
. Prawdopodobnie są inne rzeczy, ale nie mam pojęcia, jak grać w golfa Java.