Cette chaîne est-elle un palindrome (en Morse)?

16

Défi

Inspiré par cette vidéo

Comme vous le savez peut-être, un palindrome est un mot qui est orthographié de la même manière en avant qu'en arrière. Le mot "PULP" n'est pas un palindrome, mais lorsqu'il est traduit en code Morse (avec l'espacement entre les lettres supprimé), "PULP" devient ". - ...-.-...--." qui est un palindrome. Votre tâche consiste à écrire un programme ou une fonction qui prend une chaîne et renvoie si ce mot est un palindrome dans le code Morse international.

A: .-
B: -...
C: -.-.
D: -..
E: .
F: ..-.
G: --.
H: ....
I: ..
J: .---
K: -.-
L: .-..
M: --
N: -.
O: ---
P: .--.
Q: --.-
R: .-.
S: ...
T: -
U: ..-
V: ...-
W: .--
X: -..-
Y: -.--
Z: --..

Règles

Contribution

L'entrée peut être prise dans n'importe quel format raisonnable. La chaîne d'entrée ne contiendra que des lettres dans tous les cas que vous préférez. La chaîne ne contiendra pas d'espaces, de chiffres ou de ponctuation.

Production

Votre programme devrait produire 1 sur 2 résultats distincts constants selon que l'entrée est un palindrome, par exemple Vrai / Faux, 1/0, HOTDOG / NOTHOTDOG

Notation

C'est du donc la réponse la plus courte en octets gagne. Les failles standard sont interdites.

Cas de test

Entrée => Sortie

"PULP"       => True
"RESEARCHER" => True
"HOTDOGS"    => True
""           => True
"A"          => False
"RACECAR"    => False
"PROGRAMMING"=> False
"PUZZLES"    => False
Cowabunghole
la source
en relation
Luis felipe De jesus Munoz
4
Seul mon vote est un marteau, je le ferais en tant que dupe du défi lié à Luis; l'essentiel de la plupart des solutions va convertir l'entrée en code Morse.
Shaggy
1
Il semble que toutes les solutions ne soient que des mappages de code Morse avec une vérification «identique à inverse», donc je ferme en double.
2018 à 4h05
2
C'est dommage que cela soit fermé comme un doublon, car la cible en double a spécifié (a) que l'entrée provient de l'entrée standard (fonctions interdites) et (b) il faut laisser non [AZ] | [Az] | [0- 9] tels qu'ils sont en entrée. Ensemble, ces réponses sont ici moins que triviales à mettre en communication.
Jonathan Allan
Oh mec - on dirait que je martèle aussi! Je pensais que je venais de faire un seul vote. Je l'ai refermé, mais je pense que ça ne devrait pas l'être.
Jonathan Allan

Réponses:

7

Gelée , 28 octets

ØAŻŻ“¡9o|çṫ¡X1ỴỌġQ’œ?iⱮḃ2FŒḂ

Essayez-le en ligne!

ØA                             The uppercase alphabet.
  ŻŻ                           Prepend two zeroes.
    “¡9o|çṫ¡X1ỴỌġQ’œ?          Get the 73540211105102870315464559332nd permutation.
                                  (= “ETIANMSURWDKGOHVF0L0PJBXCYZQ”)
                     iⱮ        Find indices of input letters in this list.
                       ḃ2      Bijective base 2: map [1,2,3,4,5…] to
                                 [1], [2], [1,1], [1,2], [2,1], …
                         F     Flatten.
                          ŒḂ   Is palindrome?

J'ai écrit cette réponse en regardant l'un d'eux (lisez les lignes de droite à gauche, et vous obtenez ma chaîne magique!):

enter image description here

Lynn
la source
73,540,211,105,102,870,315,464,559,332nd... quoi?! Comment avez-vous trouvé ce numéro? Comment cela ne prend-il pas une éternité pour fonctionner?
Urne de poulpe magique
@MagicOctopusUrn Fondamentalement, c'est un encodage de l'ordre des lettres dans cette chaîne par rapport à l'ordre 00ABCDEFGHIJKLMNOPQRSTUVWXYZ. Jelly a des fonctions intégrées pour convertir une permutation en un tel nombre, et un tel nombre en retour dans la permutation. Voir la base des nombres factoriels sur Wikipedia.
Lynn
1
C'est la chose la plus cool que j'ai vue depuis longtemps! Donc, fondamentalement, avec les factorielles, vous pouvez "savoir" où se situera la permutation, car les permutations sont effectuées dans un ordre spécifique. Est-ce un accès à temps constant? Linéaire? Journal? Quelque chose d'autre entièrement?
Urne de poulpe magique
7

Gelée ,  35 32 27  25 octets

-2 merci à Dennis (décaler la permutation pour éviter %32)

