Betrachten wir eine Grammatik über dem Alphabet { 0
, 1
, ?
, :
} durch die definierte Produktionsregel
s →
0
┃1
┃0
?
s:
s ┃1
?
s:
s
Analysieren Sie einen aus s generierten String als Ausdruck, bei dem es sich um einen rechtsassoziativen Ausdruck ?:
handelt (z. B. a?B?X:Y:c?d:e?f:g
Mittelwert a?(B?X:Y):(c?d:(e?f:g))
), und werten Sie ihn mit der folgenden Semantik aus:
eval(0) = 0
eval(1) = 1
eval(0?a:b) = eval(b)
eval(1?a:b) = eval(a)
Wenn das Ergebnis 0 ist , geben Sie einen festen Wert aus. Wenn der Ausgang 1 ist , wird ein anderer fester Wert ausgegeben. Geben Sie in Ihrer Antwort die von Ihnen gewählten Ausgabewerte (z. B. 0
/ 1
oder False
/ True
) an.
Testfälle
0 -> 0
1 -> 1
0?0:1 -> 1
0?1:0 -> 0
1?0:1 -> 0
1?1:0 -> 1
0?1?0:1:1 -> 1
1?0?1:1:1 -> 1
1?0:1?0:1?1:1 -> 0
1?1?1:0?1?0:0:0:0 -> 1
1?0:1?0?1:1?1:0:1?1?1:1:1?0:1 -> 0
1?1?1:0?0?1:1:0?1:0:1?1?0?0:0:1?1:0:0?1?0:1:1?0:1 -> 1
0?0?1?0?0:1:0?0:0:0?0?1:1:1?0:1:0?0?0?1:0:0?1:1:1?1?0:1:1 -> 0
Regeln
- In einigen Programmiersprachen (z. B. JavaScript / Perl / Ruby / Python's
eval
) dürfen keine integrierten Sprachen verwendet werden, die Zeichenfolgen als Code interpretieren und ausführen . - Dies vorausgeschickt , ist der Code nicht tatsächlich zu parsen und dann bewertet die Eingabezeichenfolge. Sie können jeden Ansatz wählen, um gleichwertige Ergebnisse zu erzielen, und verstoßen nicht gegen die vorherige Regel.
- Ihr Programm wird gegen geprüft
perl -le 'print eval<>'
. - Der kürzeste Code (in Bytes) gewinnt.
S → T | T ? S : S
,T → 0 | 1
die Notwendigkeit zu entfernen über Assoziativität zu sprechen?Antworten:
GolfScript, 21 Bytes
Dies gibt
0
oder aus1
. Es wird angenommen, dass die Eingabe eine einzelne nachgestellte Newline enthält. Die Verwendung von~
(die Zeichenfolgen auswertet) würde ein Byte speichern:Dies basiert auf http://golf.shinh.org/reveal.rb?The+B+Programming+Language/tails_1462638030&gs .
quelle
Netzhaut , 23 Bytes
Probieren Sie es online! (Die erste Zeile aktiviert eine durch Zeilenvorschub getrennte Testsuite.)
Erläuterung
Es ist eigentlich ziemlich einfach. Die Eingabe wird durch wiederholtes (
+
) Auswerten von Ternären, die nur Literale enthalten, auf das Ergebnis reduziert . Um sicherzustellen, dass dies rechtsassoziativ erfolgt, suchen wir nach Übereinstimmungen von rechts nach links (r
) und ersetzen nur die zuletzt gefundene Übereinstimmung (-1=
).Die Regex selbst passt zu
0\?.:
und entfernt sie (lässt nur das Zeug danach:
) oder1\?.:.
ersetzt sie durch den Wert nach dem?
.quelle
1
st-Match anstelle des-1
st verarbeiten?Haskell,
106 101 100 9083 BytesDies hängt stark von den Pattern-Matching-Fähigkeiten von Haskell ab. Zuallererst kehren wir die Zeichenfolge um, sodass wir nur nach dem ersten Vorkommen von
b:a?x
(das normalerweise so lautetx?a:b
) suchen und es durch seinen Wert ersetzen können. Dies sorgt automatisch für die richtige Assoziativität . Hier verwenden wirx:xs
Muster. Dies ist, was die Funktionf
tut. Dann wenden wir uns grundsätzlich immer wiederf
auf die Ausgabe an, bis wir eine einzelne Zahl (0 oder 1) übrig haben.Danke @Lynn für 12 Bytes!
quelle
Brainfuck,
826463 BytesDie Ausgabe ist
\xff
für0
und\x00
für1
. Die Brainfuck-Implementierung muss es ermöglichen, nach links von der Startzelle zu gehen.Dies verwendet im Wesentlichen den gleichen Ansatz wie die Python- Antwort von xsot , aber die Verzweigung ist im Vergleich zu meiner ursprünglichen 82-Byte- Übermittlung wahrscheinlich schwerer nachzuvollziehen:
(Bei dieser Lösung ist die Ausgabe
\xfe
für0
und\xff
für1
und eine größere Kompatibilität wird erreicht, wenn die Eingabe mit einem Zeilenumbruch endet.)Wenn Sie sich nicht die Mühe machen müssen, die xsot-Lösung zu analysieren, lautet die Idee: Gehen Sie von links nach rechts vor. Wenn Sie sehen,
1?
dann verwerfen Sie es gierig. Wenn Sie0?
dann sehen, verwerfen Sie alles zwischen diesem und dem entsprechenden:
. Wenn?
das zweite Zeichen nicht angezeigt wird, beenden Sie die Schleife und drucken Sie das erste Zeichen der verbleibenden Zeichenfolge.Die 82-Byte-Lösung spiegelt dieses Schema also ziemlich genau wider. Die innere Schleife
0?
wird wie die innere Schleife von xsot behandelt. Es wird mit größter Sorgfalt vorgegangen, um in die Hauptschleife einzutreten, ohne die eingegebenen Zeichen zu überprüfen. dh wir wollen überprüfen, ob das zweite Zeichen?
nur einmal am Ende der Hauptschleife und nicht auch am Anfang ist, bevor wir in die Hauptschleife eintreten.Die 63-Byte-Lösung kombiniert im Wesentlichen die inneren und äußeren Schleifen zu einer, was ich aufgrund der Ähnlichkeit zwischen diesen Schleifen für möglich hielt. Das Speicherlayout in der Hauptschleife könnte wie folgt beschrieben werden:
Dabei
[x]
bedeutet "Aktuelle Zelle": Ders
Wert beginnt als Dummy-Wert ungleich Null, der lediglich angibt, dass wir noch eine Schleife ausführen, und wird sofort mit einem Eingabezeichen (entweder0
oder1
) überschrieben . Died
Zelle enthält die (negative) Tiefe, falls wir uns in der Mitte von a befinden0?
, ansonsten0
. Dasc
wird entweder?
oder:
oder Newline oder EOF sein.Nach der Aktualisierung von
s
und behandelnc
wir den0?
Fall, indem wir ihnd
entsprechend aktualisieren und den Zeiger anpassen. Andernfalls verwenden wir den aktuellen Wert vonc
als den Wert vond
in der nächsten Iteration oder stoppen, wenn wir fertig sind.quelle
Python 2,
76747372 BytesBei Eingabe als String-Literal zu vermeiden
raw_
.Die Ausgabe erfolgt
0
oder1
gefolgt von<built-in function id>
.quelle
3>>int(c)
`id`
Trick ...! Gut gemacht :)Python 2, 89 Bytes
Die Eingabe wird als Zeichenfolgenliteral interpretiert.
quelle
Schmutz ,
3431 BytesDrucke
1
für truthy Eingänge und0
für falsy diejenigen. Probieren Sie es online! Der letzte Testfall hat leider nicht genügend Speicher auf TIO.Erläuterung
Die richtige Assoziativität bedeutet im Wesentlichen, dass in
a?b:c
,a
immer entweder0
oder ist1
nie ein längerer Ausdruck ist. Ich werde einfach rekursiv ein Muster definieren, das einem solchen wahrheitsgemäßen Ausdruck entspricht, und die Eingabe mit diesem vergleichen. Es ist auch unnötig zu überprüfen, ob alle:
wirklich a sind:
, wenn?
alle s markiert sind: Es gibt eine gleiche Anzahl von?
s und:
s in der Eingabe, und wenn einige?
fälschlicherweise als a klassifiziert sind , stimmen:
die entsprechenden:
Werte nicht überein und die Übereinstimmung mit Grime Motor fährt zurück.quelle
Haskell,
79 71 70 62 6056 BytesEdit: Danke an @Zgarb für 3 Bytes und an @nimi für 4 Bytes!
Dies ist ein rekursiver Ansatz
, der die Ausgaberegel "einige feste Werte" wenig missbraucht. Edit: Das Entfernen der Tupel spart nicht nur 8 Bytes, sondern liefert auch eine schönere Ausgabe:"0"
oder"1"
.Ungolfed-Version:
Wie funktioniert es?
Die
eval
Funktion durchläuft den impliziten Baum der Ausdrückeund gibt ein Tupel des Formulars zurück
(result, rest)
.Das erste Muster
(x:'?':r1)
passtx
zu'1'
undr1
zu"0?0:1:0?1:0"
. Rekursives Anwendeneval
aufr1
wertet den Unterausdruck aus0?0:1
und gibt ihn zurück(0,":0?1:0")
. Das Anpassen an das Muster(a,':':r2)
ergibta=0
undr2=0?1:0
. Diese Unterformel wird auch rekursiv ausgewertet, so dassb='0'
undr3=""
. Überprüfen Sie, obx
ist'1'
oder'0'
und Rückkehr entweder(a, r3)
oder(b, r3)
.quelle
x>'0'
anstelle von arbeitenx=='1'
?':'
durch_
.:
. Danke noch einmal!if .. then .. else
mit ersetzenlast$e s:[a:tail(e s)|x>'0']
.JavaScript (ES6), 53 Byte
Gibt
0
oder1
für eine gültige Eingabe zurück; hängt bei ungültiger Eingabe Erläuterung: Da das Umkehren eines Strings in JavaScript umständlich ist, wurde bei meinem ersten 71-Byte-Versuch ein negativer Lookahead für a verwendet,?
der ansonsten die Assoziativität stören würde:Da dies etwas lang war, fragte ich mich, ob ich die Dinge verbessern könnte, indem ich die Entscheidungsfindung in den regulären Ausdruck einbeziehe. Wie sich herausstellte, war es kein sofortiger Erfolg, da es auch 71 Bytes dauerte:
Dann fiel mir ein, dass
0?0:
und0?1:
sind immer no-ops, ohne Sorge um die Assoziativität. Das hat mir fast 25% gespart.quelle
f=
. Ich habe nicht geprüft, ob Ihre Byteanzahl dies berücksichtigt oder nicht.Perl, 32 + 1 (
-p
Flag) = 33 BytesVoller Dank an @Mitch Swartch , da seine Lösung 14 Byte kürzer war als meine!
Danke auch an @Neil, der eine Lösung vorgeschlagen hat, die 1 Byte länger ist als Mitch.
Benötigt
-p
Flagge, sowie-M5.010
oder-E
zu laufen. Zum Beispiel :Erklärungen : Es reduziert im Grunde genommen die Blöcke von
a?b:c
(beginnend vom Ende, um sicher zu gehen, dass nichts?
folgt) inb
oderc
abhängig von der Wahrheit vona
, immer und immer wieder, bis der String nur noch1
oder enthält0
.quelle
-
nicht zu deiner Punktzahl? Hrm. Interessant ... Gute Antwort!perl -e '<code>'
hinzufügen, derp
nur 1 Byte kostetperl -pe '<code>'
.?
, ich konnte das auf diese Weise auf 34 Bytes reduzieren.s/.*\K(1\?(.)..|0\?..)/\2/&&redo
Python 3,
9369 BytesEingabe ist die Zeichenfolge als Liste von Zeichen, Ausgabe ist entweder
"0"
oder"1"
Ungolfed-Version:
Noch ein Versuch, aber mit deutlich mehr Bytes:
quelle
def f(s):x=s.pop(0);return[]<s<s.pop(0)>'>'and(f(s),f(s))[x<'1']or x
, und für Python 3 mit geringem Bearbeitungsabstand zu Ihrem gibt es ihndef f(s):z=s.pop;r=z(0);return s and':'<z(0)and(f(s),f(s))[r<'1']or r
.SED,
75 74 68(40 + 1 für -r) 41quelle
(.*)
einen zusätzlichen Ersatzbegriff und hinzufügen müssen.\3
statt\2
. Sie können auch die Zeilen mit verbinden;
, um zu erhalten:;s/(.*)(1\?(.):.|0\?.:)/\1\3/;t
.\3
also das heißt ich habe versehentlich eine Vorgängerversion kopiert. Ich kenne mich mit Semikolons aus. Aber igitt, warum solltest du Semikolons verwenden?Bash + GNU-Dienstprogramme, 42
Eine ähnliche Idee wie bei den meisten anderen Mustervergleichsantworten.
Ideone .
quelle
0
Fall, dass Sie 5 Bytes sparen, müssen Sie das erste Zeichen nicht erfassen .