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 código de golfe 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 .
8
considerado "simétrico"?Respostas:
JavaScript (ES6),
130125113 bytesEditar: salvou 5 bytes graças a @Arnauld. Salvou mais 11 bytes graças a @YairRand.
fonte
includes()
? Tais como/[- !"'+*.:=AHIMO^_ovwx|T-Y]/.test(c)
.[...s].reverse().map(...)
:s::[].map().reverse()
se estiver bem com o uso dos novos recursos do ES-next. linkGeléia ,
6962 bytesExperimente online!
Todos os casos de teste
-7 bytes graças a @JonathanAllan
Como funciona
fonte
¢FiЀ;1Ạðaµ¢yU⁼
->¢Ff@ð¢yU⁼
...}pd\”,Ṛ$Fœs©2Ff@ð®yU⁼
...}pd\”,Ṛ$F©f@ð®œs2¤yU⁼
é indiscutivelmente melhor)Python 3,
211208195 bytesEconomizou 13 bytes graças a Jonathan Allan.
fonte
2*x
erange(7)
; 3. use multiplicação para evitar o>2
teste; 4. use bit a bit não nolen(S)
para evitar onot
denot len(S)%2
; 5. usar o fato de que''in'blah'
éTrue
para permitir a multiplicação corda~len(S)%2*s[len(S)//2]in s
.SOGL V0.12 , 88 bytes
Experimente aqui!
~ 24 bytes para adicionar
qpbd
espelhamento e 6 bytes para(x-1 XOR 1) + 1
: /fonte
Kotlin 1.1,
201199 bytesEmbelezado
Teste
Não é possível executar no TIO porque 1.1 não é suportado
fonte
Python 2 ,
182167163162160 160158 bytesExperimente 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.
fonte
t
ew
puder renunciar à fuga, por exemplow="(<]{\pb"
. Salve outro byte comfrom 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.f=
, mas sua versão é mais limpa.Perl 5 , 102 + 1 (-p) = 103 bytes
Experimente online!
fonte
Scala , 140 bytes
Experimente online!
fonte