Ihre Herausforderung besteht darin, einen Schaltplan mit Logikgattern zu interpretieren.
Logikgatter (Sie müssen eigentlich nicht wissen, was diese tun / sind, um diese Herausforderung abzuschließen):
- und Tor:
a
- oder Tor:
o
- und Tor:
A
- noch Tor:
O
- xor gate:
x
- xnor gate:
X
- nicht Tor:
~
Jedes Tor außer dem letzten hat zwei Eingänge. Die Eingänge befinden sich .
in der oberen linken und unteren linken Ecke des 3 x 3-Quadrats, zentriert auf dem Tor. Für nicht, ist der Eingang direkt auf der linken Seite. Die Ausgabe erfolgt .
direkt nach rechts.
Drähte werden durch dargestellt -|\/.=
-
kontaktiert zwei Drähte, einen rechts und einen links:c-c
|
kontaktiert zwei Drähte, einen oben und einen unten:c | c
/
und\
arbeite wie folgt:c c \ / c c
.
kontaktiert jeden umgebenden Draht:ccc c.c ccc
=
ist speziell; es verbindet benachbarte Drähte darüber:-=-
verbindet die beiden Drähte. Im Folgenden
\|/ -=- /|\
Jeder gegenüberliegende Draht ist miteinander verbunden, aber nicht die anderen (hier unterscheidet er sich von den anderen
.
).- Damit der Strom fließt, müssen zwei Drähte mit dem anderen verbunden sein, damit kein
|-
Strom fließt.
Verdrahtungsbeispiel:
.-.
= \
.--. .---=---
-. = .--
.--. .-------
Der Eingang ist in zwei Drähte und dann in drei aufgeteilt. Bei dieser Aufteilung bewegt sich der untere Draht in die Mitte, und die Aufteilung des oberen Drahtes nach unten wird unten angezeigt. Als nächstes wird die Oberseite der drei Drähte in die Mitte verschoben.
Beispielverdrahtung mit Toren:
--.
o..~..
--. o.---
a.---.
--.
Eingabeformat:
- Jedes Eingangskabel ist mit einer Ziffer gekennzeichnet. Am Ende (direkt vor dem Zeilenumbruch) wird jeder Ausgang mit
:
(und der Draht geht immer direkt hinein, dh-:
oder.:
oder=:
) gekennzeichnet. - Die Eingabe ist immer gültig. Es gibt keine Schleifen oder Drähte, die sich ohne Tor verbinden. Beachten Sie, dass es Drähte mit losen Enden geben kann.
=
wird nur bei Bedarf verwendet.
Ausgabeformat:
- Jeder Eingang wird mit der entsprechenden Nummer referenziert.
- ein Ausdruck wird ausgegeben. Wenn die Drähte beispielsweise Eingang 1 und Eingang 2 berechnen, lautet der Ausgang
1a2
. - Alle ausgegebenen Funktionen müssen den Logikgattern am Anfang entsprechen.
- um das nicht zu zeigen, stelle die
~
vor die richtige stelle . Verwenden Sie für mehrere Funktionen Klammern, um die Ausführungsreihenfolge anzuzeigen. Klammern können auch verwendet werden, wenn nur eine Funktion vorhanden ist. Beispielsweise,
1-.~.-. A.~.-: . 2-. / x. 3-.
hat eine mögliche Ausgabe von
~((2x3)A(~1))
- mehrere Ausgaben müssen durch einen Zeilenumbruch (oder ein gleichwertiges Zeichen) getrennt werden
Beispieleingabe:
1--.---.
x. \
2--. x.-=---------.
. .~. X.--.
3---. . a.----. /
O.~.-. \ /
. =
4-. / / .-:
X. .----:
5-.
Ein möglicher entsprechender Ausgang:
(~1)a(~(3O(4X5))
((1x2)x3)X((~1)a(~(3O(4X5))))
Antworten:
Python
24881567806706697657653Yay für gzip + exec!
Einschränkungen und Annahmen
Momentan werden nur bis zu 9 Eingaben unterstützt - Mehrfachziffern werden nicht korrekt verarbeitet. Da die Spezifikation angibt, dass Eingaben mit einer Ziffer und nicht mit einer Zahl gekennzeichnet sind , ist dies zulässig.
Ein- und Ausgabe
Die Eingabe erfolgt über den Standardeingang und die Ausgabe über den Standardausgang.
Testen
Probenein- und ausgabe:
Hier getestet: http://ideone.com/gP4CIq
Der Algorithmus
Es ist im Grunde eine ziemlich naive DFS von den Ausgängen. Für jede Ausgabe beginnt sie mit dem Zeichen eins links von ihr und folgt der Leitung, wobei an jedem Gatter eine Verzweigung erfolgt (und der Ausdruck hinzugefügt wird). Wenn es eine Eingabe erreicht, fügt es sie dem Ausdruck hinzu und geht zum letzten Verzweigungspunkt zurück, da wir sicher sein können, dass eine Verzweigung ohne ein Gatter nicht möglich ist. Und natürlich werden ungültige Fälle verworfen. Nichts wirklich Besonderes - und deshalb ist es wahrscheinlich länger, als es hätte sein können.
Anmerkungen
Die Größe könnte mit einigen Umstrukturierungen wahrscheinlich ein wenig reduziert werden, aber ich habe heute genug Zeit dafür aufgewendet. Die manuell golfene Version war die komprimierte.
Die gzip-Komprimierung macht das Golfen interessant, weil bestimmte Caching-Vorgänge (z. B.
d=(-1,0,1)
) tatsächlich mehr Platz beanspruchen, als der Komprimierungsalgorithmus dafür sorgen würde. Ich entschied mich jedoch dafür, die manuelle Version so weit wie möglich zu spielen, anstatt die Komprimierung zu optimieren.Manuelles Golfen (
909895840803):Voll ungolfed (2488):
quelle
0
einer Ziffer? Wie wäre es mit einer getauschten Bestellung, die früher2
kommt1
, usw..isdigit()
, was meiner Meinung nach praktisch dem regulären Ausdruck entspricht[0-9]
. Stimmt das mit Ihrer Spezifikation überein? Was meinen Sie mit getauschten Bestellungen? So wie es implementiert ist, wird es zuerst in den Aufwärtszweig eines logischen Gatters geleitet, aber es gibt keine Garantie für die Reihenfolge der Eingänge.isdigit()
ist konsistent. Vertauschte Reihenfolge bedeutet so etwas wie2
die erste Eingabe und1
die zweite Eingabe (vertikal sortiert).Java:
15231512 ZeichenEs gibt diese Ausgabe für die Beispieleingabe:
Um seine Größe zusammenzudrücken:
r
ohne Dateierweiterung im Namen aufgerufen werden .Ich bin mir sicher, dass es möglich sein sollte, es weiter zu reduzieren, aber nur ein bisschen.
Der Interpreter ist in Form einer Art zellularer Automaten implementiert. Es scannt die gesamten Feldeinstellungswerte und wiederholt sie so oft, bis keine Änderungen mehr festgestellt werden.
Hier ist eine ungolfed Version:
quelle
try{}catch(Exception e){}
als zweithrows Exception
. Es gibt wahrscheinlich andere Dinge, aber ich habe keine Ahnung, wie man Java spielt.