¡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 .


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.


¿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.

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.


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


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: /


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


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.


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


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.