Fortsetzung dieser Herausforderung, weil der Autor weg ist und die Frage geschlossen ist.
Sie müssen lediglich einen booleschen Parser erstellen.
Boolesche Ausdrücke haben, falls Sie noch nichts davon gehört haben, zwei Eingänge und einen Ausgang.
In der Booleschen Arithmetik gibt es vier "Tore", nämlich:
- ODER (dargestellt durch
|
) (binärer Operator zwischen Argumenten) - UND (dargestellt durch
&
) (binärer Operator zwischen Argumenten) - XOR (dargestellt durch
^
) (binärer Operator zwischen Argumenten) - NICHT (dargestellt durch
!
) (unärer Operator, Argument rechts)
Diese Gatter arbeiten mit ihren Eingängen, die entweder wahr (dargestellt durch 1
) oder falsch (dargestellt durch 0
) sind. Wir können die möglichen Eingaben ( A
und B
in diesem Fall) und die Ausgaben ( O
) unter Verwendung einer Wahrheitstabelle wie folgt auflisten:
XOR
A|B|O
-----
0|0|0
0|1|1
1|0|1
1|1|0
OR
A|B|O
-----
0|0|0
0|1|1
1|0|1
1|1|1
AND
A|B|O
-----
0|0|0
0|1|0
1|0|0
1|1|1
NOT
A|O
---
0|1
1|0
Eine Beispieleingabe wäre 1^((1|0&0)^!(1&!0&1))
, die Folgendes auswerten würde:
1^((1|0&0)^!(1&!0&1))
=1^(( 1 &0)^!(1&!0&1))
=1^( 0 ^!(1&!0&1))
=1^( 0 ^!(1& 1&1))
=1^( 0 ^!( 1 &1))
=1^( 0 ^! 1 )
=1^( 0 ^ 0 )
=1^0
=1
Die Ausgabe wäre 1
.
Einzelheiten
- Wie im Beispiel zu sehen ist, gibt es keine Reihenfolge der Prävalenz. Alle werden von links nach rechts ausgewertet, außer in Klammern, die zuerst ausgewertet werden sollten.
- Die Eingabe enthält nur
()!^&|01
. - Sie können ein beliebiges 8-Byte-Zeichen auswählen, um die oben genannten 8 Zeichen zu ersetzen. Sie müssen jedoch eine 1-zu-1-Zuordnung aufweisen und angegeben werden.
- Insbesondere
eval
darf die Funktion nicht für Zeichenfolgen verwendet werden, die von der Eingabe abgeleitet wurden . Insbesondere können die Funktioninput
(oder das Äquivalent in der Sprache) und jede Funktion, die sie aufruft, nicht von verwendet werdeneval
. Sie können das auch nichtinput
in Ihre Zeichenfolge innerhalb der verketteneval
.
Wertung
Das ist Code-Golf . Die kürzeste Lösung in Bytes gewinnt.
code-golf
parsing
logic-gates
Undichte Nonne
quelle
quelle
Antworten:
JavaScript (ES6) 116 Bytes
edit thx @ user81655 für 3 Bytes gespeichert und ein Fehler gefunden
Wahrscheinlich nicht der beste Ansatz, aber keine Eval- und Booleschen Operatoren, nur Wahrheitstabellen.
Verwendeter Charakter:
Prüfung
quelle
x>7
?r=f(x.replace(/./g,c=>"01!&|^()".indexOf(c)))
0|!0
gebraucht , um herauszufinden, warum (sagen wir) funktioniert, aber jetzt habe ich meine Gegenstimme.Netzhaut, 49 Bytes
Ich habe keine Ahnung, wie es so kurz gekommen ist.
Zeichenzuordnung:
1
,0
Und!
bleiben unverändert.Dies funktioniert , indem alle truthy Ausdrücke ersetzt (single
1
in Klammern!0
,1&1
,1^0
,0|1
, etc.) mit1
, und alle anderen (Single0
in Klammern!1
,1&0
,1^1
,0|0
, etc.) mit0
.Probieren Sie es online aus!
Probieren Sie es online mit automatischer Zeichenzuordnung!
quelle
grep + shell utils, 131 bytes
Die folgenden Zeichen werden umbenannt:
Ich habe versucht, eine grep-Lösung zu schreiben, habe jedoch festgestellt, dass sie mit den linksassoziativen Infix-Operatoren nicht gut funktioniert. Ich brauchte ein Muster wie (Kette von Operatoren) = (Kette von Operatoren) (binäre Operation) (einzelner Operand), aber dieses enthält eine mögliche unendliche Rekursion, daher weigert sich grep, es auszuführen. Aber ich bemerkte, dass ich rechtsassoziative Operatoren analysieren konnte . Dies machte dem
!
Bediener Schmerzen, aber es war immer noch möglich. Also habe ich einen regulären Ausdruck für die Berechnung rückwärts gerichteter boolescher Ausdrücke erstellt und die Eingabe durchgeschicktrev
. Der reguläre Ausdruck selbst, der den wahren Ausdrücken entspricht, beträgt 116 Byte.TODO: Wählen Sie verschiedene Zeichen für die Eingabe aus, damit ich alle verwendeten Gruppen von Operatoren mit integrierten Zeichenklassen unterscheiden kann.
quelle
(?9)
das\9
würde dies bedeuten, dass sie mit der 9. Erfassungsgruppe übereinstimmt). So(\d)\1
stimmt beispielsweise dieselbe Ziffer zweimal(\d)(\?1)
überein , während zwei Ziffern übereinstimmen.Python, 210 Bytes
Wirklich schlechter rekursiver Abstieg, ich erwarte, dass dies sofort geschlagen wird.
quelle
Mathematica,
139129 BytesEine einfache Lösung zum Ersetzen von Saiten schneidet weitaus besser ab, als ich es mir erhofft hatte.
quelle
JavaScript ES6, 223 Bytes
Verwendet einen Rangierplatzalgorithmus.
Verwendet
+
für OR,!
für Negation,^
für XOR und&
für und.0
und1
werden für ihre jeweiligen Werte verwendet. Sicher, ich könnte ein bisschen Golf spielen, indem ich die Betreibernummern mache, aber ich gewinne den JavaScript-Preis nicht, selbst wenn ich das tue, also dachte ich, ich würde es zumindest etwas lesbar und korrekt machen.quelle
C 247
Golf:
Ungolfed, mit
main()
(nimmt Ausdruck als 1. Argument). Die Golfversion hat keine Debugging-Drucke und verwendet zweistellige ASCII-Codes anstelle von Zeichenliteralen (40 == '('
). Ich hätte einige Zeichen durch Zuordnung()|^&!
zu speichern können234567
- dies hätte viele Manipulationen und Tests nach dem Subtrahieren48
von jedem einfacher gemacht .quelle
for(j=i=1;i+=s[++j]==')'?-1:s[j]=='('?1:0,i;);
.Java, 459 Bytes
AND
ist&
OR
istl
(Kleinbuchstabe L)XOR
istx
(oder eine andere Figur , die schön zu spielen geschiehtString
‚s Methoden wieString.replaceAll(...)
)NOT
ist!
(
ista
)
istb
Hier ist eine besser lesbare Version:
Probieren Sie es online aus
quelle
Java, 218
Verwendet Pattern Matching, vermeidet jedoch das Ersetzen meines vorherigen fehlgeschlagenen Java-Versuchs (scharfe Augen, @Kenny Lau !).
Golf:
Ungolfed, liest Eingaben von Argumenten und wendet das Mapping
oaxn
für|&^!
und<>
für an()
:Java
m.group(i)
sagt Ihnen, welche Gruppe übereinstimmt; Die erste Gruppe ist für wahre Substitutionen und die zweite für falsche. Dies wird in strikter Reihenfolge von links nach rechts wiederholt, bis keine Substitutionen mehr durchgeführt werden.quelle