Je suis symétrique, pas palindromique!


22

Contexte

Inspiré par I'm a palindrome. Es-tu? , où il est présenté le fait choquant que "ce ()()n'est pas un palindrome, mais ())(", je me suis demandé ce que c'est ()()et la réponse est simple: c'est une corde avec un axe de symétrie vertical!

La tâche

Écrivez un programme ou une fonction qui prend en entrée une chaîne S (ou l'équivalent approprié dans votre langue), vérifie la symétrie le long de l'axe vertical et renvoie une valeur véridique ou fausse en conséquence. Vous pouvez utiliser tous les moyens raisonnables pour prendre l'entrée et fournir la sortie.

Symétrie réflexionnelle

La symétrie réflexive autour d'un axe vertical (ou symétrie gauche-droite) signifie que si vous placez un miroir verticalement au centre exact de la chaîne, l'image réfléchie de la première moitié de la chaîne est identique à la seconde moitié de la chaîne.

Par exemple, les chaînes suivantes sont symétriques par réflexion autour d'un axe vertical:

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

alors que les suivants ne le sont pas:

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

Règlement du concours

• Votre programme ou fonction ne recevra que des caractères ASCII imprimables. Vous pouvez inclure ou non la chaîne vide, (qui est symétrique, bien sûr!) Comme entrée légale, ce qui est mieux pour vous.

• Les caractères ASCII qui peuvent être considérés comme symétriques par rapport aux axes verticaux sont les suivants (notez l'espace initial et la différence entre les majuscules et les minuscules):

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

Les caractères ASCII qui peuvent être considérés comme «en miroir» et leurs caractères correspondants sont:

()<>[]{}qpbd/\

Notez que, comme ils sont en miroir, vous pouvez avoir à la fois ()ainsi que )(, /\et \/, etc.

Tous les autres caractères imprimables ASCII doivent être considérés comme asymétriques et sans caractère correspondant en miroir.

• C'est un défi de : plus votre programme est court, mesuré en octets, mieux c'est, dans n'importe quel langage de programmation.

• Félicitations aux personnes qui produiront un programme symétrique!

Remarque : cette question n'est pas un doublon de "Palindrome pratique" , qui nécessite de vérifier les chaînes palindromiques dans lesquelles les parenthèses sont inversées. Cette question est différente pour deux raisons:

1) c'est une restriction de l'autre question pour ce qui concerne les caractères non parenthèses, puisque seuls les caractères symétriques peuvent apparaître dans l'ordre inverse.

2) Puisqu'il est basé sur le concept de symétrie et non sur un concept de «palindrome commode», les caractères en miroir peuvent apparaître dans les deux ordres, c'est []-à- dire et ][, ce qui rend le programme pour le résoudre différent des programmes qui résolvent l'autre problème. .


6
Pour tous ceux qui se demandent, le charbon ne reflète pas les lettres. :(
totalement humain

4
Je ne suis pas d'accord avec la duperie, car la cible de dupe ne reflète pas les lettres et cela le fait.
Stephen

Désolé, j'ai raté les exemples, mon erreur
jrtapsell

6
Pourquoi n'est-il pas 8considéré comme "symétrique"?
Scott Milner

2
@FunkyComputerMan Ce n'est pas du tout la même chose que la cible dupe . Tout d'abord, cela n'a aucune restriction de code source.
Jonathan Allan

Réponses:


7

JavaScript (ES6), 130 125 113 octets

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>

Edit: 5 octets enregistrés grâce à @Arnauld. 11 octets supplémentaires enregistrés grâce à @YairRand.


Pourriez-vous utiliser une expression rationnelle au lieu de includes()? Tels que /[- !"'+*.:=AHIMO^_ovwx|T-Y]/.test(c).
Arnauld du

@Arnauld En effet, cette gamme est très utile, merci!
Neil

Vous pouvez jouer [...s].reverse().map(...)au golf à: s::[].map().reverse()si vous êtes d'accord avec l'utilisation de nouvelles fonctionnalités ES-next. lien
Downgoat

@Downgoat Avez-vous un lien vers les spécifications de cette fonctionnalité?
Neil

1
@Neil ici
Downgoat

5

Gelée , 69 62 octets

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

Essayez-le en ligne!

Tous les cas de test

-7 octets grâce à @JonathanAllan

Comment ça marche

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

Économisez six octets en utilisant un filtre: ¢FiЀ;1Ạðaµ¢yU⁼->¢Ff@ð¢yU⁼
Jonathan Allan

Enregistrez-en un autre en utilisant le registre (le tout sur une seule ligne maintenant):...}pd\”,Ṛ$Fœs©2Ff@ð®yU⁼
Jonathan Allan

(... bien que la même durée ...}pd\”,Ṛ$F©f@ð®œs2¤yU⁼soit sans doute plus agréable)
Jonathan Allan

Trouvé un autre octet enregistré en n'encodant que pour chaque paire d'ordinaux adjacents de l'ensemble symétrique (modification du commentaire supprimé avec un meilleur code)
Jonathan Allan

4

Python 3, 211 208 195 octets

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

Enregistré 13 octets grâce à Jonathan Allan.


1
Économisez 9 octets : 1. ordre inverse des barres obliques, donc pas besoin de s'échapper; 2. utiliser 2*xet range(7); 3. utiliser la multiplication pour éviter le >2test; 4. utilisez au niveau du bit pas sur le len(S)pour éviter le notde not len(S)%2; 5. utiliser le fait que ''in'blah'c'est Truepour permettre la multiplication des chaînes ~len(S)%2*s[len(S)//2]in s.
Jonathan Allan


2

SOGL V0.12 , 88 octets

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

Essayez-le ici!

~ 24 octets pour ajouter la qpbdmise en miroir et 6 octets pour(x-1 XOR 1) + 1 : /


2

Kotlin 1.1, 201 199 octets

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

Embellie

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

Tester

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

Impossible de s'exécuter sur TIO car 1.1 n'est pas pris en charge


Vous pouvez le faire fonctionner sur 1.0 en important simplement HashMap Essayez-le en ligne!
CAD97

Mon score serait-il avec ou sans l'importation?
jrtapsell

puisque l'importation n'est qu'une cale pour le faire fonctionner sur 1.0, où il fonctionne sur 1.1 tel quel, tant que la réponse spécifie 1.1, vous seriez noté sans l'importation. Je mettrais une note cependant, juste au cas où quelqu'un ne sait pas que HashMap est (effectivement) importé en 1.1 automatiquement.
CAD97

2

Python 2 , 182 167 163 162 162 160 158 octets

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"

Essayez-le en ligne!

Enregistré 2 octets grâce à Jonathan Allan

Explication Tout d'abord, nous devons construire la liste de tous les caractères qui n'ont pas de symétrie (le caractère lui-même:, A... ou un autre caractère (pour ), ...):

  • m("","") renvoie une chaîne avec tous les caractères disponibles.

  • m("","").translate(None," \t!\"'+*-.:=AHIMOTUVWXY^_ovwx|"+t+w)) supprime de tous les caractères disponibles les caractères qui ont une symétrie.

Ensuite, nous mappons chaque caractère à son caractère symétrique et supprimons les caractères qui n'ont pas de caractère symétrique avec s.translate(m(t+w,w+t),<chars that don't have a symmetric>)

Si le résultat est égal à la chaîne inversée, nous avons une chaîne symétrique.


Si vous déplacez les barres obliques de l'extrémité droite de tet wvous pouvez renoncer à la fuite, par exemple w="(<]{\pb". Enregistrer un autre octet avec from string import*;m=maketrans(personnellement, je vais pour une nouvelle ligne lorsque le ;ne sauvegarde pas les octets). De plus, vous n'avez pas besoin de nommer la fonction tant qu'elle est réutilisable et non récursive, ce qui économise encore 2.
Jonathan Allan

De plus, vous n'avez pas besoin de nommer la fonction tant qu'elle est réutilisable et non récursive, ce qui économise encore 2 TIO (remarque: le code que vous avez répertorié et sur votre lien est de 162 octets)
Jonathan Allan

@JonathanAllan merci. J'avais déjà supprimé (mentalement) les deux octets pour f=, mais votre version est plus propre.
jferard


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.