"Bequemes Palindrom" -Prüfprogramm

39

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 , 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. 1für wahr und 0falsch oder Falsefü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.

algorithmshark
quelle
Was ist mit ähnlichen if(false){some code}oder nicht verwendeten Variablen? Dürfen sie?
ace_HongKongIndependence
@ace Wenn Ihre Sprache den nicht ausgeführten Code auf Typvereinbarung oder syntaktische Gültigkeit analysiert oder überprüft, ist das in Ordnung. Wenn es sich um einen Kommentar handelt, weil Ihre Sprache das Innere dieses Blocks nicht überprüft, ist das nicht in Ordnung, wenn es einen Syntaxfehler auslösen würde. Ich denke, wenn Sie eine gültige Verwendung für finden (eslaf)fi, können Sie verwenden if(false).
Algorithmushai
58
Ich habe viel zu lange ()()
gebraucht,
Muss der Code mit mehrzeiliger Eingabe funktionieren?
Ventero,
@Ventero Zeilenumbrüche und Zeilenumbrüche sind Zeichen und es gibt keine Paare, mit denen sie umgedreht werden könnten. Ich würde also sagen, dass sie als normale Zeichen gelten.
Algorithmushai

Antworten:

13

J (60)

(|.-:'())([]][{}}{'&charsub) :: (busrahc&'}{{}][[])(()':-.|)

Dies ist eine Funktion, die ein Argument akzeptiert:

   (|.-:'())([]][{}}{'&charsub) :: (busrahc&'}{{}][[])(()':-.|) 'ingirumimusnocte)etconsumimurigni'
0
   (|.-:'())([]][{}}{'&charsub) :: (busrahc&'}{{}][[])(()':-.|) '(a)(bb)(a)'
1

Erläuterung:

  • f :: gFührt die Funktion füber die Eingabe aus und gibt das Ergebnis zurück, wenn es fehlerfrei zurückgegeben wird. Wenn dies ffehlschlägt, wird es gstattdessen ausgeführt.

  • Das fhier ist (|.-:'())([]][{}}{'&charsub), was die eigentliche Arbeit macht:

    • |.: umkehren
    • -:: entspricht
    • '())([]][{}}{'&charsub: Ersetzen Sie jede Klammer mit der gegenüberliegenden Klammer
  • Die gFunktion ist (busrahc&'}{{}][[])(()':-.|), was unsinnig aber syntaktisch gültig ist. busrahcist nicht definiert, aber das spielt keine Rolle, da es nur aufgelöst wird, wenn es ausgeführt wird (und nicht ausgeführt wird).
Marinus
quelle
Sie können einen Charakter speichern, indem Sie ihn f :: gin verwandeln g@-@f. gist gleichbedeutend mit dem Hook, (-.|)da dadurch :die Ausgaben -1 werden und die leere Liste für Palindrom und nicht.
Algorithmushai
34

GolfScript, 107 91

.4:ab-1:ba=;1
%ba%{...fi@@=
c43.=;)('"([{
}])"'~?~'"([{
}])"')(;=.34c
=@@if...}%ab%
1;=ab:1-ba:4.

Newlines sind künstlerisch. fi, c43und csind Noops, aber der gesamte Code wird ausgeführt.

Druckt -3-1-1für bequeme Palindrome, -4-1-1ansonsten. Probieren Sie es online!

Alternative Version, 155 Byte

Auf Kosten von 64 Byte kann das verbessert werden:

0!*1{!}\;:);0:f;0:i;-1:ab;9:ba;
...=;1%ab%{....i@f@@fi@@=@.=@\)
+""'"([{}])"'~+?+~'"([{}])"'""+
(\@=.@=@@if@@f@i....}%ba%1;=...
;ab:9;ba:1-;i:0;f:0;(:;\{!}1*!0

Nach wie vor wird der gesamte Code ausgeführt und jedes einzelne Byte wirkt sich auf die Ausgabe aus.

Druckt 010für bequeme Palindrome, -100ansonsten. Probieren Sie es online!

Tests und Beispiele

$ base64 > palindrome.gs -d <<< LjQ6YWItMTpiYT07MSViYSV7Li4uZmlAQD1jNDMuPTspKCciKFt7fV0pIid+P34nIihbe31dKSInKSg7PS4zNGM9QEBpZi4uLn0lYWIlMTs9YWI6MS1iYTo0Lg==
$ wc -c palindrome.gs
91 palindrome.gs
$ rev palindrome.gs | tr '([{}])' ')]}{[(' | diff - palindrome.gs
$ echo -n 'r(a[c{"e"}c]a)r' | golfscript palindrome.gs
-3-1-1
$ echo -n 'totallynotapalindrome' | golfscript palindrome.gs
-4-1-1
$
$ base64 > pal.gs -d <<< MCEqMXshfVw7Oik7MDpmOzA6aTstMTphYjs5OmJhOy4uLj07MSVhYiV7Li4uLmlAZkBAZmlAQD1ALj1AXCkrIiInIihbe31dKSInfis/K34nIihbe31dKSInIiIrKFxAPS5APUBAaWZAQGZAaS4uLi59JWJhJTE7PS4uLjthYjo5O2JhOjEtO2k6MDtmOjA7KDo7XHshfTEqITA=
$ wc -c pal.gs
155 pal.gs
$ rev pal.gs | tr '([{}])' ')]}{[(' | diff - pal.gs
$ echo -n 'r(a[c{"e"}c]a)r' | golfscript pal.gs
010
$ echo -n 'totallynotapalindrome' | golfscript pal.gs
-100
$ for i in {1..154}; do head -c $i pal.gs > tmp.gs; tail -c +$[i+2] pal.gs >> tmp.gs
> [ "$(echo -n 'r(a[c{"e"}c]a)r' | golfscript tmp.gs 2> /dev/null)" = "010" ] && echo $i
> done; rm tmp.gs
1
for i in {1..154}; do head -c $i pal.gs > tmp.gs; tail -c +$[i+2] pal.gs >> tmp.gs
>  [ "$(echo -n '42' | golfscript tmp.gs 2> /dev/null)" = "-100" ] && echo $i
> done | grep '^1$'; rm tmp.gs

Wie es funktioniert

.             # Duplicate the input string.
4:ab-1:ba     # Save 4 in “ab” and -1 in “ba”.
=;            # Compare 4 to -1 and discard the result.
1%            # Save every element from the input string in a new string.
ab%           # Reverse the input string.
{             # For each character in the input string:
  ...         # Duplicate the character thrice.
  fi          # Variable “fi” is undefined; this does nothing.
  @@=         # Verify that the character is equal to itself; push 1.
  c43         # Variable “c43” is undefined; this does nothing.
  .=;         # Verify that 1 is equal to itself and discard the result.
  )(          # Increment and decrement the character.
  '"([{}])"'~ # Push that string and evaluate it. Result: '([{}])'
  ?           # Retrieve the character's position in '([{}])'. -1 means not found.
  ~           # Negate the position.. Examples: -1 -> 0    0 -> -1    2 -> -3
  '"([{}])"') # Push that string and pop its last element. Result: '"([{}])' 34
  (;          # Decrement 34 (the ASCII code of a double quote) and discard.
  =           # Retrieve the corresponding character.
  .34         # Duplicate the character and push 34.
  c           # Variable “c” is undefined; this does nothing.
  =           # If the character is a double quote, the index was -1.
  @@if        # In that case, replace the double quote with the original character.
  ...         # Duplicate the new character thrice.
}%            #
ab%           # Save every fourth element in a new string to discard dummy values.
1;            # Push 1 and discard.
=             # Push 1 if the modified string matches the original, 0 otherwise.
ab:1-         # Save 4 in “1” and subtract.
ba:4.         # Save -1 in “4” and duplicate.

0!*           # Pop and push the input string.
1{!}\;:);     # Make “)” an alias for “!”.
0:f;0:i;      # Variables.
-1:ab;9:ba;   # Moar variables.
...=;         # Duplicate the input string.
1%ab%         # Reverse the copy.
{             # For each character in the input string:
  ....        # Duplicate the character four times.
  i@          # Push 0 and rotate a string copy on top of it.
  f@@fi@@     # Push 0 and rotate 0 on top of it.
  =@          # Push 1 and rotate a string copy on top of it.
  .=@         # Push 1 and rotate 1 on top of it.
  \)+         # Negate a 1 and add. Result: 1
  ""          # Push that string.
  '"([{}])"'  # Push that string.
   ~+         # Evaluate the second string and concatenate. Result: '([{}])'
   ?          # Retrieve the characters position in '([{}])'. -1 means not found.
   +~         # Add 1 to the position and negate. Ex.: -1 -> -1 | 0 -> -2 | 1 -> -3
  '"([{}])"'  # Push that string.
  ""          # Push that string.
  +           # Concatenate. Result: '"([{}])"' 
  (\          # Pop the first double quote and swap it with the rest of the string.
  @=.         # Retrieve the corresponding character and duplicate it.
  @=          # If the character is a double quote, the index was -1.
  @@if        # In that case, replace the double quote with the original character.
  @@          # Rotate the modified character to the bottom.
  f@i....     # Push dummy values.
  }%          #
  ba%         # Save every ninth element in a new string to discard dummy values.
  1;          # Push 1 and discard.
  =           # Push 1 if the modified string matches the original, 0 otherwise.
  ...;        # Duplicate thrice and discard the last copy.
  ab:9;ba:1-; # Variables.
  i:0;f:0;    # Moar variables.
  (:;\        # Negate, override “;” and swap.
  {!}1*!0     # Negate twice and push 0.
Dennis
quelle
13

Rubin, 110

(z=gets;r=z.tr *["([{}])",")]}{[("];p *z==r.reverse;1)||(1;esrever.r==z* p;[")]}{[(","([{}])"]* rt.z=r;steg=z)

Druckt , truewenn der Eingang eine bequeme Palindrom ist und falsewenn 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 mit echo -n:

echo -n '(a)(bb)(a)' | ruby convpal.rb
true

echo -n '(a)(bb()a(' | ruby convpal.rb
false

# note that for this to work, the file must not contain a newline
# to remove a trailing newline, pipe it through tr -d $'\n'
cat convpal.rb | ruby convpal.rb
true

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.trdamit 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ührt

w=tsoh=gets p
o=rt=esrever=Gem
q=tsoh.tr *["([{}])",")]}{[("]
q==esrever.host=w=tsoh.reverse==q
[")]}{[(","([{}])"]* rt.host=q
meG=reverse=tr=o
p steg=host=w

Diese (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 -nzum Testen oder stellen Sie Ihrer Eingabe eine neue Zeile voran. Es wird gedruckt, truewenn es sich bei der Eingabe um ein bequemes Palindrom handelt, falseandernfalls.

Erläuterung

# Read the input by calling gets(nil), which is achieved by passing the return
# value of a call to Kernel#p (which returns nil if no argument is supplied) to
# gets.
w=tsoh=gets p
# Assign the global Gem module to three variables.
# The variable names are the reversed names of methods we have to call later.
# This doesn't necessarily have to be the Gem module, any global module/variable
# (or class that allows object creation through a call to the module itself,
# e.g. Hash or GC) with a writable property would do, but Gem#host was
# the shortest one I could find. This is necessary because Ruby doesn't
# allow setting previously undefined properties through the dot syntax.
o=rt=esrever=Gem
# Replace the parentheses with the corresponding flipped one.
# sserts is the reverse of the property name we're going to use later.
q=tsoh.tr *["([{}])",")]}{[("]
# Do the convinient palindrome check and assign its result to a few variables
# and Gem's host property.
q==esrever.host=w=tsoh.reverse==q
# Here, the * is parsed as array join operator.
[")]}{[(","([{}])"]* rt.host=q
# Nothing special here.
meG=reverse=tr=o
# Print the result of the palindrome check, which was stored in w.
p steg=host=w
Ventero
quelle
9

GolfScript, 61 Zeichen

OK, hier ist eine Basislösung in GolfScript. Ich bin sicher, es könnte weiter verbessert werden:

{.-1%{"([{}])".2$?~@[.]@+=}%=}~{=%{=+@[.]@~?$2."([{}])"}%1-.}

Wie für GolfScript üblich, liest dieses Programm seine Eingabe von stdin. Es gibt aus:

1{=%{=+@[.]@~?$2."([{}])"}%1-.}

wenn es sich bei der Eingabe um ein bequemes Palindrom handelt, wie in der obigen Abfrage definiert, und:

0{=%{=+@[.]@~?$2."([{}])"}%1-.}

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 Fall 1ist und 0ob 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!

Ilmari Karonen
quelle
3
Warten Sie, Ihr Code ist selbst ein Palindrom? : O
Fabricio
Ich bin geneigt, diese Lösung eher als die "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.
Algorithmushai
Meine Antwort hat ein Noop (undefinierte Variable) und ein paar Teile, die nichts bewirken (zB 1;). Zählt das noch als voll funktionsfähig?
Dennis
@ Tennis: Ja, ich denke schon. Herzlichen Glückwunsch, es ist auf jeden Fall beeindruckend genug. Die Frage scheint neu genug zu sein, dass ich das Kopfgeld noch nicht darauf posten kann, aber du wirst es in ein paar Tagen haben.
Ilmari Karonen
1
Ausgabeformat leeway abuuuse :-)
John Dvorak
4

JavaScript (ES6), 245 Byte

Ich wollte eine JS-Antwort, die im Browser ausgeführt werden kann, also hier ist es.

eurt=>eurt==(("",eurt))["split"||"nioj"]("")["map"||"esrever"](x=>({'{':'}','}':'{','[':']',']':'[','(':')',')':'('})[x]||x||[x]({')':'(','(':')',']':'[','[':']','}':'{','{':'}'})>=x)["reverse"||"pam"]("")["join"||"tilps"]((true,""))==true>=true

Wenn Sie den gesamten Code entfernen, der niemals ausgeführt wird, erhalten Sie Folgendes:

eurt=>eurt==(("",eurt))["split"||"nioj"]("")["map"||"esrever"](x=>({'{':'}','}':'{','[':']',']':'[','(':')',')':'('})[x]||x||[x]({')':'(','(':')',']':'[','[':']','}':'{','{':'}'})>=x)["reverse"||"pam"]("")["join"||"tilps"]((true,""))==true>=true
eurt=>eurt==(("",eurt))["split"        ]("")["map"           ](x=>({'{':'}','}':'{','[':']',']':'[','(':')',')':'('})[x]||x                                                           )["reverse"       ]("")["join"         ]((true,""))==true>=true

Was kann dazu vereinfacht werden:

eurt=>eurt==eurt.split("").map(x=>({'{':'}','}':'{','[':']',']':'[','(':')',')':'('})[x]||x).reverse("").join("")
ETHproductions
quelle
Sie können 60 Bytes einsparen, indem Sie n1 / 1n anstelle von true / eurt, an einigen Stellen Kommas anstelle von || und mit dem Bracket-Switcher spielen: 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)
Yair Rand
3