Oị“¡\ḣḶɼz3ç³ƝMƒ§’Œ?¤ḃ2FŒḂ

Prend la saisie en majuscules; la sortie est 1pour vrai, 0pour faux.

Essayez-le en ligne!Ou consultez la suite de tests .

Comment?

Oị“...’Œ?¤ḃ2FŒḂ - Link: list of characters (in [A-Za-z]), S   e.g. 'FoOl'
O               - to ordinals                                      [70,111,79,108]
 %32            - modulo by 32 (A->1, a->1, ...)                   [6,15,15,12]
         ¤      - nilad followed by link(s) as a nilad:
  “...’         -   base 250 literal = 41482574787853596522350494865
       Œ?       -   first permutation of [1,N] which resides at that
                -   index when all permutations of [1,N] are sorted
                -   = [8,16,10,24,26,27,18,20,4,23,25,11,1,17,13,15,3,22,12,19,6,5,14,21,28,9,7,2]
                - index into (modular-indexing & vectorises)       [17,14,14,19]
          ḃ2    - to bijective base 2 (vectorises)                 [[1,1,2,1],[2,2,2],[2,2,2],[1,2,1,1]]
            F   - flatten                                          [1,1,0,1,0,0,0,0,0,0,1,0,1,1]
             ŒḂ - is palindromic?                                  1

Solution précédente de 35 octets (prend également les entrées en majuscules) ...

ØẠḣ29“...’œ?iⱮ⁸d⁴BnⱮ/€FŒḂ - Link: list of characters (in [A-Z] only), S
ØẠ                        - alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
  ḣ29                     - head to index 29 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabc'
     “...’                - base 250 literal = 1222276956185766767980461920692
          œ?              - permutation at index = 'EAIWRUSJPaLbFVHcTNMDKGOBXCYZQ'
              ⁸           - chain's left argument = S       e.g. 'FOOL'
             Ɱ            - map with:
            i             -   first index of (char in 'EAI...')  [13,23,23,11]
                ⁴         - literal 16                           16
               d          - divmod                               [[0,13],[1,7],[1,7],[0,11]]
                 B        - to binary (vectorises)               [[[0],[1,1,0,1]],[[1],[1,1,1]],[[1],[1,1,1]],[[0],[1,0,1,1]]]
                     €    - for each:
                    /     -   reduce by:
                   Ɱ      -     map with:
                  n       -       not equal                      [[1,1,0,1],[0,0,0],[0,0,0],[1,0,1,1]]
                      F   - flatten                              [1,1,0,1,0,0,0,0,0,0,1,0,1,1]
                       ŒḂ - is palindromic?                      1
Jonathan Allan
la source
2

MBASIC , 325 octets

Première tentative, avant que les gros canons n'arrivent :-)

1 DATA .-,-...,-.-.,-..,.,..-.,--.,....,..,.---,-.-,.-..,--,-.,---,.--.,--.-,.-.,...,-,..-,...-,.--,-..-,-.--,--..
2 DIM C$(26):FOR I=1 TO 26:READ C$(I):NEXT:INPUT T$:FOR I=1 TO LEN(T$):N=ASC(MID$(T$,I,1))-64:S$=S$+C$(N):NEXT:L=LEN(S$):FOR I=1 TO L:IF MID$(S$,I,1)<>MID$(S$,(L+1)-I,1) THEN 4
3 NEXT:PRINT"True":END
4 PRINT"False

Production

? PULP
True

? RESEARCHER
True

? HOTDOGS
True

?
True

? A
False

? RACECAR
False

? PROGRAMMING
False

? PUZZLES
False
wooshinyobject
la source
2

Perl 6 , 87 octets

