Prelude ist eine esoterische Programmiersprache, die nur sehr wenige, aber ungewöhnliche Einschränkungen für ein gültiges Programm aufweist. Jeder Block druckbaren ASCII-Textes ("Block" bedeutet, dass Zeilen druckbaren ASCII durch Zeilenumbrüche getrennt sind - 0x0A) ist gültig, sofern:
- Jede (vertikale) Textspalte enthält höchstens eine von
(
und)
. - Wenn man ihre vertikale Position ignoriert, sind die
(
und)
ausgeglichen, das heißt, jede(
ist mit genau einer)
rechts davon gepaart und umgekehrt.
Schreiben Sie ein Programm oder eine Funktion, die anhand einer Zeichenfolge mit druckbarem ASCII und Zeilenumbrüchen bestimmt, ob es sich um ein gültiges Prelude-Programm handelt. Sie können Eingaben über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen. Das Ergebnis kann unter Verwendung von zwei festen Wahrheits- / Falschwerten Ihrer Wahl an STDOUT zurückgegeben oder gedruckt werden .
Sie dürfen nicht davon ausgehen, dass die Eingabe rechteckig ist.
Dies ist Code Golf, daher gewinnt die kürzeste Übermittlung (in Bytes).
Beispiele
Die folgenden sind gültige Prelude-Programme (tatsächlich sind sie sogar echte Prelude-Programme):
?1-(v #1)-
1 0v ^(# 0)(1+0)#)!
(#) ^#1-(0 #
1(# 1) v # - 1+)
vv (##^v^+
? v-(0 # ^ #)
?
1+ 1-!
Und hier sind einige Eingaben, die alle ungültig sind :
#(#(##)##)##(
)##(##(##)#)#
#(#)
)###
#(##
(##)
(##)
(#)#
(##)
(###
#(#)
(##)
#(#)
###)
#()#
()##
#(#)##
###
###(#)
quelle
)
und 2(
. Sollte es nicht nur 1 pro Zeile sein?Antworten:
CJam,
5756 BytesZu lange kann viel Golf gespielt werden. Erklärung, die hinzugefügt werden muss, sobald ich Golf spiele.
Kurze Erklärung
Der Code enthält zwei Überprüfungen:
Number of "(" - Number of ")"
sollte sich ( ) gegenseitig ergänzen. Wenn Sie sie addieren, sollte dies zu 0 führen. Jeder Teil, der diese Eigenschaft nicht erfüllt, führt dazu, dass die gesamte Eingabe nicht übereinstimmende Klammern enthält.Number of "(" - Number of ")"
für den rechten Seitenblock nicht negativ sein kann.Probieren Sie es hier online aus
quelle
Python 2,
128119105 BytesWussten Sie, dass Sie None in Python 2 zuordnen können?
Erläuterung
Wir möchten zunächst das Prelude so transponieren, dass Spalten zu Zeilen werden. Normalerweise würden wir dies mit tun
zip
, aber da eszip
auf die kürzeste Reihenlänge gekürzt wird unditertools.zip_longest
viel zu lang für Code-Golf ist, scheint es keinen kurzen Weg zu geben, das zu tun, was wir wollen ...Mit Ausnahme der Zuordnung
None
:Leider (oder besser gesagt, zum Glück für alle Nicht-Golf-Zwecke) funktioniert dies nur in Python 2.
Wie für
n
undv
:n
wirkt wie ein Stapel und zählt1 - <number of unmatched '(' remaining>
. Für jedes, was(
wir sehen, subtrahieren wir 1 und für jedes, was)
wir sehen, addieren wir 1. Wenn wir alson >= 2
zu irgendeinem Zeitpunkt zu viele)
s gesehen haben und das Programm ungültig ist. Wennn
es nicht mit 1 endet, haben wir noch mindestens eine unübertroffene(
.v
prüft die Gültigkeit und beginnt bei 1. Wenn das Programm jemals ungültig ist (n >= 2
oderA+B >= 2
),v
wird es 0, um die Ungültigkeit zu markieren.Wenn also das Programm gültig ist, müssen wir es am Ende haben
n = 1, v = 1
. Wenn das Programm ungültig ist, müssen wir am Ende entwederv = 0
oder habenv = 1, n <= 0
. Daher kann die Gültigkeit kurz ausgedrückt werden alsn*v>0
.(Danke an @feersum für eine Vielzahl guter Vorschläge, die 14 Bytes entfernt haben!)
Vorherige, besser lesbare Einreichung:
quelle
map
...def F(p): v=n=3 for r in map(None,*p.split("\n")):A,B=map(R.count,"()");n+=A-B;v*=n>2>A+B return n*v==9
or
in Vergleich Verkettungs, aber ich dachte nicht , ändert|=
in*=
. Nahm ein weiteres Byte obwohl ab, durch die Dinge selbst zu machen mehr zurück :)J, 64 Bytes
Die Eingabe ist eine Zeichenfolge mit einem nachgestellten Zeilenumbruch. Die Ausgabe ist 0 oder 1.
Anwendungsbeispiel
Die Methode ist die folgende
];.2
(
/)
/anything else
in1
/-1
/0
1 _1 0{~[:'()'&i.]
s=.+/@:
Adverb, das einem Verb hinzugefügt wird und die Ausgabe des Verbenarrays summiertWerte in Spalten hinzufügen
]s
()
Gleichgewicht in jedem Präfix[:(0>])s)[:+/\]
()
Gleichgewicht in der gesamten Liste (dh im letzten Präfix).|@{:@]
Fügen Sie abs (Werte) in Spalten hinzu und überprüfen Sie jedes Element auf einen Maximalwert von 1
(1<|s)s
Da alle vorherigen Überprüfungen bei einem Fehler positiv waren, addieren wir sie und vergleichen sie mit 0, um die Gültigkeit der Eingabe zu erhalten
0=]
quelle
J, 56 Bytes
Dies ist eine anonyme Funktion, die eine Zeichenfolge mit einem nachgestellten Zeilenumbruch akzeptiert und 0 oder 1 zurückgibt. Lesen von rechts nach links:
];.2 y
schneidet, wie in der anderen J-Übermittlung, die Zeichenfolgey
bei allen Vorkommen ihres letzten Zeichens (weshalb die Eingabe eine nachgestellte neue Zeile benötigt) und erstellt eine rechteckige Matrix, deren Zeilen die Teile sind, die bei Bedarf mit Leerzeichen aufgefüllt werden.'()'=/
vergleicht jedes Zeichen in dieser Matrix zuerst mit(
und dann mit der)
Rückgabe einer Liste von zwei 0-1-Matrizen.+.^:_1]0|:
verwandelt diese Liste von zwei Matrizen in eine einzige Matrix komplexer Zahlen. Bisher wandelt das Programm jedes(
in der Eingabe in eine 1, jedes)
in i und jedes andere Zeichen in 0 um.b=.+/
weist die Summe der Zeilen dieser komplexen Matrix zub
.-.|b
macht eine Liste von 1- | z | für jedes z inb
. Die Bedingung, dass jede Spalte höchstens eine einzige Klammer enthält, übersetzt sich in alle diese Zahlen 1- | z | nicht negativ sein.+/\*:b
ist der Vektor der laufenden Summen der Quadrate der Zahlen inb
. Wenn jede Spalte höchstens eine Klammer enthält, sind die Quadrate der Zahlen inb
0, 1 oder -1. Der,
verkettet diesen Vektor mit dem Vektor von 1- | z | 's.jetzt alle brauchen wir ist Test zu tun , dass die Einträge unseres verketteten Vektor
v
nicht negative reelle Zahlen Zahlen sind, ist dies fast*/0<:v
, mit der Ausnahme , dass die einen Fehler verursacht , wenn einige Einträgev
nicht real sind, so ersetzen wir<:
mit<: ::0:
dem zurück nur 0 im Fehlerfall .quelle
0={:+/\*:b
zB(
nicht gültig ist.0=(-|)v
ist 2 Bytes kürzer für die Überprüfung nicht negativer Realzahlen. (Lass uns CJam schlagen !: P)inv
anstatt ein^:_1
weiteres Byte zu speichern.3 :'*/0=({:,]-|)(-.@|,+/\@:*:)+/+.inv]0|:''()''=/];.2 y'
.