Sono simmetrico, non palindromico!


22

sfondo

Ispirato da Sono un palindromo. Tu sei? , dove si presenta il fatto scioccante che " ()()non è un palindromo, ma ())(", mi sono chiesto cosa sia invece ()()e la risposta è semplicemente: è una stringa con un asse di simmetria verticale!

L'obiettivo

Scrivi un programma o una funzione che accetta come input una stringa S (o l'equivalente appropriato nella tua lingua), verifica la simmetria lungo l'asse verticale e restituisce un valore di verità o falsa di conseguenza. È possibile utilizzare qualsiasi mezzo ragionevole per accettare l'input e fornire l'output.

Simmetria riflessiva

La simmetria riflettente attorno ad un asse verticale (o simmetria sinistra-destra) significa che se si posiziona uno specchio verticalmente nel centro esatto della stringa, l'immagine riflessa della prima metà della stringa è identica alla seconda metà della stringa.

Ad esempio, le seguenti stringhe sono simmetriche riflettenti attorno ad un asse verticale:

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

mentre i seguenti non sono:

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

Regole del concorso

• Il programma o la funzione riceverà solo caratteri ASCII stampabili. Puoi includere o meno la stringa vuota, (che è simmetrica, ovviamente!) Come input legale, che è meglio per te.

• I caratteri ASCII che possono essere considerati simmetrici rispetto agli assi verticali sono i seguenti (notare lo spazio iniziale e la differenza tra lettere maiuscole e minuscole):

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

I caratteri ASCII che possono essere considerati "specchiati" e i loro caratteri corrispondenti sono:

()<>[]{}qpbd/\

Si noti che, poiché sono sottoposti a mirroring, è possibile avere sia ()così come )(, /\e \/, ecc.

Tutti gli altri caratteri stampabili ASCII devono essere considerati asimmetrici e senza un carattere corrispondente speculare.

• Questa è una sfida di : più breve è il tuo programma, misurato in byte, migliore è, in qualsiasi linguaggio di programmazione.

• Complimenti alle persone che produrranno un programma simmetrico!

Nota : questa domanda non è un duplicato di "Convenient Palindrome" , che richiede di controllare le stringhe palindromiche in cui vengono capovolte le parentesi. Questa domanda è diversa per due motivi:

1) è una restrizione dell'altra domanda per quanto riguarda i caratteri non parentesi, poiché solo i caratteri simmetrici possono apparire in ordine inverso.

