Bei der Codeüberprüfung bin ich auf den folgenden Code gestoßen, der den Status eines Kontrollkästchens testet:
if (!isNotUnchecked()) { ... }
Ich musste 30 Minuten lang ein Brainstorming durchführen, um herauszufinden, welchen tatsächlichen Kontrollkästchenstatus der Code erwartete. Schreiben Sie mir bitte ein Programm, das diese albernen Ausdrücke vereinfachen kann!
Das Programm sollte als Eingabe eine Zeichenfolge akzeptieren, die den zu vereinfachenden Ausdruck darstellt (zum Beispiel:) !isNotUnchecked()
. Das Programm sollte entweder isChecked()
oder einen logisch äquivalenten vereinfachten Ausdruck ausgeben !isChecked()
.
Der Methodenname in dem Eingabeausdruck beginnt immer mit is
, enthält 0..n Not
, und endet mit Checked()
oder Unchecked()
. Der Methode kann eine beliebige Anzahl von vorangestellt werden !
.
Beispiele
isChecked() => isChecked()
isUnchecked() => !isChecked()
isNotChecked() => !isChecked()
!isNotChecked() => isChecked()
!!!isNotNotUnchecked() => isChecked()
notunischecked
?isnotunchecked
Beispiel nicht damit umzugehen .Antworten:
Python , 51 Bytes
Probieren Sie es online!
quelle
s[-8:]
'isC'+s[-8:]
doch ein Byte länger als'isChecked'
?s[-8:]
ist / macht?hecked()
.Netzhaut , 23 Bytes
Probieren Sie es online!
Erläuterung
Biegen Sie
Unchecked
in!Checked
.Biegen Sie alle
Not
s in!
. Wir bekommen jetzt so etwas wie!!!is!!!!Checked()
.Sortieren Sie alle Übereinstimmungen von entweder
is
oder!
. Da! < is
dies alles!
an den Anfang der Zeichenkette verschiebt, würde das obige Beispiel so werden!!!!!!!isChecked()
.Entfernen Sie Paare von
!
, um die wiederholte Verneinung abzubrechen.quelle
/// 26 Bytes
Probieren Sie es online!
Port meiner Retina-Antwort .
quelle
Python , 43 Bytes
Eine unbenannte Funktion, die die Zeichenfolge übernimmt
s
und eine Zeichenfolge zurückgibt.Probieren Sie es online!
Keine Notwendigkeit , die Existenz von Zeichen zu überprüfen , wenn
!
,Not
undUn
alle genau einer ungeraden Ordnungs (undc
undC
sind beide ungerade), so dass nur die ordinals zusammenzufassen und verwenden Sie den Wert Modulo 2 zu entscheiden , ob wir eine wollen!
oder nicht.Ansonsten ist das Formular das gleiche wie die Antwort von xnor , da ich nichts Besseres gefunden habe. Folgendes ist auch 43:
quelle
JavaScript (ES6),
51 bis50 ByteWerke von der Suche nach
!
,N
undn
Zeichen, die den Überprüfungsstatus invertieren.split
gibt standardmäßig eine ungerade Array-Länge zurück, also addieren wir die,!
wenn diesplit
Länge gerade ist. Bearbeiten: 1 Byte dank @ETHproductions gespeichert. Alternative Version, auch für 50 Bytes:quelle
g
in der letzten Bearbeitung nicht entfernt./!|N/i
/!|N/
ohne deni
ModifikatorRetina , 24 Bytes
Probieren Sie es online!
quelle
Java 7,
10077 BytesErweiterung:
Testcode:
Probieren Sie es hier aus.
Ausgabe:
quelle
Aceto , 49 Bytes
yadda yadda Hilbert Kurve.
Zunächst verschieben wir die drei wichtigen Zeichen auf den Stapel:
Dann setzen wir eine Fangmarke und beginnen mit dem Lesen eines einzelnen Zeichens. Wir
d
duplizieren es und negieren es, und wenn das Ergebnis davon wahr ist (also wenn der String leer war; also die Eingabe endete), springen wir zum Ende:Mit der verbleibenden Kopie des Eingabezeichens prüfen wir, ob es im Rest des Stapels enthalten ist (dh ob es eines von!, N, U ist). Wenn nicht, werfen wir einen Fehler aus und werfen uns zurück zu unserer Fangmarke, wo wir ein anderes Zeichen lesen:
Andernfalls laden wir das, was sich im Schnellspeicher befindet (im Wesentlichen ein Register, das anfangs eine leere Zeichenfolge ist; falsch), negieren es und senden es zurück in den Schnellspeicher.
Wenn die Eingabe gestoppt ist, werden wir zum Ende gesendet. Dort kehren wir die Richtung um, drücken ein Ausrufezeichen, laden die Schnellspeicherung und negieren sie. Wenn das wahr ist (dh wir hatten eine ungerade Anzahl von Negationssachen), drucken wir das Ausrufezeichen, das wir gedrückt haben:
Zum Schluss schieben wir die Zeichenkette in zwei Teile und drucken sie (aus Platzgründen):
Danach läuft das Programm immer noch zum ursprünglichen Anfang zurück, aber da keiner der Befehle irgendetwas ausgibt oder ein schleifenartiges Verhalten aufweist, spielt das keine Rolle. Tatsächlich löst der erste Non-Nopping-Befehl, den wir erreichen, eine Ausnahme aus, bei der ein Großteil des Codes übersprungen wird, weil wir zur Catch-Marke springen, was bedeutet, dass Aceto in diesem Teil nur Folgendes sieht:
Da
U
wird jetzt nicht von einem einzelnen Anführungszeichen vorangestellt und wird daher nicht als Zeichenliteral gesehen, wird es als Befehl interpretiert:U
umkehrt alle Elemente auf dem Stapel (jetzt ist es!
,N
,U
, von oben), und'N
und'!
drücken mehr Zeichen, was bedeutet, dass wir mit dem Stapel enden[U, N, !, N, !]
.Randnotiz: Dies ist das erste Aceto-Programm, das (teilweise) mit Hilfe von Acetos neuem Editor geschrieben wurde .
quelle
C
787068 BytesVielen Dank Christoph!
Probieren Sie es online aus
Ausgabe:
quelle
c;f(char*s){for(c=1;*s;)c^=!!strchr("!NU",*s++);s="!isChecked()"+c;}
Durch Verwendung von xor zum Spiegeln werdenc
2 Byte gespart.Perl 5 , 31 Bytes
-2 Bytes dank @Dom Hastings .
30 Byte Code +
-p
Flag.Probieren Sie es online!
y/UN!//
zählt die Anzahl von VorkommenUn
,Not
und!
. Das Ergebnis ist, dass viele!
Modulo 2, gefolgt vonisChecked()
.Ein weiterer Versuch, basierend auf Regex, für 38 Bytes (Dom Hastings sparte 1 Byte auf diesem):
Probieren Sie es online!
quelle
c
s vorhanden sindUnchecked
./g
Flag benutze ). Die Testfälle sehen für mich gut aus (siehe TryItOnline-Link). Also verstehe ich nicht wirklich, was du meinst ...c
InUnchecked
gibt, aber auch ein InChecked
. Wenn Sie es also ersetzen, erhalten SieCheCked
.Scala ,
3930 BytesProbieren Sie es online!
Leider konnte ich nicht die Art von s ableiten.
Bearbeiten: Die Typdeklaration wurde in die Kopfzeile verschoben (ich denke das ist erlaubt, wenn nicht, werde ich es zurücksetzen).
quelle
Ruby , 40 Bytes
Probieren Sie es online!
quelle
05AB1E , 22 Bytes
Probieren Sie es online!
quelle
05AB1E , 16 Bytes
Probieren Sie es online!
Verwendet den Trick, die Ordnungszahlen aus Jonathan Allans Pythonantwort zu summieren .
Erläuterung
quelle
Japt ,
2423 BytesErläuterung
Probieren Sie es online!
quelle
o
Groß- und Kleinschreibung wird nicht berücksichtigt ? Das wusste ich nicht ...PHP (5.5 - 5.6),
525049 BytesProbieren Sie es hier aus .
PHP (> = 5,5),
666561Ohne Regex wird es ein bisschen kompakter :) Probieren Sie es hier .
quelle
error_reporting
Standardwert istE_ALL&~E_NOTICE&~E_STRICT&~E_DEPRECATED
.$b^=$a
Sehr schöner Fund! Sie können dies auch ohne die PHP-Tags in derselben Größe tun.for($b=b;$a=$argn[$i++];)$b^=$a;echo$b&"!"|" ","isChecked()";
Jelly ,
1615 BytesEin vollständiges Programm, das die Zeichenfolge als Befehlszeilenargument verwendet und das Ergebnis ausgibt
Probieren Sie es online!
OSḂ⁾!iṫ-7³ṫṭ⁾sC
oderOSḂ⁾!iṫ-7³ṫ⁾sC;
würden beide auch für 15 arbeiten.Wie?
Verwendet die gleiche Idee wie meine Python-Antwort , speichert jedoch Bytes mit einer anderen Konstruktion von
!isC
oderisC
und implizitem Drucken in Jelly ...vorherige @ 16 Bytes 9 (unter Verwendung von Verkettung und Pairing mit derselben zugrunde liegenden Idee):
quelle
OS1&”!x;“isC”;ṫ-7$
Perl 6 ,
3531 BytesVersuch es
Versuch es
(erfordert eine veränderbare Eingabezeichenfolge, die verfälscht wird)
Erweitert:
quelle
Sed, 36 Bytes
Dieselbe Idee wie alle anderen direkten Substitutionsantworten.
quelle
sed,
3738 bytes37 + 1 für
-r
Schalter:quelle
s/c/C/
verursachte zuletzt Probleme für die Perl 5-Antwort ...s/c/C/
, als würde das zweite "c" in Fällen ohne "Un"g
und dass/!!//
Innere der Schleife verschieben.Mathematica,
826160 BytesKleine Optimierung, ein weiterer Infix-Operator hinzugefügt:
Vorher:
Zähle alle o's, n's und! S, dann mod 2 und setze so viele! vor.
Alte Version:
quelle
Excel, 90 Bytes
quelle
Windows Batch, 120 Bytes
Bisher 268 257 253 245 239 221 182 176 169 123 Bytes
Das Programm ersetzt alle
!
inN#
. Da jetzt alle Negationszeichen,! (Now it isN#
),Not
undUn
enthaltenN
, kann das Programm die Anzahl der Auftritte zählenN
und feststellen, ob ein Anführungszeichen!
erforderlich ist.Jedes Mal, wenn das Programm einen zählt
N
, wird der Zähler um 5 addiert. Der Grund für das Addieren von 5 ist, dass jeder abwechselnde Wert beim Addieren von 5 auf 0 oder 5 endet. Dies kann verwendet werden, um zu bestimmen, ob der Wert ungerade oder gerade ist und der führende!
fügte uns bei Bedarf hinzu.Außerdem wird der Trick der letzten acht Zeichen von xnor verwendet.
quelle
Jelly ,
29282521 BytesProbieren Sie es online!
-4 Bytes danke an Jonathan Allan!
-4 Bytes danke an Jonathan Allan! (durch Verwendung komprimierter Zeichenfolgen)
quelle
jellyCompress.Compress().string("is").dictionary("Checked").string("()").go()
. (Wenn Sie eine Windows-Cmd-Installation ausführen und zur Schriftart DejaVu Sans Mono wechseln und die Codepage mit dem Befehl ändern,chcp 65001
bevor Sie Python starten, damit die Zeichen angezeigt werden.)PHP, 55 Bytes
Probieren Sie es online!
PHP, 58 Bytes
stattdessen können
"#[!NU]#"
Sie verwenden"#[!N]#i"
Probieren Sie es online!
PHP, 68 Bytes
Version ohne Regex
Probieren Sie es online!
quelle
<?=preg_match_all("#[!UN]#",$argn)&1?"!":""?>isChecked()
-2 Bytescount(split())
Idee kam : D @ Titus nette Idee!" !"[$d&1]
Speichert ein weiteres Byte, wenn das führende Leerzeichen in Ordnung ist.$d^=!trim($c,"UN!")
Spart 3 Bytes (weil du keine&1
mehr brauchst )."!"[!$d]
stattdessen gemacht habeJapt , 19 Bytes
Probieren Sie es online!
Ausgepackt und wie es funktioniert
Verwenden Sie den Charcode-Summen-Trick aus Jonathan Allans Python-Lösung .
quelle
Pascal (FPC) , 119 Bytes
Probieren Sie es online!
Mit der Methode, die bei fast jeder Antwort angewendet wird, werden die Codepunkte der Zeichen in der Eingabe summiert und anschließend die Parität der Summe überprüft.
quelle