{$_ eq.flip}o*.trans(/./=>{S/.//}o{'  ETIANMSURWDKGOHVF L PJBXCYZQ'.index($/).base(2)})

Essayez-le en ligne!

Convertit le mot en une série de 1 et de 0 et vérifie s'il est palindromique.

Explication:

             *.trans(/./=>  # Translate each letter of the input to
                                   '...'.index($/)   # The index of the letter in the lookup string
                                                  .base(2)  # Converted to binary
                          {S/.//}o{                       } # With the first digit removed
{$_ eq.flip}o   # Return if the string is equal to its reverse
Jo King
la source
2

Python 3 , 172 148 104 104 octets

Premier golf de code jamais. Veuillez être gentil et offrir toute aide :)

Ceci est basé sur la réponse C #: /codegolf//a/175126/83877 . J'ai pris les mêmes idées et je les ai appliquées à Python 3. J'ai fait de mon mieux pour jouer au golf avec le code, mais je suis sûr que je peux faire beaucoup plus.

EDIT 1: Merci @Stephen et @Cowabunghole de m'avoir aidé à supprimer des espaces et du code inutile.

EDIT 2: Merci @JoKing pour la suggestion de le faire en binaire. C'est une astuce vraiment sympa où «-» et «». ne sont même pas nécessaires. Cela a conduit à une énorme diminution d'octets.

Solution

def b(w):x=''.join(map(lambda c:bin('  ETIANMSURWDKGOHVF L PJBXCYZQ'.index(c))[3:],w));return x==x[::-1]

Essayez-le en ligne!

pwaivers
la source
1
Bienvenue chez PPCG! Voici 152 octets avec des espaces vides: essayez-le en ligne!
Stephen
1
Quelques conseils pour économiser quelques caractères: supprimez les espaces partout où vous le pouvez. Par exemple, vous pouvez changer while i > 0:pour while i>0:sauver 2 octets. De plus, je peux me tromper, mais je pense que vous pouvez supprimer > 0complètement et simplement utiliser while i:. Deuxièmement, l'instruction dans la boucle while peut aller sur la même ligne que while, en enregistrant la nouvelle ligne et le retrait. Enfin, c'est un conseil terrible partout sauf lors du golf de code, mais si vous utilisez Python 2 au lieu de Python 3, vous pouvez économiser 1 octet d'utilisation /au lieu de //pour la division.
Cowabunghole
1
Oh, vous pouvez également utiliser à la ~-iplace de i-1. Il s'agit du même nombre d'octets, mais vous pouvez ensuite omettre les parenthèses, ce qui économise 2 octets.
Cowabunghole
1
Vous pouvez faire du binaire au lieu d'utiliser -et .. 105 octets
Jo King
1
Non, j'ai déjà une réponse Perl 6 qui utilise la technique. N'hésitez pas à utiliser la technique
Jo King
1

Pyth, 35 33 octets

Le code contient des caractères non imprimables, voici donc un vidage hexadécimal.

00000000: 5f49 7358 7a47 632e 2207 0901 3f08 82ee  _IsXzGc."...?...
00000010: bd3f c256 9d54 c381 7dac 6590 37d3 c8f5  .?.V.T..}.e.7...
00000020: 52                                       R

Essayez-le en ligne. Suite de tests.

Explication

À partir de ."la fin du code, l'alphabet Morse est généré, avec des points comme \x08et des tirets comme \x07, et séparés par des tabulations.

c divise la chaîne par les onglets.

XzGtraduit ( X) l'entrée ( z) de l'alphabet ( G) en cet "alphabet morse".

sadditionne (joint) les symboles Morse ensemble. Pour les entrées vides, renvoie 0, mais ce n'est pas un problème.

_Ivérifie si le résultat ne change pas ( I) lorsqu'il est inversé ( _). Pour une entrée vide, vérifie si 0 ne change pas lorsqu'il est annulé.

PurkkaKoodari
la source
0

Retina 0.8.2 , 87 octets

[B-ILNPRSZ]
$&.
[AJKMOQT-Y]
$&-
}T`L`\EDKN_UMS\EWNRTTMWGAI_ISADKG
+`^(.)(.*)\1$
$2
^.?$

Essayez-le en ligne! Le lien inclut des cas de test. Explication:

[B-ILNPRSZ]
$&.

Tous les codes Morse des lettres de cet ensemble se terminent par ..

[AJKMOQT-Y]
$&-

Tous les codes Morse des lettres de cet ensemble se terminent par -.

T`L`\EDKN_UMS\EWNRTTMWGAI_ISADKG

Remplacez chaque lettre par la lettre dont le code Morse est le préfixe de cette lettre (ici Eet Tsont simplement supprimés via le caractère non échappé _, mais normalement ils seraient transformés en espaces). Par exemple, Pest le code Morse pour Wavec un extra .à la fin; nous avons ajouté ce qui .précède alors maintenant tout ce qui reste à faire est de décoder le W.

}

Répétez les étapes ci-dessus jusqu'à ce qu'il ne reste plus de lettres.

^(.)(.*)\1$
$2

Si le premier et le dernier caractère sont identiques, supprimez-les tous les deux.

+`

Répétez l'opération pour autant de caractères qui correspondent.

^.?$

S'il s'agissait d'un palindrome, il ne reste plus qu'un personnage.

Neil
la source
0

Wolfram Language (Mathematica) , 107 octets

PalindromeQ[##2&@@@(IntegerDigits[Tr@StringPosition[" ETIANMSURWDKGOHVF L PJBXCYZQ",#],2]&/@Characters@#)]&

Essayez-le en ligne!

Semblable à cette réponse de Jelly: nous considérons le code Morse comme binaire et écrivons une chaîne " ETIANMSURWDKGOHVF L PJBXCYZQ"où la position d'un caractère, en binaire, nous donne son code Morse. Mais avec un 1 supplémentaire ajouté parce que nous voulons distinguer S = 000et H = 0000, par exemple. Se ##2&@@@débarrasse alors simultanément de ce 1 en tête et s'aplatit.

Misha Lavrov
la source
Huh, je m'attendais à ce que Wolfram Language ait un code Morse intégré. Ou en a-t-il un, mais il est trop verbeux?
Jack Brounstein
1
Je n'ai pas pu en trouver un. (Et la documentation comprend un exemple de code pour certaines commandes audio qui codent en dur le code Morse, ce à quoi je ne m'attendrais pas si un intégré existait.)
Misha Lavrov
0

05AB1E , 37 octets

v•1êÿµµÈ∞Ƶipδ8?a¡š%=тîδ/•3B0¡Aykè}JÂQ

