Questa stringa è un palindromo (nel codice Morse)?


16

Sfida

Ispirato da questo video

Come forse saprai, un palindromo è una parola che si scrive allo stesso modo in cui è all'indietro. La parola "POLPA" non è un palindromo, ma quando tradotta in codice Morse (con la spaziatura tra le lettere rimossa), "POLPA" diventa ". - ...-.-...--." che è un palindromo. Il tuo compito è quello di scrivere un programma o una funzione che prende una stringa e restituisce se quella parola è un palindromo nel Codice Morse Internazionale.

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

Regole

Ingresso

L'input può essere preso in qualsiasi formato ragionevole. La stringa di input conterrà solo lettere nel caso che preferisci. La stringa non conterrà spazi, numeri o punteggiatura.

Produzione

Il tuo programma dovrebbe produrre 1 di 2 risultati distinti costanti in base al fatto che l'ingresso sia un palindromo, ad esempio Vero / Falso, 1/0, HOTDOG / NOTHOTDOG

punteggio

Questo è quindi la risposta più breve in byte vince. Sono vietate le scappatoie standard.

Casi test

Input => Output

"PULP"       => True
"RESEARCHER" => True
"HOTDOGS"    => True
""           => True
"A"          => False
"RACECAR"    => False
"PROGRAMMING"=> False
"PUZZLES"    => False


4
Solo il mio voto è un martello, vorrei VTC questo come un inganno della sfida che Luis ha collegato; la maggior parte della maggior parte delle soluzioni sta convertendo l'input in codice Morse.
Shaggy,

1
Sembra che tutte le soluzioni siano solo mappature di codice Morse con un controllo "uguale al contrario", quindi sto chiudendo come duplicato.
xnor

2
È un peccato che questo sia chiuso come duplicato, poiché il duplicato-target ha specificato (a) che l'input proviene dall'input standard (che non consente le funzioni) e (b) si deve lasciare non [AZ] | [Az] | [0- 9] come sono nell'input. Insieme, queste fanno alcune risposte qui meno che banali da portare.
Jonathan Allan,

Oh amico - sembra che anche io apra il martello! Pensavo di aver appena votato. L'ho martellato di nuovo chiuso, ma sento che forse non dovrebbe essere.
Jonathan Allan,

Risposte:


7

Gelatina , 28 byte

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

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

Ho scritto questa risposta guardando una di queste (leggi le righe da destra a sinistra e ottieni la mia corda magica!):

inserisci qui la descrizione dell'immagine


73,540,211,105,102,870,315,464,559,332nd... che cosa?! Come hai trovato quel numero? Inoltre, come non ci vuole un'eternità per correre?
Magic Octopus Urn

@MagicOctopusUrn Fondamentalmente, è una codifica dell'ordine delle lettere in quella stringa relativa all'ordine 00ABCDEFGHIJKLMNOPQRSTUVWXYZ. Jelly ha incorporato per convertire una permutazione in tale numero e tale numero in permutazione. Vedi la base numerica fattoriale su Wikipedia.
Lynn,

1
Questa è la cosa più bella che vedo da molto tempo! Quindi, fondamentalmente, con i fattoriali puoi "sapere" dove risiederà la permutazione, perché le permutazioni sono fatte in un ordine specifico. È un accesso a tempo costante? Lineare? Log? Qualcos'altro interamente?
Magic Octopus Urn


7

Gelatina ,  35 32 27  25 byte

-2 grazie a Dennis (sposta la permutazione per evitare %32)

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

Accetta input in maiuscolo; l'output è 1vero, 0falso.

Provalo online! Oppure vedi la suite di test .

Come?

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

Precedente soluzione a 35 byte (accetta anche l'input in maiuscolo) ...

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


2

MBASIC , 325 byte

Primo tentativo, prima che arrivino le armi grosse :-)

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

Produzione

? PULP
True

? RESEARCHER
True

? HOTDOGS
True

?
True

? A
False

? RACECAR
False

? PROGRAMMING
False

? PUZZLES
False


2

Perl 6 , 87 byte

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

Provalo online!

Converte la parola in una serie di 1 e 0 e verifica se è palindromica.

Spiegazione:

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

2

Python 3 , 172 148 104 byte

Il primo golf di sempre. Sii gentile e offri aiuto :)

Questo si basa sulla risposta C #: /codegolf//a/175126/83877 . Ho preso le stesse idee e l'ho applicato a Python 3. Ho fatto del mio meglio per golfare il codice, ma sono sicuro che ci sia molto altro da fare.

EDIT 1: Grazie @Stephen e @Cowabunghole per avermi aiutato a rimuovere alcuni spazi bianchi e il codice non necessario.

EDIT 2: Grazie @JoKing per il suggerimento di farlo in binario. Questo è un trucco davvero accurato in cui '-' e '.' non sono nemmeno necessari. Ciò ha portato a un enorme calo dei byte.

Soluzione

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

Provalo online!


1
Benvenuti in PPCG! Ecco 152 byte con spazi bianchi disattivati: provalo online!
Stephen,

