¿Es esta cadena un palíndromo (en código Morse)?

16

Desafío

Inspirado en este video

Como sabrán, un palíndromo es una palabra que se escribe igual hacia adelante que hacia atrás. La palabra "PULP" no es un palíndromo, pero cuando se traduce al Código Morse (sin el espacio entre las letras), "PULP" se convierte en ". - ...-.-...--." que es un palíndromo Su tarea es escribir un programa o función que tome una cadena y devuelva si esa palabra es un palíndromo en el Código Morse Internacional.

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

Reglas

Entrada

La entrada puede tomarse en cualquier formato razonable. La cadena de entrada contendrá solo letras en cualquier caso que prefiera. La cadena no contendrá espacios, números o signos de puntuación.

Salida

Su programa debería generar 1 de 2 resultados distintos constantes en función de si la entrada es un palíndromo, por ejemplo, Verdadero / Falso, 1/0, HOTDOG / NOTHOTDOG

Puntuación

Este es el por lo que la respuesta más corta en bytes gana. Las lagunas estándar están prohibidas.

Casos de prueba

Entrada => Salida

"PULP"       => True
"RESEARCHER" => True
"HOTDOGS"    => True
""           => True
"A"          => False
"RACECAR"    => False
"PROGRAMMING"=> False
"PUZZLES"    => False
Agujero de vaca
fuente
relacionado
Luis felipe De jesus Munoz
44
Solo mi voto es un martillo, VTC lo vería como un engaño del desafío que Luis vinculó; La mayor parte de la mayoría de las soluciones va a convertir la entrada al código Morse.
Shaggy
1
Parece que todas las soluciones son solo asignaciones de código Morse con una verificación "igual que inversa" añadida, así que estoy cerrando como un duplicado.
xnor
2
Es una pena que esto esté cerrado como un duplicado, ya que el objetivo duplicado ha especificado (a) que la entrada es de la entrada estándar (funciones de exclusión) y (b) uno debe dejar no [AZ] | [Az] | [0- 9] como están en la entrada. En conjunto, estas respuestas aquí son menos que triviales para el puerto.
Jonathan Allan
Oh hombre, ¡parece que yo también abro el martillo! Pensé que solo había hecho un voto. Lo cerré de nuevo, pero creo que tal vez no debería ser así.
Jonathan Allan

Respuestas:

7

Jalea , 28 bytes

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

Pruébalo en línea!

Ø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?

Escribí esta respuesta mirando uno de estos (¡lee las filas de derecha a izquierda y obtienes mi cadena mágica!):

ingrese la descripción de la imagen aquí

Lynn
fuente
73,540,211,105,102,870,315,464,559,332nd... ¡¿qué?! ¿Cómo encontraste ese número? Además, ¿cómo no lleva eso una eternidad correr?
Urna mágica del pulpo
@MagicOctopusUrn Básicamente, es una codificación del orden de las letras en esa cadena en relación con el orden 00ABCDEFGHIJKLMNOPQRSTUVWXYZ. Jelly tiene incorporados para convertir una permutación en tal número, y dicho número nuevamente en la permutación. Ver base de números factoriales en Wikipedia.
Lynn
1
¡Es lo mejor que he visto en mucho tiempo! Básicamente, con los factoriales puedes "saber" dónde estará la permutación, porque las permutaciones se realizan en un orden específico. ¿Es eso un acceso de tiempo constante? ¿Lineal? ¿Iniciar sesión? ¿Algo más completamente?
Urna mágica de pulpo el
7

Jalea ,  35 32 27  25 bytes

-2 gracias a Dennis (cambia la permutación para evitar %32)

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

Toma entrada en mayúsculas; la salida es 1para verdadero, 0para falso.

Pruébalo en línea! O vea el conjunto de pruebas .

¿Cómo?

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

Solución anterior de 35 bytes (también toma entrada en mayúsculas) ...

ØẠḣ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
fuente
2

MBASIC , 325 bytes

Primer intento, antes de que las grandes armas lleguen aquí :-)

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

Salida

? PULP
True

? RESEARCHER
True

? HOTDOGS
True

?
True

? A
False

? RACECAR
False

? PROGRAMMING
False

? PUZZLES
False
wooshinyobject
fuente
2

Perl 6 , 87 bytes

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

Pruébalo en línea!

Convierte la palabra en una serie de 1s y 0s y comprueba si es palindrómica.

Explicación:

             *.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
fuente
2

Python 3 , 172 148 104 bytes

Primer código de golf. Sea amable y ofrezca cualquier ayuda :)

Esto se basa en la respuesta de C #: /codegolf//a/175126/83877 . Tomé las mismas ideas y las apliqué a Python 3. Hice mi mejor esfuerzo para jugar golf con el código, pero estoy seguro de que hay mucho más que puedo hacer.

EDITAR 1: Gracias @Stephen y @Cowabunghole por ayudarme a eliminar algunos espacios en blanco y código innecesario.

EDIT 2: Gracias @JoKing por la sugerencia de hacerlo en binario. Este es un truco realmente bueno donde '-' y '.' Ni siquiera son necesarios. Esto condujo a una gran disminución de bytes.

