Ich bin symmetrisch, nicht palindromisch!

22

Hintergrund

Inspiriert von Ich bin ein Palindrom. Bist du? , wo es die schockierende Tatsache gibt, dass " ()()kein Palindrom ist, sondern ())(", fragte ich mich, was stattdessen ist ()()und die Antwort ist einfach: Es ist eine Saite mit einer vertikalen Symmetrieachse!

Die Aufgabe

Schreiben Sie ein Programm oder eine Funktion, die einen String S (oder das entsprechende Äquivalent in Ihrer Sprache) als Eingabe verwendet, auf Symmetrie entlang der vertikalen Achse prüft und dementsprechend einen Wahrheits- oder Falschwert zurückgibt . Sie können alle angemessenen Mittel verwenden , um die Eingabe zu übernehmen und die Ausgabe bereitzustellen.

Reflexionssymmetrie

Reflexionssymmetrie um eine vertikale Achse (oder Links-Rechts-Symmetrie) bedeutet, dass das reflektierte Bild der ersten Hälfte der Zeichenfolge mit der zweiten Hälfte der Zeichenfolge identisch ist, wenn Sie einen Spiegel vertikal in der exakten Mitte der Zeichenfolge platzieren.

Die folgenden Zeichenfolgen sind beispielsweise um eine vertikale Achse reflexionssymmetrisch:

()()
()()()
[A + A]
WOW ! WOW
OH-AH_wx'xw_HA-HO
(<<[[[T*T]]]>>)
(:)
)-(
())(()
qpqp

während die folgenden nicht sind:

())(
((B))
11
+-*+-
WOW ! wow
(;)
qppq

Regeln des Wettbewerbs

• Ihr Programm oder Ihre Funktion empfängt nur druckbare ASCII-Zeichen. Sie können die leere Zeichenfolge (die natürlich symmetrisch ist!) Als legale Eingabe einfügen oder nicht, was für Sie besser ist.

• Folgende ASCII-Zeichen können in Bezug auf die vertikalen Achsen als symmetrisch angesehen werden (beachten Sie den Anfangsraum und den Unterschied zwischen Groß- und Kleinbuchstaben):

 !"'+*-.:=AHIMOTUVWXY^_ovwx|

Die ASCII-Zeichen, die als "gespiegelt" betrachtet werden können, und die entsprechenden Zeichen sind:

()<>[]{}qpbd/\

Beachten Sie, dass, da sie gespiegelt sind, können Sie beide haben ()als auch )(, /\und \/etc.

Alle anderen druckbaren ASCII-Zeichen müssen als asymmetrisch und ohne gespiegeltes entsprechendes Zeichen betrachtet werden.

• Dies ist eine Herausforderung: Je kürzer Ihr Programm ist, gemessen in Bytes, desto besser in jeder Programmiersprache.

• Ein großes Lob an Leute, die ein symmetrisches Programm erstellen!

Hinweis : Bei dieser Frage handelt es sich nicht um ein Duplikat von "Convenient Palindrome" , bei dem nach palindromen Zeichenfolgen gesucht werden muss, bei denen Klammern gespiegelt sind. Diese Frage unterscheidet sich aus zwei Gründen:

1) Es handelt sich um eine Einschränkung der anderen Frage in Bezug auf nicht in Klammern gesetzte Zeichen, da nur symmetrische Zeichen in umgekehrter Reihenfolge auftreten können.

