Schreiben Sie Code, um zu bewerten, ob eine Kette von Ungleichungen wahr oder falsch ist. Eine Beispieleingabe ist die Zeichenfolge
3<=4!=9>3==3
Dies ist wahr, weil jede seiner Komponenten wahr ist:
(3<=4) and (4!=9) and (9>3) and (3==3)
Eingang:
Eine Zeichenfolge, die eine Kette aus einer oder mehreren Ungleichungen darstellt. Die zulässigen Vergleichsoperatoren sind
== equals
!= does not equal
> is greater than
>= is greater than or equal to
< is less than
<= is less than or equal to
Die zulässigen Zahlen sind einstellige Zahlen 0
bis 9
. Es werden keine Leerzeichen, Klammern oder andere Symbole angezeigt.
Ausgabe:
Die Richtigkeit der Ungleichung als konsistenter Wahrheits- oder Falschwert . Konsistent bedeutet, dass jede Ausgabe von Truthy gleich ist und jede Ausgabe von Falsey gleich ist.
Beschränkung:
Ziel dieser Herausforderung ist es, Code zu schreiben, der die Ungleichungen verarbeitet, anstatt sie als Code auszuwerten, selbst für eine einzelne Ungleichung in der Kette. Aus diesem Grund sind Methoden wie Python's eval
und solche, exec
die Code auswerten oder ausführen, verboten. Dies gilt auch für Funktionen, die eine Methode oder einen Operator als Zeichenfolge nachschlagen. Es ist auch nicht gestattet, Prozesse oder Programme zu starten, um die Evaluierung für Sie durchzuführen.
Testfälle:
3<=4!=9>3==3
True
3<=4!=4
False
5>5
False
8==8<9>0!=2>=1
True
Antworten:
Rubin, 71 + 1 = 72
-n
Führen Sie mit dem Befehlszeilenflag ausGeneriert alle möglichen fehlgeschlagenen regulären Ausdrücke und überprüft, ob die Eingabezeichenfolge mit einer von ihnen übereinstimmt. Ausgänge,
true
wenn keine, sonstfalse
. Übernimmt die Eingabe über STDIN, getrennt durch Zeilenumbrüche.Tricks:
a<=>b
, der -1,0 oder 1 für kleiner, gleich oder größer zurückgibt. Diese werden auf verschiedene Elemente eines Arrays mit drei Zeichenfolgen aufgeteilt und finden den regulären Ausdruck für Vergleiche, die nicht übereinstimmen.quelle
Perl, 82
Gibt 1 aus, wenn true, und eine leere Zeile, wenn false, da die leere Zeichenfolge Perls Haupt-Falsey-Wert ist.
Die while-Schleife geht über die Zeichenfolge, die dem regulären Ausdruck entspricht
\d(.)(=?)
. Dann entsprechen die Variablen$1
und$2
den Zeichen des Operators und die Sondervariablen$&
und$'
verhalten sich wie die beiden Operanden in einem numerischen Kontext. Die Operanden werden verglichen<=>
und das Ergebnis mit dem ersten Zeichen des Operators abgeglichen. Dann wird speziell auf Gleichheit und Ungleichheit eingegangen.quelle
CJam, 60 Bytes
Dieser Code scheint ein bisschen hässlich und möglicherweise nicht vollständig optimiert zu sein, aber er ist der beste, den ich bisher habe.
Probieren Sie es online aus.
Erläuterung
quelle
JavaScript (ES6) 110
116Einfach: Scan-Zeichenfolge, c ist die aktuelle Ziffer, l ist die letzte Ziffer, o ist der Operator.
Test In der Firefox / FireBug-Konsole
quelle
Haskell, 156 Bytes
Anwendungsbeispiel:
Ungolfed-Version:
eval
Es werden zwei Argumente verwendet: Der zu analysierende String (der immer mit einem Vergleichsoperator beginnt) und eine Zahl,i
die das linke Argument für den Vergleich ist (und in der vorherigen Runde das rechte Argument war). Der Operator wird zurückgegeben,lookup2
wenn es sich um einen zweistelligen Operator handelt (überprüfen Sie nur das erste Zeichen, da das zweite immer ist=
) undlookup1
wenn es sich nur um ein einzelnes Zeichen handelt.eval
ruft sich rekursiv auf und kombiniert alle Rückgabewerte mit logischem und&&
.quelle
Gemeines Lisp -
300185169165Beispiel
Erläuterung
ppcre:split
Splits auf Ziffern; beispielsweise:Beachten Sie die erste leere Zeichenfolge, die mit verworfen wird
cdr
Die Zuordnung
read-from-string
zu dieser Liste ruft dieread
Funktion für jede Zeichenfolge auf, die Symbole und Zahlen zurückgibt.loop for (a op b) on '(3 < 5 > 2) by #'cddr
die Liste iteriert durch einen Schritt 2 , und somit gebundena
,op
undb
wie folgt für jeden aufeinanderfolgenden Durchlauf.always
prüft, ob der nächste Ausdruck immer wahr ist: entweder der Operator istnil
(so) oder das Ergebnis des Vergleichs gilt (so).das
case
wählt eine Common-Lisp-Vergleichsfunktion gemäß dem zuvor gelesenen Symbol aus; da einige Operatoren in Lisp und der angegebenen Sprache identisch sind, können wiro
im Standardfall einfach zurückgeben .quelle
Python 2,
95102Die Schleife ist ein direkter Durchlauf der Zeichenfolge nacheinander. Der
t&=...
Teil ist, wo die Magie passiert. Grundsätzlich habe ich den Operator zusammen mit dem Wertcmp(lhs,rhs)
(-1, 0 oder 1, je nachdem, oblhs
kleiner, gleich oder größer alsrhs
). Das Ergebnis ist ein Schlüssel in einer Nachschlagetabelle, die 0 oder 1 ergibt, je nachdem, ob die Zahlen bei diesem Operator richtig verglichen werden. Welche Nachschlagetabelle fragst du? Es ist die Zahl 627 =0001001110011
binär. Den Rest erledigen bitweise Operatoren.Dies funktioniert für die vier angegebenen Testfälle. Lassen Sie mich wissen, wenn Sie einen Fehler für einen anderen Fall finden. Ich habe es nicht sehr streng getestet.
quelle
a
als Eingabe übernehmen.Javascript 101 Bytes
Ein anderer Ansatz als die hier veröffentlichte js-Lösung
quelle
Java 8, 283 Bytes
Erläuterung:
Probieren Sie es hier aus.
quelle