¡Soy simétrico, no palindrómico!

22

Fondo

Inspirado en que soy un palíndromo. ¿Eres tú? , donde se presenta el hecho impactante de que " ()()no es un palíndromo, pero ())(", me pregunté qué es ()()y la respuesta es simplemente: ¡es una cuerda con un eje de simetría vertical!

La tarea

Escriba un programa o función que tome una cadena S (o el equivalente apropiado en su idioma) como entrada, verifique la simetría a lo largo del eje vertical y devuelva un valor verdadero o falso en consecuencia. Puede utilizar cualquier medio razonable para tomar la entrada y proporcionar la salida.

Simetría reflexiva

La simetría de reflexión alrededor de un eje vertical (o simetría izquierda-derecha) significa que si coloca un espejo verticalmente en el centro exacto de la cuerda, la imagen reflejada de la primera mitad de la cuerda es idéntica a la segunda mitad de la cuerda.

Por ejemplo, las siguientes cadenas son simétricas de reflexión alrededor de un eje vertical:

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

mientras que los siguientes no son:

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

Reglas del concurso

• Su programa o función recibirá solo caracteres ASCII imprimibles. Puede incluir o no la cadena vacía (que es simétrica, por supuesto) como entrada legal, lo que es mejor para usted.

• Los caracteres ASCII que pueden considerarse simétricos con respecto a los ejes verticales son los siguientes (observe el espacio inicial y la diferencia entre letras mayúsculas y minúsculas):

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

Los caracteres ASCII que pueden considerarse "reflejados" y sus caracteres correspondientes son:

()<>[]{}qpbd/\

Tenga en cuenta que, dado que están reflejados, puede tener ambos (), así como )(, /\y \/, etc.

Todos los demás caracteres imprimibles ASCII deben considerarse asimétricos y sin un carácter correspondiente reflejado.

• Este es un desafío de : cuanto más corto sea su programa, medido en bytes, mejor, en cualquier lenguaje de programación.

• ¡Felicitaciones a las personas que producirán un programa simétrico!

Nota : esta pregunta no es un duplicado de "Palindrome conveniente" , que requiere verificar las cadenas palindrómicas en las que se invierten los paréntesis. Esta pregunta es diferente por dos razones:

1) es una restricción de la otra pregunta para lo que concierne a los caracteres sin paréntesis, ya que solo los caracteres simétricos pueden aparecer en orden inverso.

