Wenn Sie schon einmal versucht haben, palindromischen Code zu schreiben, wissen Sie, wie viel Klammern Sie stören. ()()
ist kein Palindrom, obwohl es irgendwie so aussieht, wie es sein sollte, während ())(
und ()(
beide palindrom und beide sehr dumm aussehen. Wäre es nicht bequem, wenn es umgekehrt wäre?
Eine Zeichenfolge ist günstigerweise palindrom, wenn sie der Zeichenfolge entspricht, die abgeleitet wurde, wenn auf der Rückseite alle Klammern ( ()
), Klammern ( []
) und Klammern ( {}
) gespiegelt sind. Keine anderen Charaktere sind speziell und müssen umgedreht werden. ( <>
Werden manchmal gepaart, aber oft nicht, sodass sie weggelassen werden.)
Ihre Aufgabe ist es, in Ihrer Sprache ein Programm (Eingabe über STDIN) oder eine Funktion (Eingabe über ein einzelnes String-Argument) zu schreiben, das (a) einen konsistenten wahren Wert * ergibt, wenn sein Argument bequemerweise palindromisch und ein anderes, konsistentes falsch ist Wert sonst, und (b) ist selbst bequem palindromisch.
Zum Beispiel sind die folgenden Eingaben bequemerweise palindrom:
racecar
(a)(bb)(a)
void main(int argc, *char[] argv) {} (vgra []rahc* ,cgra tni)niam diov
Und die folgenden sind nicht:
non-palindrome
A nut for a jar of tuna?
(old [style] parens) )snerap ]elyts[ dlo(
ingirumimusnocte)etconsumimurigni
Sie dürfen sich auf keinen externen Status (bestimmten Dateinamen, Verzeichnisstruktur, andere Benutzereingaben, Webzugriff usw.) mit Ausnahme von Interpreter- / Compiler-Flags verlassen.
Sie dürfen auch nicht den Kommentar-Trick verwenden, wenn Sie einen Teil des Codes auskommentieren oder ungenutzt rendern, indem Sie die Kommentarfunktionen Ihrer Sprache nutzen. Zum Beispiel sind alle folgenden Elemente nicht zulässig, da sie nicht funktionsfähige Teile enthalten, die sicher entfernt oder zerstört werden können (auf Kosten des Verlusts der Palindromie):
{some code} // {edoc emos}
{some code} NB.BN {edoc emos}
"n\" ;{edoc emos} ;"; {some code}; "\n"
Dies deckt natürlich nicht jeden dieser Fälle ab, aber der Kern der Herausforderung besteht darin, keine Kommentare und nicht analysierten ** Code zu verwenden, um Palindromie zu erzielen, sondern die korrigierten Klammern und Parens zu verwenden. Ich sehe dich an, LISP, Brainfuck.
Dies ist ein Codegolf , also gewinnt der kürzeste Code, aber alle Codelängen sind willkommen.
* Mit konsistenten wahren und falschen Werten meine ich, dass Sie einen von zwei Werten zurückgeben können, z. B. 1
für wahr und 0
falsch oder False
für wahr und "no"
falsch, solange sich diese Werte voneinander unterscheiden und nicht Wechseln Sie von Ausführung zu Ausführung Ihres Programms. Verwenden Sie, was Sie Charaktere rettet.
** Nicht zu verwechseln mit nicht ausgeführtem Code: Code, der gültig ist und seltsame Dinge tun kann, aber niemals aufgerufen wird, ist in Ordnung.
quelle
if(false){some code}
oder nicht verwendeten Variablen? Dürfen sie?(eslaf)fi
, können Sie verwendenif(false)
.()()
Antworten:
J (60)
Dies ist eine Funktion, die ein Argument akzeptiert:
Erläuterung:
f :: g
Führt die Funktionf
über die Eingabe aus und gibt das Ergebnis zurück, wenn es fehlerfrei zurückgegeben wird. Wenn diesf
fehlschlägt, wird esg
stattdessen ausgeführt.Das
f
hier ist(|.-:'())([]][{}}{'&charsub)
, was die eigentliche Arbeit macht:|.
: umkehren-:
: entspricht'())([]][{}}{'&charsub
: Ersetzen Sie jede Klammer mit der gegenüberliegenden Klammerg
Funktion ist(busrahc&'}{{}][[])(()':-.|)
, was unsinnig aber syntaktisch gültig ist.busrahc
ist nicht definiert, aber das spielt keine Rolle, da es nur aufgelöst wird, wenn es ausgeführt wird (und nicht ausgeführt wird).quelle
f :: g
in verwandelng@-@f
.g
ist gleichbedeutend mit dem Hook,(-.|)
da dadurch:
die Ausgaben -1 werden und die leere Liste für Palindrom und nicht.GolfScript,
10791Newlines sind künstlerisch.
fi
,c43
undc
sind Noops, aber der gesamte Code wird ausgeführt.Druckt
-3-1-1
für bequeme Palindrome,-4-1-1
ansonsten. Probieren Sie es online!Alternative Version, 155 Byte
Auf Kosten von 64 Byte kann das verbessert werden:
Nach wie vor wird der gesamte Code ausgeführt und jedes einzelne Byte wirkt sich auf die Ausgabe aus.
Druckt
010
für bequeme Palindrome,-100
ansonsten. Probieren Sie es online!Tests und Beispiele
Wie es funktioniert
quelle
Rubin, 110
Druckt ,
true
wenn der Eingang eine bequeme Palindrom ist undfalse
wenn es nicht ist. Beachten Sie, dass diese Lösung davon ausgeht, dass die Eingabe nicht durch eine neue Zeile abgeschlossen wird. Testen Sie sie daher mitecho -n
:Dies ist eine etwas unkomplizierte Portierung meiner Antwort auf den Palindromic Palindrome Checker (und bisher nicht wirklich Golf gespielt). Der wichtigste Trick besteht darin, dass der erste Ausdruck in Klammern immer zurückgegeben wird
1
, sodass die zweite Hälfte des booleschen Ausdrucks nie ausgewertet wird (aber analysiert wird).Die einzige Schwierigkeit, dies anzupassen, bestand darin, herauszufinden, wie man den Aufruf hinzufügt,
z.tr
damit seine "bequeme Umkehrung" auch syntaktisch gültig ist - aber ich könnte einfach denselben Trick verwenden, den ich bereits verwendet habe :*
, der in der ersten Hälfte analysiert wird als Splat-Operator (Array-Inhalt als Funktionsparameter verwenden) und als Array-Multiplikations- (oder Wiederholungs-) Operator in der zweiten Hälfte.Rubin, 157
297wird der gesamte Code ausgeführtDiese (etwas längere) Version führt den gesamten Code aus, und alle bis auf zwei Zeilen wirken sich auf die Ausgabe aus, die in der letzten Zeile gedruckt wird. Alle Zeilen werden jedoch ohne Fehler analysiert und ausgeführt. Diese Version interpretiert alle nachgestellten Zeilenumbrüche als Teil der Eingabe. Verwenden Sie sie daher entweder
echo -n
zum Testen oder stellen Sie Ihrer Eingabe eine neue Zeile voran. Es wird gedruckt,true
wenn es sich bei der Eingabe um ein bequemes Palindrom handelt,false
andernfalls.Erläuterung
quelle
GolfScript, 61 Zeichen
OK, hier ist eine Basislösung in GolfScript. Ich bin sicher, es könnte weiter verbessert werden:
Wie für GolfScript üblich, liest dieses Programm seine Eingabe von stdin. Es gibt aus:
wenn es sich bei der Eingabe um ein bequemes Palindrom handelt, wie in der obigen Abfrage definiert, und:
wenn es das nicht ist.
Erläuterung: Dieses Programm stützt sich stark auf die Entscheidung, dass nicht ausgeführter Code in Ordnung ist, solange er analysiert wird. Es besteht aus zwei durch geschweifte Klammern (
{ }
) getrennten Codeblöcken, die spiegelbildlich zueinander sind.Der erste Codeblock wird
~
folgendermaßen ausgeführt: Er prüft, ob die Eingabe ein passendes Palindrom ist, und gibt aus, ob dies der Fall1
ist und0
ob dies nicht der Fall ist. Der zweite Codeblock wird nicht ausgeführt und verbleibt einfach auf dem Stapel, bis das Programm endet und alles auf dem Stapel vom GolfScript-Interpreter automatisch stringifiziert und gedruckt wird.Es ist zu beachten, dass der GolfScript-Interpreter nur sehr wenige Syntaxprüfungen zum Zeitpunkt des Parsens vornimmt (oder je zuvor). Ein GolfScript-Codeblockliteral kann fast alles enthalten, auch wenn es bei der Ausführung abstürzen könnte. Einige Syntaxfehler, z. B. nicht abgeschlossene Zeichenfolgenliterale, führen auch in nicht ausgeführtem Code zu einem Fehler. Ich glaube, dass diese Lösung (kaum) unter die Regeln fällt.
Ps. Betrachtet man den tatsächlich ausgeführten Code, enthält er einige bequeme palindromische Elemente wie
@[.]@
das String-Literal"([{}])"
und sogar die Schleife%{ ... }%
. Dies bietet den verlockenden Vorschlag, dass eine "intrinsisch palindromische" GolfScript-Lösung, bei der das gesamte palindromische Programm ausgeführt und funktionsfähig wäre, tatsächlich möglich sein könnte. Da ich es noch nicht geschafft habe, selbst eine zu produzieren, biete ich hiermit der ersten Person, die es schafft, eine Rep Bounty von +100 zu erhalten!quelle
"n\";X;";X;"\n"
Art des Kommentierens zu betrachten, aber ich gebe Ihnen den Vorteil des Zweifels. Ich suchte jedoch zunächst wirklich nach solchen "intrinsisch palindromen" Lösungen, oder zumindest nach solchen, bei denen die Nichtausführung von Blöcken etwas hinterhältiger war.1;
). Zählt das noch als voll funktionsfähig?JavaScript (ES6), 245 Byte
Ich wollte eine JS-Antwort, die im Browser ausgeführt werden kann, also hier ist es.
Wenn Sie den gesamten Code entfernen, der niemals ausgeführt wird, erhalten Sie Folgendes:
Was kann dazu vereinfacht werden:
quelle
n1=>n1==(('',n1))['nioj','split']``['esrever','map'](c=>`()[]{}`[`()[]{}`['indexOf'](c)^1]||c||[1^(c)['fOxedni']`{}[]()`]`{}[]()`>=c)['pam','reverse']``['tilps','join']((1n,''))==1n>=1n
(185 Bytes)Javascript (ES6) 288
Läuft in der Spidermonkey-Befehlszeilen-Shell . Liest eine einzelne Zeile aus STDIN und gibt sie aus
true
oderfalse
hängt davon ab, ob es sich bei der Eingabe um ein bequemes Palindrom handelt.Dieser Code ist syntaktisch gültig, aber alles, was danach
&&
folgt, wird nicht ausgeführt, da dieprint
Funktion einen falschen Wert zurückgibt.Sie können diesen Code in der Firefox-Konsole ausführen, indem Sie zuerst diesen Shim ausführen, um die Funktionen
readline
und zu emulierenprint
. Bearbeiten Sie die Eingabereadline
nach Bedarf:Und hier ist ein kurzes Beispiel für die Ausgabe:
quelle
&&
war wirklich klug, ich empfehle Ihnen (aber es scheint ein wenig betrügerisch)05AB1E, 35 Bytes
Probieren Sie es online!
Erläuterung:
quelle
"()[]{}"
können Sie es tunžu„<>-
q
zumindest syntaktischer Gültigkeit analysiert? Wenn nicht, würde ich dies als gleichbedeutend mit dem Auskommentieren der zweiten Hälfte des Codes betrachten.CJam, 38 Bytes
Druckt,
"=re%W_@%W_q"1
wenn die Eingabe bequemerweise palindromisch ist oder"=re%W_@%W_q"0
nicht.Probieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
Nach dem Ausführen des Programms druckt CJam automatisch alle drei Elemente auf dem Stapel aus: die geprüfte Zeichenfolge, den Booleschen Wert aus dem Zeichenfolgenvergleich und die leere Zeichenfolge.
quelle
Perl, 83 + 2 = 85 Bytes
Laufen Sie mit
-nl
Der Code wird beendet, nachdem die Richtigkeit der Eingabe gedruckt wurde. Alles, was nach dem Semikolon steht, wird interpretiert (und stürzt ab, wenn das Skript diesen Punkt erreicht, wenn es nicht gefunden wird
exit
), aber nicht ausgeführt. Wenn ichexit;tixe;
den Code weglasse, wird das Ergebnis trotzdem korrekt gedruckt, bevor es abstürzt.quelle