Javascript (ES6) 288

Läuft in der Spidermonkey-Befehlszeilen-Shell . Liest eine einzelne Zeile aus STDIN und gibt sie aus trueoder falsehängt davon ab, ob es sich bei der Eingabe um ein bequemes Palindrom handelt.

((print)((eval)('r=readline()')==([0]['map']['call'](r,x=>({'{':'}','}':'{','[':']',']':'[','(':')',')':'('})[x]||x)['reverse']()['join']('')))&&((('')['nioj']()['esrever'](x||[x]({')':'(','(':')',']':'[','[':']','}':'{','{':'}'})>=x,r)['llac']['pam'][0])==('()enildaer=r')(lave))(tnirp))

Dieser Code ist syntaktisch gültig, aber alles, was danach &&folgt, wird nicht ausgeführt, da die printFunktion 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 readlineund zu emulieren print. Bearbeiten Sie die Eingabe readlinenach Bedarf:

readline = function(){ 
    return "void main(int argc, *char[] argv) {} (vgra []rahc* ,cgra tni)niam diov"; 
}, print = console.log.bind(console);

Und hier ist ein kurzes Beispiel für die Ausgabe:

Befehlszeilenbeispiel

nderscore
quelle
Das Ausnutzen von &&war wirklich klug, ich empfehle Ihnen (aber es scheint ein wenig betrügerisch)
MayorMonty
2