Solución

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

Pruébalo en línea!

perdonadores
fuente
1
Bienvenido a PPCG! Aquí hay 152 bytes con espacios en blanco desactivados: ¡ Pruébelo en línea!
Stephen
1
Un par de consejos para guardar algunos caracteres: elimine los espacios en blanco donde sea que pueda. Por ejemplo, puede cambiar while i > 0:a while i>0:para guardar 2 bytes. Además, podría estar equivocado, pero creo que puede eliminarlo por > 0completo y simplemente usarlo while i:. En segundo lugar, la instrucción en el ciclo while puede ir en la misma línea que while, guardando la nueva línea y la sangría. Por último, este es un consejo terrible en todas partes, excepto cuando se juega golf de código, pero si usa Python 2 en lugar de Python 3, puede guardar 1 byte en /lugar de //para la división.
Cowabunghole
1
Ah, también, puedes usar en ~-ilugar de i-1. Este es el mismo número de bytes, pero puede omitir los paréntesis que ahorran 2 bytes.
Cowabunghole
1
Podrías hacer binario en lugar de usar -y .. 105 bytes
Jo King
1
No, ya tengo una respuesta Perl 6 que usa la técnica. Siéntase libre de usar la técnica
Jo King
1

Pyth, 35 33 bytes

El código contiene caracteres no imprimibles, así que aquí hay un hexdump.

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

Pruébalo en línea. Banco de pruebas.

Explicación

Comenzando desde ."el final del código genera el alfabeto Morse, con puntos como \x08y guiones como \x07, y separados por pestañas.

c divide la cadena por las pestañas.

XzGtraduce ( X) la entrada ( z) del alfabeto ( G) a este "alfabeto Morse".

ssuma (une) los símbolos Morse juntos. Para entradas vacías, devuelve 0, pero esto no es un problema.

_Icomprueba si el resultado no cambia ( I) cuando se invierte ( _). Para entradas vacías, verifica si 0 no cambia cuando se niega.

PurkkaKoodari
fuente
0

Retina 0.8.2 , 87 bytes

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

Pruébalo en línea! El enlace incluye casos de prueba. Explicación:

[B-ILNPRSZ]
$&.

Todos los códigos Morse para las letras en este conjunto terminan con ..

[AJKMOQT-Y]
$&-

Todos los códigos Morse para las letras en este conjunto terminan con -.

T`L`\EDKN_UMS\EWNRTTMWGAI_ISADKG

Reemplace cada letra con la letra cuyo código Morse es el prefijo de esa letra (aquí Ey Tsimplemente se eliminan mediante el no escapado _, pero normalmente se convertirían en espacios). Por ejemplo, Pes el código Morse Wcon un extra .al final; agregamos lo .anterior así que ahora todo lo que queda es decodificar el W.

}

Repita las etapas anteriores hasta que no queden letras.

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

Si el primer y el último carácter son iguales, elimínelos a ambos.

+`

Repita para tantos caracteres que coincidan.

^.?$

Si esto era un palíndromo, entonces queda como máximo un personaje.

Neil
fuente
0

Wolfram Language (Mathematica) , 107 bytes

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

Pruébalo en línea!

Similar a esta respuesta de Jelly: pensamos en el código Morse como binario, y escribimos una cadena " ETIANMSURWDKGOHVF L PJBXCYZQ"donde la posición de un personaje, en binario, nos da su código Morse. Pero con un 1 extra antepuesto porque queremos distinguir S = 000y H = 0000, por ejemplo. Luego, ##2&@@@simultáneamente, se deshace de este primer 1 y se aplana.

Misha Lavrov
fuente
Huh, hubiera esperado que Wolfram Language tuviera un código Morse incorporado. ¿O tiene uno, pero es demasiado detallado?
Jack Brounstein el
1
No pude encontrar uno. (Y la documentación incluye código de ejemplo para algunos comandos de audio que codifican el código Morse, que no esperaría si existiera un incorporado).
Misha Lavrov
0

05AB1E , 37 bytes

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

Pruébalo en línea!


Codifica el alfabeto en la base 3, convertido a la base 255:

12021110212102110101121022101111011012220212012110220210222012210221201210111020112011120122021120212202211

Base 255:

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

Luego, básicamente, lo separo en los 0, construyo la cadena por posición y compruebo el palíndromo.

Urna de pulpo mágico
fuente
0

C # (.NET Core) , 191 bytes

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;}

Pruébalo en línea!

Parte de esta respuesta fue adaptada del código morse golf de Nick Larsen . Con base en los comentarios sobre la respuesta, esto podría ser más útil.

Sin 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;
}
Suricata
fuente
0

PowerShell , 204 187 bytes

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

Pruébalo en línea!

Errores en la cadena nula ... ¿Alguien puede ayudar con esto?

Código de prueba (después de envolver el código en un bloque de secuencia de comandos y asignarlo a 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

Salida:

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
fuente
Bienvenido a PPCG. Le resultará útil buscar consejos para jugar golf en PowerShell
mazzy
Gracias, @mazzy!
KGlasier