Esta string é um palíndromo (em Código Morse)?

16

Desafio

Inspirado por este vídeo

Como você deve saber, um palíndromo é uma palavra que está escrita da mesma forma para a frente e para trás. A palavra "PULP" não é um palíndromo, mas quando traduzida para o Código Morse (com o espaçamento entre as letras removidas), "PULP" se torna ". - ...-.-...--." que é um palíndromo. Sua tarefa é escrever um programa ou função que use uma string e retorne se essa palavra é um palíndromo no 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: --..

Regras

Entrada

A entrada pode ser obtida em qualquer formato razoável. A sequência de entrada conterá apenas letras nos casos que você preferir. A sequência não conterá espaços, números ou pontuação.

Resultado

Seu programa deve gerar 1 de 2 resultados distintos constantes com base no fato de a entrada ser um palíndromo, por exemplo, Verdadeiro / Falso, 1/0, HOTDOG / NOTHOTDOG

Pontuação

Este é o pelo que a resposta mais curta em bytes vence. As brechas padrão são proibidas.

Casos de teste

Entrada => Saída

"PULP"       => True
"RESEARCHER" => True
"HOTDOGS"    => True
""           => True
"A"          => False
"RACECAR"    => False
"PROGRAMMING"=> False
"PUZZLES"    => False
Cowabunghole
fonte
relacionado
Luis felipe De jesus Munoz
4
Apenas meu voto é um martelo, eu o consideraria um engano do desafio que Luis vinculou; a maior parte da maioria das soluções converterá a entrada em código Morse.
Shaggy
1
Parece que todas as soluções são apenas mapeamentos de código Morse com uma verificação "igual ao reverso", então estou fechando como uma duplicata.
Xnor
2
É uma pena que isso seja fechado como duplicado, pois o destino duplicado especificou (a) que a entrada é da entrada padrão (funções não permitidas) e (b) é preciso deixar não [AZ] | [Az] | [0- 9] como estão na entrada. Juntos, essas respostas aqui são menos do que triviais para a porta.
Jonathan Allan
Oh cara - parece que eu também abro! Eu pensei que tinha acabado de fazer uma única votação. Fechei novamente, mas sinto que talvez não deva ser.
Jonathan Allan

Respostas:

7

Gelatina , 28 bytes

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

Experimente online!

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

Eu escrevi esta resposta olhando para uma delas (leia as linhas da direita para a esquerda e você receberá minha sequência mágica!):

insira a descrição da imagem aqui

Lynn
fonte
73,540,211,105,102,870,315,464,559,332nd... o que?! Como você encontrou esse número? Além disso, como isso não leva uma eternidade para ser executado?
Magic Octopus Urn
@MagicOctopusUrn Basicamente, é uma codificação da ordem das letras nessa string em relação à ordem 00ABCDEFGHIJKLMNOPQRSTUVWXYZ. A Jelly possui built-ins para converter uma permutação em um número e esse número de volta na permutação. Veja a base numérica fatorial na Wikipedia.
Lynn
1
Essa é a coisa mais legal que eu já vi há muito tempo! Então, basicamente com fatoriais, você pode "saber" onde a permutação estará, porque as permutações são feitas em uma ordem específica. Isso é um acesso constante? Linear? Registro? Algo completamente diferente?
9604 Octopus Magic Urn
7

Geléia ,  35 32 27  25 bytes

-2 graças a Dennis (mude a permutação para evitar %32)

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

Recebe entrada em maiúsculas; a saída é 1verdadeira, 0falsa.

Experimente online! Ou veja a suíte de testes .

Quão?

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

Solução anterior de 35 bytes (também recebe entrada em maiú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
fonte
2

MBASIC , 325 bytes

Primeira tentativa, antes que as grandes armas cheguem aqui :-)

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

Resultado

? PULP
True

? RESEARCHER
True

? HOTDOGS
True

?
True

? A
False

? RACECAR
False

? PROGRAMMING
False

? PUZZLES
False
wooshinyobject
fonte
2

Perl 6 , 87 bytes

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

Experimente online!

Converte a palavra em uma série de 1s e 0s e verifica se é palindrômica.

Explicação:

             *.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
Brincadeira
fonte
2

Python 3 , 172 148 104 bytes

Primeiro código de golfe de todos os tempos. Por favor, seja gentil e ofereça qualquer ajuda :)

Isso é baseado na resposta do C #: /codegolf//a/175126/83877 . Tomei as mesmas idéias e apliquei-as no Python 3. Tentei o melhor possível para jogar o código, mas tenho certeza de que há muito mais que posso fazer.

EDIÇÃO 1: Obrigado @ Stephen e @ Cowabunghole por me ajudarem a remover alguns espaços em branco e códigos desnecessários.

EDIT 2: Obrigado @JoKing pela sugestão de fazê-lo em binário. Esse é um truque muito legal, onde '-' e '.' nem são necessários. Isso levou a uma enorme diminuição de bytes.