2) Dal momento che si basa sul concetto di simmetria e non su un concetto di "comodo palindromo", i caratteri specchiati possono apparire in entrambi gli ordini, cioè []e ][, e questo rende il programma per risolverlo diverso dai programmi che risolvono l'altro problema .


6
Solo per chiunque si chieda, il carbone non riflette le lettere. :(
totalmente umano il

4
Non sono d'accordo con il dupeyness, in quanto il target dupe non riflette le lettere e questo accade.
Stephen,

Scusa, ho perso gli esempi, il mio errore
jrtapsell,

6
Perché non è 8considerato "simmetrico"?
Scott Milner,

2
@FunkyComputerMan Non è sostanzialmente lo stesso del target duplicato . Innanzitutto, ciò non ha alcuna restrizione al codice sorgente.
Jonathan Allan,

Risposte:


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>

Modifica: salvato 5 byte grazie a @Arnauld. Salvati ulteriori 11 byte grazie a @YairRand.


Potresti usare una regexp invece di includes()? Come /[- !"'+*.:=AHIMO^_ovwx|T-Y]/.test(c).
Arnauld,

@Arnauld In effetti, questa gamma è molto utile, grazie!
Neil,

Puoi giocare [...s].reverse().map(...)a golf : s::[].map().reverse()se stai bene usando le nuove funzionalità ES-next. link
Downgoat,

@Downgoat Hai un link alle specifiche di quella funzione?
Neil,

1
@Neil qui
Downgoat,

5

Gelatina , 69 62 byte

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

Provalo online!

Tutti i casi di test

-7 byte grazie a @JonathanAllan

Come funziona

“(<[{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.

Salva sei byte usando un filtro: ¢FiЀ;1Ạðaµ¢yU⁼->¢Ff@ð¢yU⁼
Jonathan Allan,

Salvane un altro usando il registro (tutto su una riga ora):...}pd\”,Ṛ$Fœs©2Ff@ð®yU⁼
Jonathan Allan,

(... anche se alla stessa lunghezza ...}pd\”,Ṛ$F©f@ð®œs2¤yU⁼è probabilmente più bello)
Jonathan Allan,

Trovato un altro salvataggio di un byte codificando solo per una di ciascuna coppia di ordinali adiacenti dal set simmetrico (modifica del commento eliminato con codice migliore)
Jonathan Allan,

4

Python 3, 211 208 195 byte

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))

Salvato 13 byte grazie a Jonathan Allan.


1
Salva 9 byte : 1. inverti l'ordine delle barre in modo da non dover scappare; 2. utilizzare 2*xe range(7); 3. utilizzare la moltiplicazione per evitare il >2test; 4. usare bit per bit non su len(S)per evitare notdi not len(S)%2; 5. utilizzare il fatto che ''in'blah'è Trueper consentire la moltiplicazione di stringhe ~len(S)%2*s[len(S)//2]in s.
Jonathan Allan,


2

SOGL V0.12 , 88 byte

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

Provalo qui!

~ 24 byte per aggiungere il qpbdmirroring e 6 byte per (x-1 XOR 1) + 1: /


2

Kotlin 1.1, 201 199 byte

{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()}

Abbellire

{
    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()
}

Test

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")
}

Impossibile eseguire su TIO perché 1.1 non è supportato


Puoi farlo funzionare su 1.0 semplicemente importando HashMap Provalo online!
CAD97,

Il mio punteggio sarebbe con o senza l'importazione?
jrtapsell,

poiché l'importazione è solo uno shim per farlo funzionare su 1.0, dove funziona su 1.1 così com'è, fintanto che la risposta specifica 1.1 verrai segnato senza l'importazione. Metterei una nota però, nel caso in cui qualcuno non sapesse che HashMap è (effettivamente) importato automaticamente in 1.1.
CAD97,

2

Python 2 , 182 167 163 162 160 158 byte

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"

Provalo online!

Salvato 2 byte grazie a Jonathan Allan

Spiegazione Per prima cosa, dobbiamo costruire l'elenco di tutti i caratteri che non hanno un simmetrico (il carattere stesso:, A... o un altro carattere (per ), ...):

  • m("","") restituisce una stringa con tutti i caratteri disponibili.

  • m("","").translate(None," \t!\"'+*-.:=AHIMOTUVWXY^_ovwx|"+t+w)) rimuove da tutti i caratteri disponibili i caratteri che hanno un carattere simmetrico.

Quindi, mappiamo ogni carattere al suo carattere simmetrico e rimuoviamo i caratteri che non hanno un carattere simmetrico s.translate(m(t+w,w+t),<chars that don't have a symmetric>)

Se il risultato è uguale alla stringa invertita, abbiamo una stringa simmetrica.


Se sposti le barre dall'estremità destra di te wpuoi rinunciare alla fuga, ad es w="(<]{\pb". Salvare un altro byte con from string import*;m=maketrans(io personalmente scelgo una nuova riga quando ;non salva byte). Inoltre, non è necessario assegnare un nome alla funzione, purché sia ​​riutilizzabile e non ricorsiva, il che consente di risparmiare un altro 2.
Jonathan Allan,

Inoltre, non è necessario assegnare un nome alla funzione purché sia ​​riutilizzabile e non ricorsiva, il che consente di salvare altri 2 TIO (nota: il codice che hai elencato e al tuo link è di 162 byte)
Jonathan Allan,

@JonathanAllan grazie. Avevo già rimosso (mentalmente) i due byte per f=, ma la tua versione è più pulita.
jferard,

1

Perl 5 , 102 + 1 (-p) = 103 byte

$_=!/[^ !"'+*.:=AHIMOT-Y^_ovwx|()<>[\]{}qpbd\/\\-]/&&$_ eq reverse y|()<>[]{}qpbd/\\|)(><][}{pqdb\\/|r

Provalo online!


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.