2) Dado que se basa en el concepto de simetría, y no en un concepto de “palíndromo conveniente”, personajes de espejo pueden aparecer tanto en el orden, es decir, []y ][, y esto hace que el programa de resolverlo diferente de los programas que resuelven el otro problema .

Renzo
fuente
66
Para cualquiera que se pregunte, el carbón no refleja las letras. :(
totalmente humano
44
No estoy de acuerdo con el dupeyness, ya que el objetivo del dupe no refleja letras y esto sí.
Stephen
Lo siento, me perdí los ejemplos, mi error
jrtapsell
66
¿Por qué no se 8considera "simétrico"?
Scott Milner
2
@ FunkyComputerMan No es esencialmente lo mismo que el objetivo de engaño . En primer lugar, esto no tiene restricción de código fuente.
Jonathan Allan

Respuestas:

7

JavaScript (ES6), 130 125 113 bytes

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>

Editar: Guardado 5 bytes gracias a @Arnauld. Ahorró otros 11 bytes gracias a @YairRand.

Neil
fuente
¿Podrías usar una expresión regular en lugar de includes()? Tales como /[- !"'+*.:=AHIMO^_ovwx|T-Y]/.test(c).
Arnauld
@Arnauld De hecho, ese rango es muy útil, ¡gracias!
Neil
Puede jugar golf [...s].reverse().map(...): s::[].map().reverse()si está de acuerdo con el uso de las nuevas funciones ES-next. enlace
Downgoat
@Downgoat ¿Tiene un enlace a la especificación de esa característica?
Neil
1
@Neil aquí
Downgoat
5

Gelatina , 69 62 bytes

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

Pruébalo en línea!

Todos los casos de prueba

-7 bytes gracias a @JonathanAllan

Cómo funciona

“(<[{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
fuente
Ahorre seis bytes usando un filtro: ¢FiЀ;1Ạðaµ¢yU⁼->¢Ff@ð¢yU⁼
Jonathan Allan
Guarde otro utilizando el registro (todo en una línea ahora):...}pd\”,Ṛ$Fœs©2Ff@ð®yU⁼
Jonathan Allan
(... aunque a la misma longitud ...}pd\”,Ṛ$F©f@ð®œs2¤yU⁼es posiblemente más agradable)
Jonathan Allan
Encontré otro byte salvo al codificar solo uno de cada par de ordinales adyacentes del conjunto simétrico (edición de comentario eliminado con mejor código)
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))

Guardado 13 bytes gracias a Jonathan Allan.

L3viatán
fuente
1
Ahorre 9 bytes : 1. invierta el orden de las barras inclinadas para que no sea necesario escapar; 2. uso 2*xy range(7); 3. use la multiplicación para evitar la >2prueba; 4. use bit a bit no en el len(S)para evitar el notde not len(S)%2; 5. Utilice el hecho de que ''in'blah'es Truepara permitir la multiplicación de cadena ~len(S)%2*s[len(S)//2]in s.
Jonathan Allan
1
Ahorre 4 más en línea todo
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Κ}=

Pruébalo aquí!

~ 24 bytes para agregar qpbdreflejo y 6 bytes para (x-1 XOR 1) + 1: /

dzaima
fuente
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()}

Embellecido

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

Prueba

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

No se puede ejecutar en TIO porque 1.1 no es compatible

jrtapsell
fuente
Puede hacerlo funcionar en 1.0 simplemente importando HashMap ¡ Pruébelo en línea!
CAD97
¿Mi puntaje estaría con o sin la importación?
jrtapsell
dado que la importación es solo una cuña para que funcione en 1.0, donde funciona en 1.1 tal como está, siempre y cuando la respuesta especifique 1.1 se puntuaría sin la importación. Sin embargo, pondría una nota, en caso de que alguien no sepa que HashMap se importa (efectivamente) en 1.1 automáticamente.
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"

Pruébalo en línea!

Guardado 2 bytes gracias a Jonathan Allan

Explicación Primero, necesitamos construir la lista de todos los caracteres que no tienen una simétrica (el propio carácter:, A... u otro carácter (para ), ...):

  • m("","") devuelve una cadena con todos los caracteres disponibles.

  • m("","").translate(None," \t!\"'+*-.:=AHIMOTUVWXY^_ovwx|"+t+w)) elimina de todos los caracteres disponibles los caracteres que tienen una simétrica.

Luego, asignamos cada carácter a su carácter simétrico y eliminamos los caracteres que no tienen un carácter simétrico con s.translate(m(t+w,w+t),<chars that don't have a symmetric>)

Si el resultado es igual a la cadena invertida, tenemos una cadena simétrica.

jferard
fuente
Si mueve las barras desde el extremo derecho de ty wpuede evitar el escape, por ejemplo w="(<]{\pb". Guarde otro byte con from string import*;m=maketrans(personalmente voy por una nueva línea cuando ;no guarda bytes). Además, no necesita nombrar la función siempre que sea reutilizable y no recursiva, lo que ahorra otros 2.
Jonathan Allan
Además, no necesita nombrar la función siempre que sea reutilizable y no recursiva, lo que ahorra otros 2 TIO (nota: el código que ha enumerado y en su enlace es de 162 bytes)
Jonathan Allan
@ JonathanAllan gracias. Ya había eliminado (mentalmente) los dos bytes f=, pero su versión es más limpia.
jferard
1

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

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

Pruébalo en línea!

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

Pruébalo en línea!

lechuga cubica
fuente