Solução

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

Experimente online!

pwaivers
fonte
1
Bem-vindo ao PPCG! Aqui estão 152 bytes com espaço em branco: experimente online!
Stephen
1
Algumas dicas para salvar alguns caracteres: Remova os espaços em branco em todos os lugares que puder. Por exemplo, você pode mudar while i > 0:para while i>0:salvar 2 bytes. Além disso, eu posso estar errado, mas acho que você pode acabar com > 0tudo e apenas usá-lo while i:. Segundo, a instrução no loop while pode seguir a mesma linha do while, salvando a nova linha e o recuo. Por último, este é um péssimo conselho em todos os lugares, exceto no código de golfe, mas se você usar o Python 2 em vez do Python 3, poderá economizar 1 byte ao /invés de //divisão.
precisa
1
Ah, também, você pode usar em ~-ivez de i-1. Esse é o mesmo número de bytes, mas você pode omitir os parênteses que economizam 2 bytes.
precisa
1
Você poderia fazer binário em vez de usar -e .. 105 bytes
Jo King
1
Nah, eu já tenho uma resposta Perl 6 que usa a técnica. Sinta-se livre para usar a técnica
Jo rei
1

Pyth, 35 33 bytes

O código contém caracteres não imprimíveis, então aqui está um 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

Experimente online. Suíte de teste.

Explicação

A partir ."do final do código, gera o alfabeto Morse, com pontos como \x08e traços como \x07, e separados por tabulações.

c divide a string pelas guias.

XzGconverte ( X) a entrada ( z) do alfabeto ( G) para este "alfabeto Morse".

ssoma (une) os símbolos de Morse. Para entradas vazias, retorna 0, mas isso não é um problema.

_Iverifica se o resultado não muda ( I) quando invertido ( _). Para entrada vazia, verifica se 0 não muda quando negado.

PurkkaKoodari
fonte
0

Retina 0.8.2 , 87 bytes

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

Experimente online! O link inclui casos de teste. Explicação:

[B-ILNPRSZ]
$&.

Todos os códigos Morse das letras deste conjunto terminam com ..

[AJKMOQT-Y]
$&-

Todos os códigos Morse das letras deste conjunto terminam com -.

T`L`\EDKN_UMS\EWNRTTMWGAI_ISADKG

Substitua cada letra pela letra cujo código Morse é o prefixo dessa letra (aqui Ee Tsão simplesmente excluídos através do escape _sem escape , mas normalmente eles seriam transformados em espaços). Por exemplo, Pé o código Morse para Wum extra .no final; nós adicionamos o que foi dito .acima, agora tudo o que resta é decodificar o arquivo W.

}

Repita as etapas acima até que não haja mais letras.

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

Se o primeiro e o último caracteres forem iguais, exclua os dois.

+`

Repita o procedimento para quantos caracteres corresponderem.

^.?$

Se este era um palíndromo, resta no máximo um caractere.

Neil
fonte
0

Wolfram Language (Mathematica) , 107 bytes

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

Experimente online!

Semelhante a esta resposta Jelly: pensamos em código Morse como binário, e escrever uma corda " ETIANMSURWDKGOHVF L PJBXCYZQ"onde a posição de um personagem, em binário, dá-nos o seu código Morse. Mas com um 1 extra acrescentado porque queremos distinguir S = 000e H = 0000, por exemplo. Então, ao ##2&@@@mesmo tempo, elimina esse principal 1 e nivela.

Misha Lavrov
fonte
Eu esperava que a Wolfram Language tivesse um código Morse embutido. Ou ele tem um, mas é muito detalhado?
Jack Brounstein 22/10
1
Não consegui encontrar um. (E se a documentação inclui código de exemplo para alguns comandos de áudio que códigos rígidos de código Morse, que eu não seria de esperar se um built-in existia.)
Misha Lavrov
0

05AB1E , 37 bytes

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

Experimente online!


Codifica o alfabeto na base 3, convertido na base 255:

12021110212102110101121022101111011012220212012110220210222012210221201210111020112011120122021120212202211

Base 255:

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

Então, basicamente, eu o divido nos 0s, construo a string pela posição e verifico o palíndromo.

Urna de Polvo Mágico
fonte
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;}

Experimente online!

Parte desta resposta foi adaptada do código de morse de Nick Larsen . Com base nos comentários da resposta, isso pode ser potencialmente mais prejudicado.

Ungolfed:

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

Experimente online!

Erros na cadeia nula ... Alguém pode ajudar com isso?

Código de teste (depois de agrupar o código em um bloco de scripts e atribuído à variável $ 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

Resultado:

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
fonte
Bem-vindo ao PPCG. Será útil para você olhar Dicas para jogar golfe no PowerShell
Mazzy
Obrigado, @mazzy!
precisa saber é o seguinte