1
Un paio di consigli per salvare alcuni personaggi: rimuovi gli spazi bianchi ovunque tu sia. Ad esempio, è possibile passare while i > 0:a while i>0:per salvare 2 byte. Inoltre, potrei sbagliarmi, ma penso che tu possa eliminare del > 0tutto e solo usare while i:. In secondo luogo, l'istruzione nel ciclo while può andare sulla stessa riga di while, salvando la nuova riga e il rientro. Infine, questo è un consiglio terribile ovunque tranne quando si gioca a golf, ma se si utilizza Python 2 invece di Python 3, è possibile salvare 1 byte dall'uso /invece che //per la divisione.
Cowabunghole,

1
Oh, inoltre, puoi usare ~-iinvece di i-1. Questo è lo stesso numero di byte, ma è quindi possibile omettere le parentesi che salvano 2 byte.
Cowabunghole,

1
Potresti fare binario invece di usare -e .. 105 byte
Jo King,

1
No, ho già ricevuto una risposta al Perl 6 che utilizza la tecnica. Sentiti libero di usare la tecnica
Jo King,

1

Pyth, 35 33 byte

Il codice contiene caratteri non stampabili, quindi ecco 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

Provalo online. Suite di test.

Spiegazione

A partire dalla ."fine del codice genera l'alfabeto Morse, con punti come \x08e trattini come \x07e separati da schede.

c divide la stringa per le schede.

XzGtraduce ( X) l'input ( z) dall'alfabeto ( G) in questo "alfabeto Morse".

ssomma (unisce) i simboli Morse insieme. Per input vuoti, restituisce 0, ma questo non è un problema.

_Icontrolla se il risultato non cambia ( I) se invertito ( _). Per input vuoto, controlla se 0 non cambia quando negato.


0

Retina 0.8.2 , 87 byte

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

Provalo online! Il link include casi di test. Spiegazione:

[B-ILNPRSZ]
$&.

Tutti i codici Morse per le lettere in questo set terminano con ..

[AJKMOQT-Y]
$&-

Tutti i codici Morse per le lettere in questo set terminano con -.

T`L`\EDKN_UMS\EWNRTTMWGAI_ISADKG

Sostituisci ogni lettera con la lettera il cui codice Morse è il prefisso di quella lettera (qui Ee Tvengono semplicemente eliminati tramite il non escape _, ma normalmente verrebbero trasformati in spazi). Ad esempio, Pè il codice Morse per Wcon un extra .alla fine; abbiamo aggiunto quanto .sopra, quindi ora non resta che decodificare il file W.

}

Ripeti i passaggi precedenti fino a quando non rimangono più lettere.

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

Se il primo e l'ultimo carattere sono uguali, eliminali entrambi.

+`

Ripeti l'operazione per tutti i personaggi corrispondenti.

^.?$

Se questo era un palindromo, allora è rimasto al massimo un personaggio.


0

Wolfram Language (Mathematica) , 107 byte

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

Provalo online!

Simile a questa risposta di Jelly: pensiamo al codice Morse come binario e scriviamo una stringa in " ETIANMSURWDKGOHVF L PJBXCYZQ"cui la posizione di un carattere, in binario, ci dà il suo codice Morse. Ma con un ulteriore 1 anteposto perché vogliamo distinguere S = 000e H = 0000, per esempio. Quindi ##2&@@@contemporaneamente si sbarazza di questo 1 leader e si appiattisce.


Huh, mi sarei aspettato che Wolfram Language avesse un codice Morse integrato. O ne ha uno, ma è troppo dettagliato?
Jack Brounstein,

1
Non riuscivo a trovarne uno. (E la documentazione include un codice di esempio per alcuni comandi audio che codifica in codice Morse, cosa che non mi aspetterei se esistesse un built-in.)
Misha Lavrov

0

05AB1E , 37 byte

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

Provalo online!


Codifica l'alfabeto in base 3, convertito in base 255:

12021110212102110101121022101111011012220212012110220210222012210221201210111020112011120122021120212202211

Base 255:

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

Quindi fondamentalmente, lo divido sugli 0, costruisco la stringa per posizione e controllo il palindromo.


0

C # (.NET Core) , 191 byte

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

Provalo online!

Parte di questa risposta è stata adattata da golf in codice morse di Nick Larsen . Sulla base dei commenti sulla risposta, questo potrebbe potenzialmente essere ulteriormente approfondito.

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

0

PowerShell , 204 187 byte

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

Provalo online!

Errori nella stringa null ... Qualcuno può aiutare con questo?

Codice di prova (dopo aver inserito il codice in un blocco di script e assegnato alla variabile $ 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

Produzione:

Name          Expected Result
----          -------- ------
"PULP"        True       True
"RESEARCHER"  True       True
"HOTDOGS"     True       True
"A"           False     False
"RACECAR"     False     False
"PROGRAMMING" False     False
"PUZZLES"     False     False

Benvenuti in PPCG. Ti sarà utile vedere Suggerimenti per giocare a golf in PowerShell
mazzy

Grazie, @mazzy!
KGlasier
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.