2) Da es auf dem Konzept der Symmetrie und nicht auf dem Konzept des "bequemen Palindroms" basiert, können gespiegelte Zeichen in beiden Reihenfolgen auftreten, dh []und ][, und dies unterscheidet das zu lösende Programm von Programmen, die das andere Problem lösen .

Renzo
quelle
6
Nur für diejenigen, die sich fragen, reflektiert Charcoal keine Buchstaben. :(
totalhuman
4
Ich bin mit der Dupeyness nicht einverstanden, da das Dupe-Ziel keine Buchstaben widerspiegelt und dies auch.
Stephen
Sorry, ich habe die Beispiele verpasst, mein Fehler
jrtapsell
6
Warum wird es nicht 8als "symmetrisch" angesehen?
Scott Milner
2
@FunkyComputerMan Es ist im Wesentlichen nicht dasselbe wie das Dup-Ziel . Dies hat in erster Linie keine Quellcode-Einschränkung.
Jonathan Allan

Antworten:

7

JavaScript (ES6), 130 125 113 Byte

f=
s=>s==[...s].reverse(s=`()<>[]{}qpbd/\\`).map(c=>s[s.indexOf(c)^1]||/[- !"'+*.:=AHIMOT-Y^_ovwx|]/.exec(c)).join``
<input oninput=o.textContent=f(this.value)><pre id=o>

Bearbeiten: 5 Bytes dank @Arnauld gespeichert. Dank @YairRand wurden weitere 11 Bytes gespeichert.

Neil
quelle
Könnten Sie stattdessen einen regulären Ausdruck verwenden includes()? Wie /[- !"'+*.:=AHIMO^_ovwx|T-Y]/.test(c).
Arnauld
@ Arnauld In der Tat ist dieser Bereich sehr hilfreich, danke!
Neil
Sie können Golf spielen, [...s].reverse().map(...)um: s::[].map().reverse()die neuen ES-next-Funktionen zu nutzen. link
Downgoat
@Downgoat Haben Sie einen Link zu der Spezifikation dieser Funktion?
Neil
1
@Neil hier
Downgoat
5

Jelly , 69 62 Bytes

“(<[{qb/“ !"'+*-.:=AHIMOTUVWXY^_ovwx|“)>]}pd\”,Ṛ$F©f@ð®œs2¤yU⁼

Probieren Sie es online!

Alle Testfälle

-7 Bytes dank @JonathanAllan

Wie es funktioniert

“(<[{qb/“ !"'+*-.:=AHIMOTUVWXY^_ovwx|“)>]}pd\”,Ṛ$F©f@ð®œs2¤yU⁼  main link

“(<[{qb/“ !"'+*-.:=AHIMOTUVWXY^_ovwx|“)>]}pd\”  The literal list of strings  ['(<[{qb/', ' !"\'+*-.:=AHIMOTUVWXY^_ovwx|', ')>]}pd\\']
               $                 Last two links (if not part of an LCC) as a monad 
            Ṛ                    Reverse array Does not vectorize.
           ,                     Pair; return [x, y].
                 ©               Copy link result to register (® atom to retrieve). 
              F                  Flatten list.
                  f              Filter; remove the elements from x that are not in y.
                   @             Swaps operands. 

                    ð            Start a new dyadic chain
                         ¤       Nilad followed by links as a nilad. 
                      2          The literal integer 2
                   ®             Restore; retrieve the value of the register. Initially 0.
                    œs           Split x into y chunks of similar lengths.
                          y      Translate the elements of y according to the mapping in x.
                           U     Upend; reverse an array.
                            ⁼    Equals. Does not vectorize.
fireflame241
quelle
Speichern Sie sechs Bytes mit einem Filter: ¢FiЀ;1Ạðaµ¢yU⁼->¢Ff@ð¢yU⁼
Jonathan Allan
Speichern Sie einen anderen, indem Sie das Register verwenden (jetzt alle in einer Zeile):...}pd\”,Ṛ$Fœs©2Ff@ð®yU⁼
Jonathan Allan
(... obwohl bei gleicher Länge ...}pd\”,Ṛ$F©f@ð®œs2¤yU⁼wohl netter ist)
Jonathan Allan
Es wurde eine weitere Ein-Byte-Speicherung gefunden, indem nur für eines von jedem Paar benachbarter Ordnungszahlen aus dem symmetrischen Satz codiert wurde (Bearbeitung des gelöschten Kommentars mit besserem Code)
Jonathan Allan
4

Python 3, 211 208 195 Bytes

lambda S,p="()<>[]{}qpbd\/",s=" !\"'+*-.:=AHIMOTUVWXY^_ovwx|":(S==S.translate({ord(s[2*x]):s[2*x+1]for s in(p,p[::-1])for x in range(7)})[::-1])*(~len(S)%2*s[len(S)//2]in s)*(not set(S)-set(p+s))

13 Bytes dank Jonathan Allan gespeichert.

L3viathan
quelle
1
Sparen Sie 9 Bytes : 1. Umgekehrte Reihenfolge der Schrägstriche, sodass kein Escape erforderlich ist. 2. benutze 2*xund range(7); 3. Verwenden Sie die Multiplikation, um den >2Test zu vermeiden . 4. Verwenden Sie bitweise nicht auf len(S), um das notvon zu vermeiden not len(S)%2; 5. Verwenden Sie die Tatsache , dass ''in'blah'ist Truedie Zeichenfolge Multiplikation zu ermöglichen ~len(S)%2*s[len(S)//2]in s.
Jonathan Allan
1
Speichern Sie 4 weitere Inlining alles
Jonathan Allan
2

SOGL V0.12 , 88 Bytes

"el²┘N!←8mYdDm⁵╔C⅛┌6▼ģη⁷fņ‘;W‽0←}C
l»{Kα}lalh=‽;KCø;{:↔³↔=?"qpbd”⁴²+:GW:2%«H+W}:h=?:CΚ}=

Probieren Sie es hier aus!

~ 24 Bytes zum Hinzufügen von qpbdSpiegelung und 6 Bytes für (x-1 XOR 1) + 1: /

dzaima
quelle
2

Kotlin 1.1, 201 199 Bytes

{var R="(<[{qb/\\dp}]>)"
var m=HashMap<Any,Any>()
"\"!'+*-.:=AHIMOTUVWXY^_ovwx| ".map{m[it]=it}
R.indices.map{m[R[it]]=R[R.length-(it+1)]}
it.zip(it.reversed()).filter{m[it.first]!=it.second}.none()}

Verschönert

{
    var R = "(<[{qb/\\dp}]>)"
    var m = HashMap<Any, Any>()
    "\"!'+*-.:=AHIMOTUVWXY^_ovwx| ".map { m[it] = it }
    R.indices.map { m[R[it]] = R[R.length - (it + 1)] }
    it.zip(it.reversed()).filter { m[it.first] != it.second }.none()
}

Prüfung

var i:(String)->Boolean =
{var R="(<[{qb/\\dp}]>)"
var m=HashMap<Any,Any>()
"\"!'+*-.:=AHIMOTUVWXY^_ovwx| ".map{m[it]=it}
R.indices.map{m[R[it]]=R[R.length-(it+1)]}
it.zip(it.reversed()).filter{m[it.first]!=it.second}.none()}
fun main(args: Array<String>) {
    var GOOD = listOf("()()",
            "()()()",
            "[A + A]",
            "WOW ! WOW",
            "OH-AH_wx'xw_HA-HO",
            "(<<[[[T*T]]]>>)",
            "(:)",
            ")-(",
            "())(()",
            "qpqp")

    var BAD = listOf("())(",
            "((B))",
            "11",
            "+-*+-",
            "WOW ! wow",
            "(;)",
            "qppq")

    GOOD.filterNot { i(it) }.forEach { throw AssertionError(it) }
    BAD.filter { i(it) }.forEach { throw AssertionError(it) }
    println("Test Passed")
}

Kann nicht mit TIO ausgeführt werden, da 1.1 nicht unterstützt wird

jrtapsell
quelle
Sie können es mit 1.0 zum Laufen bringen, indem Sie HashMap importieren. Probieren Sie es online aus!
CAD97
Wäre meine Punktzahl mit oder ohne den Import?
Jrtapsell
Da der Import nur ein Shim ist, damit er mit 1.0 funktioniert, wo er mit 1.1 so wie er ist, solange die Antwort 1.1 angibt, werden Sie ohne den Import bewertet. Ich würde jedoch eine Notiz einfügen, nur für den Fall, dass jemand nicht weiß, dass HashMap in 1.1 (effektiv) automatisch importiert wird.
CAD97
2

Python 2 , 182 167 163 162 160 158 Bytes

lambda s:s[::-1]==s.translate(m(t+w,w+t),m("","").translate(None," !\"'+*-.:=AHIMOTUVWXY^_ovwx|"+t+w))
from string import*
m=maketrans
t=")>[{/qd"
w="(<]}\pb"

Probieren Sie es online!

2 Bytes dank Jonathan Allan gespeichert

Erklärung Zuerst müssen wir die Liste aller Zeichen erstellen, die keine Symmetrie haben (das Zeichen selbst:, A... oder ein anderes Zeichen (für ), ...):

  • m("","") Gibt eine Zeichenfolge mit allen verfügbaren Zeichen zurück.

  • m("","").translate(None," \t!\"'+*-.:=AHIMOTUVWXY^_ovwx|"+t+w)) Entfernt aus allen verfügbaren Zeichen die Zeichen, die eine Symmetrie haben.

Dann ordnen wir jedes Zeichen seinem symmetrischen Zeichen zu und entfernen die Zeichen, die kein symmetrisches Zeichen haben s.translate(m(t+w,w+t),<chars that don't have a symmetric>)

Wenn das Ergebnis der umgekehrten Zeichenfolge entspricht, haben wir eine symmetrische Zeichenfolge.

jferard
quelle
Wenn Sie die Schrägstriche vom rechten Ende wegbewegen tund wauf die Flucht verzichten können, z w="(<]{\pb". Speichern Sie ein weiteres Byte mit from string import*;m=maketrans(ich persönlich gehe für eine neue Zeile, wenn das ;nicht Bytes speichert). Außerdem brauchen Sie die Funktion nicht zu benennen, solange sie wiederverwendbar und nicht rekursiv ist, wodurch weitere 2
Jonathan Allan
Sie brauchen die Funktion auch nicht zu benennen, solange sie wiederverwendbar und nicht rekursiv ist, was weitere 2 TIO spart (Hinweis: Der von Ihnen aufgeführte Code und Ihr Link sind 162 Bytes)
Jonathan Allan
@ JonathanAllan danke. Ich hatte bereits die zwei Bytes für (mental) entfernt f=, aber Ihre Version ist sauberer.
jferard
1

Scala , 140 Bytes

s.zip(s.reverse).forall(c=>(" !\"'+*-.:=AHIMOTUVWXY^_ovwx|".flatMap(x=>x+""+x)+"()<>[]{}qpbd/\\\\/dbpq}{][><)(").indexOf(c._1+""+c._2)%2==0)

Probieren Sie es online!

kubischer Salat
quelle