Eu sou simétrico, não palindrômico!

22

fundo

Inspirado por eu sou um palíndromo. Você está?, onde é apresentado o fato chocante de que “ ()()não é um palíndromo, mas ())(”, perguntei-me o que é ()()e a resposta é simplesmente: é uma corda com um eixo de simetria vertical!

A tarefa

Escreva um programa ou função que use uma string S (ou o equivalente apropriado no seu idioma) como entrada, verifique a simetria no eixo vertical e retorne um valor verdadeiro ou falso de acordo. Você pode usar qualquer meio razoável para receber a entrada e fornecer a saída.

Simetria reflexiva

Simetria reflexiva em torno de um eixo vertical (ou simetria esquerda-direita) significa que, se você colocar um espelho verticalmente no centro exato da sequência, a imagem refletida da primeira metade da sequência será idêntica à segunda metade da sequência.

Por exemplo, as seguintes seqüências de caracteres são simétricas de reflexão em torno de um eixo vertical:

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

enquanto o seguinte não é:

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

Regras do concurso

• Seu programa ou função receberá apenas caracteres ASCII imprimíveis. Você pode incluir ou não a sequência vazia (que é simétrica, é claro!) Como entrada legal, o que é melhor para você.

• Os caracteres ASCII que podem ser considerados simétricos em relação aos eixos verticais são os seguintes (observe o espaço inicial e a diferença entre letras maiúsculas e minúsculas):

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

Os caracteres ASCII que podem ser considerados "espelhados" e seus caracteres correspondentes são:

()<>[]{}qpbd/\

Note-se que, uma vez que eles são espelhados, você pode ter os dois (), bem como )(,/\ e \/, etc.

Todos os outros caracteres imprimíveis ASCII devem ser considerados assimétricos e sem um caractere correspondente espelhado.

• Este é um desafio do : quanto menor o seu programa, medido em bytes, melhor, em qualquer linguagem de programação.

• Parabéns para as pessoas que produzirão um programa simétrico!

Nota : esta pergunta não é uma duplicata do "Palíndromo Conveniente" , que requer a verificação de cadeias palindrômicas nas quais os parênteses são invertidos. Essa questão é diferente por dois motivos:

1) é uma restrição da outra pergunta no que diz respeito aos caracteres que não estão entre parênteses, uma vez que apenas caracteres simétricos podem aparecer na ordem inversa.

2) Uma vez que é baseado no conceito de simetria, e não em um conceito de “palíndromo conveniente”, caracteres espelhados podem aparecer tanto em ordem, ou seja, []e ][, e isso faz com que o programa para resolvê-lo diferente de programas que resolver o outro problema .

Renzo
fonte
6
Apenas para quem se pergunta, o carvão vegetal não reflete letras. :(
totallyhuman
4
Eu discordo da bobagem, pois o alvo da bobagem não reflete letras e isso faz.
Stephen
Desculpe, eu perdi os exemplos, o meu erro
jrtapsell
6
Por que não é 8considerado "simétrico"?
Scott Milner
2
@FunkyComputerMan Não é essencialmente o mesmo que o alvo idiota . Em primeiro lugar, isso não tem restrição de código-fonte.
Jonathan Allan

Respostas:

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: salvou 5 bytes graças a @Arnauld. Salvou mais 11 bytes graças a @YairRand.

Neil
fonte
Você poderia usar um regexp em vez de includes()? Tais como /[- !"'+*.:=AHIMO^_ovwx|T-Y]/.test(c).
Arnauld
@ Arnauld De fato, esse intervalo é muito útil, obrigado!
Neil
Você pode jogar golfe [...s].reverse().map(...): s::[].map().reverse()se estiver bem com o uso dos novos recursos do ES-next. link
Downgoat 12/09/17
@Downgoat Você tem um link para as especificações desse recurso?
Neil
1
@Neil here
Downgoat
5

Geléia , 69 62 bytes

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

Experimente online!

Todos os casos de teste

-7 bytes graças a @JonathanAllan

Como 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
fonte
Salve seis bytes usando um filtro: ¢FiЀ;1Ạðaµ¢yU⁼->¢Ff@ð¢yU⁼
Jonathan Allan
Salve outro usando o registro (todos em uma linha agora):...}pd\”,Ṛ$Fœs©2Ff@ð®yU⁼
Jonathan Allan
(... embora ao mesmo comprimento ...}pd\”,Ṛ$F©f@ð®œs2¤yU⁼é indiscutivelmente melhor)
Jonathan Allan
Foi encontrado outro salvamento de um byte , codificando apenas um de cada par de ordinais adjacentes do conjunto simétrico (edição de comentário excluído com melhor 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))

Economizou 13 bytes graças a Jonathan Allan.

L3viathan
fonte
1
Economize 9 bytes : 1. ordem inversa de barras, para que não seja necessário escapar; 2. uso 2*xe range(7); 3. use multiplicação para evitar o >2teste; 4. use bit a bit não no len(S)para evitar o notde not len(S)%2; 5. usar o fato de que ''in'blah'é Truepara permitir a multiplicação corda ~len(S)%2*s[len(S)//2]in s.
Jonathan Allan
1
Economize mais 4 em tudo
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Κ}=

Experimente aqui!

~ 24 bytes para adicionar qpbdespelhamento e 6 bytes para (x-1 XOR 1) + 1: /

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

Embelezado

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

Teste

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

Não é possível executar no TIO porque 1.1 não é suportado

jrtapsell
fonte
Você pode fazê-lo funcionar no 1.0 apenas importando o HashMap Experimente online!
quer
Minha pontuação seria com ou sem a importação?
Jrtapsell # 10/17
já que a importação é apenas um calço para que ele funcione na versão 1.0, onde funciona na 1.1 como está, desde que a resposta especifique 1.1, você seria pontuado sem a importação. Eu colocaria uma observação, no caso de alguém não saber que o HashMap é (efetivamente) importado no 1.1 automaticamente.
quer
2

Python 2 , 182 167 163 162 160 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"

Experimente online!

Guardado 2 bytes graças a Jonathan Allan

Explicação Primeiro, precisamos construir a lista de todos os caracteres que não possuem um simétrico (o próprio caractere:, A... ou outro caractere (para ), ...):

  • m("","") retorna uma string com todos os caracteres disponíveis.

  • m("","").translate(None," \t!\"'+*-.:=AHIMOTUVWXY^_ovwx|"+t+w)) remove de todos os caracteres disponíveis os caracteres simétricos.

Em seguida, mapeamos cada caractere para seu caractere simétrico e removemos os caracteres que não possuem um simétrico com s.translate(m(t+w,w+t),<chars that don't have a symmetric>)

Se o resultado for igual à sequência invertida, teremos uma sequência simétrica.

jferard
fonte
Se você mover as barras a partir da extremidade direita te wpuder renunciar à fuga, por exemplo w="(<]{\pb". Salve outro byte com from string import*;m=maketrans(eu pessoalmente uso uma nova linha quando o ;arquivo não salva bytes). Além disso, você não precisa nomear a função, desde que ele é reutilizável e não recursiva, o que economiza outro 2.
Jonathan Allan
Além disso, você não precisa nomear a função, desde que seja reutilizável e não recursiva, o que economiza outros 2 TIO (nota: o código que você listou e no seu link é 162 bytes)
Jonathan Allan
@JonathanAllan thanks. Eu já havia removido (mentalmente) os dois bytes de f=, mas sua versão é mais limpa.
jferard
1

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

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

Experimente online!

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

Experimente online!

alface cúbica
fonte