05AB1E, 35 Bytes

"{[()]}"DRr‡`rJ¹Q,Q¹Jr`‡rRD"{[()]}"

Probieren Sie es online!

Erläuterung:

                     # Implicit input
 "{[()]}"            # Push "{[()]}" onto the stack
         DR          # Pushes a reversed copy onto the stack
           r         # Reverse the order of the stack
            ‡        # Transliterate
             `       # Flatten array on stack
              r      # Reverse order of stack
               J     # Join stack
                ¹Q   # Check equality with first input
                  ,  # Print
                     # Everything after is still syntactically correct, but just does not print anything.
Oliver Ni
quelle
Ich glaube nicht, dass dies helfen wird, da die Antwort ungültig ist, aber stattdessen "()[]{}"können Sie es tunžu„<>-
acrolith
@daHugLenny Es ist jetzt gültig
Oliver Ni
Wird der Rest des Programms nach qzumindest syntaktischer Gültigkeit analysiert? Wenn nicht, würde ich dies als gleichbedeutend mit dem Auskommentieren der zweiten Hälfte des Codes betrachten.
Algorithmushai
@algorithmshark Behoben.
Oliver Ni
1

CJam, 38 Bytes

Q~"=re%W_@%W_q"`{[()]}`"q_W%@_W%er="~Q

Druckt, "=re%W_@%W_q"1wenn die Eingabe bequemerweise palindromisch ist oder "=re%W_@%W_q"0nicht.

Probieren Sie es online im CJam-Interpreter aus .

Wie es funktioniert

Q~                                     e# Evaluate an empty string.
  "=re%W_@%W_q"                        e# Push that string.
               `                       e# Inspect. Pushes "\"=re%W_@%W_q\"".
                {[()]}                 e# Push that block.
                      `                e# Inspect. Pushes "{[()]}".
                       "           "~  e# Push and evaluate.
                        q              e# Read from STDIN.
                         _W%           e# Push a reversed copy.
                            @          e# Rotate "{[()]}" on top of the stack.
                             _W%       e# Push a reversed copy.
                                er     e# Perform transliteration.
                                  =    e# Compare to the input string.
                                     Q e# Push an empty string.

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.

Dennis
quelle
0

Perl, 83 + 2 = 85 Bytes

Laufen Sie mit -nl

say$_~~reverse y-"({[]})"-")}][{("-r;exit;tixe;r-")}][{("-"({[]})"-y esrever~~_$yas

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 ich exit;tixe;den Code weglasse, wird das Ergebnis trotzdem korrekt gedruckt, bevor es abstürzt.

Gabriel Benamy
quelle