Essayez-le en ligne!


Encode l'alphabet en base 3, converti en base 255:

12021110212102110101121022101111011012220212012110220210222012210221201210111020112011120122021120212202211

Base 255:

•1êÿµµÈ∞Ƶipδ8?a¡š%=тîδ/•

Ensuite, fondamentalement, je le sépare sur les 0, construit la chaîne par position et vérifie le palindrome.

Urne de poulpe magique
la source
0

C # (.NET Core) , 191 octets

a=>{var s="";int r=1,x=0,i;foreach(var t in a){var c="";for(i=" ETIANMSURWDKGOHVF L PJBXCYZQ".IndexOf(t);i>0;i/=2)c="-."[i--%2]+c;s+=c;}i=s.Length;for(;x<i;x++)r=s[x]==s[i-x-1]?r:0;return r;}

Essayez-le en ligne!

Une partie de cette réponse a été adaptée de golf à code morse Nick Larsen . Sur la base des commentaires sur la réponse, cela pourrait potentiellement être approfondi.

Non golfé:

a => {
    var s = "";                 // initialize s
    int r = 1, x = 0, i;        // initialize r, x, and i

    /*
        This portion was adapted from Nick Larsen. He described it as follows:
            -- The string of characters is a heap in which the left child is a dot and the right child is a dash.
            -- To build the letter, you traverse back up and reverse the order.
        I have edited it to remove number support, which saves 34 bytes.
    */
    foreach(var t in a)
    {
        var c = "";
        for(i = " ETIANMSURWDKGOHVF L PJBXCYZQ".IndexOf(t); i > 0; i /= 2)
            c = "-."[i-- % 2] + c;
        s += c;
    }

    i = s.Length;               // reuse i and set to the length of the morse code string
    for(; x < i; x++)           // increment x until x reaches i
        r = s[x] == s[i - x - 1] ?      // if the xth character on the left side of s is equal to the xth character on the right side of s
                                    r :     // true: do not change r
                                        0;  // false: set r to zero (set to false)

    return r;
}
Suricate
la source
0

PowerShell , 204 187 octets

param($a);$a|% t*y|%{$b+=[convert]::ToString("  ETIANMSURWDKGOHVF L PJBXCYZQ".IndexOf($_),2).substring(1)};$c=($b=($b|% *ce 0 .|% *ce 1 -)).ToCharArray();[array]::Reverse($c);$b-eq-join$c

Essayez-le en ligne!

Erreurs sur la chaîne nulle ... Quelqu'un peut-il aider avec cela?

Code de test (après avoir encapsulé le code dans un bloc de script et affecté à la variable $ Z ...):

$tests = @(
    "PULP", "True"
    "RESEARCHER", "True"
    "HOTDOGS", "True"
    "A", "False"
    "RACECAR", "False"
    "PROGRAMMING", "False"
    "PUZZLES", "False"
)
$outputs = @()
for($i = 0; $i -lt $tests.length/2; $i++){
    $output = New-Object "PSObject"
    $output  | Add-Member -MemberType NoteProperty -Name Name -Value "`"$($tests[2*$i])`""
    $output | Add-Member -MemberType NoteProperty -Name Expected -Value $tests[2*$i + 1]
    $output | Add-Member -MemberType NoteProperty -Name Result -Value $(&$Z -a $tests[2*$i])
    $outputs += $output 
}
$outputs | Format-Table

Production:

Name          Expected Result
----          -------- ------
"PULP"        True       True
"RESEARCHER"  True       True
"HOTDOGS"     True       True
"A"           False     False
"RACECAR"     False     False
"PROGRAMMING" False     False
"PUZZLES"     False     False
KGlasier
la source
Bienvenue chez PPCG. Il vous sera utile de consulter Conseils pour jouer au golf dans PowerShell
mazzy
Merci, @mazzy!
KGlasier