Ist diese Zeichenfolge ein Palindrom (im Morsecode)?

16

Herausforderung

Inspiriert von diesem Video

Wie Sie vielleicht wissen, ist ein Palindrom ein Wort, das vorwärts und rückwärts geschrieben ist. Das Wort "PULP" ist kein Palindrom, aber wenn es in Morsecode übersetzt wird (wobei der Abstand zwischen den Buchstaben entfernt wird), wird "PULP" zu ". Das ist ein Palindrom. Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die eine Zeichenfolge akzeptiert und zurückgibt, ob dieses Wort ein Palindrom im internationalen Morsecode ist.

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

Regeln

Eingang

Die Eingabe kann in jedem vernünftigen Format erfolgen. Die Eingabezeichenfolge enthält in jedem Fall nur Buchstaben, die Sie bevorzugen. Die Zeichenfolge enthält keine Leerzeichen, Zahlen oder Satzzeichen.

Ausgabe

Ihr Programm sollte 1 von 2 konstanten und unterschiedlichen Ergebnissen ausgeben, je nachdem, ob es sich bei der Eingabe um ein Palindrom handelt, z. B. True / False, 1/0, HOTDOG / NOTHOTDOG

Wertung

Dies ist also gewinnt die kürzeste Antwort in Bytes. Standardlücken sind verboten.

Testfälle

Eingabe => Ausgabe

"PULP"       => True
"RESEARCHER" => True
"HOTDOGS"    => True
""           => True
"A"          => False
"RACECAR"    => False
"PROGRAMMING"=> False
"PUZZLES"    => False
Cowabunghole
quelle
Verwandte
Luis Felipe De Jesus Munoz
4
Nur meine Stimme ist ein Hammer, ich würde VTC dies als Betrug der Herausforderung sehen, die Luis damit verband; Der Großteil der meisten Lösungen wird die Eingabe in Morse-Code konvertieren.
Shaggy
1
Anscheinend handelt es sich bei allen Lösungen nur um Morsecode-Zuordnungen, bei denen die Option "Gleich wie umgekehrt" aktiviert ist, sodass ich als Duplikat schließe.
xnor
2
Es ist eine Schande, dass dies als Duplikat geschlossen wird, da das Duplikat-Ziel angegeben hat (a), dass die Eingabe von der Standardeingabe stammt (Funktionen nicht zulassen) und (b), dass nicht [AZ] | [Az] | [0- 9] wie sie in der Eingabe sind. Zusammen machen diese hier einige Antworten weniger als trivial zu portieren.
Jonathan Allan
Oh man - es sieht so aus, als würde ich auch hämmern! Ich dachte, ich hätte nur eine einzige Stimme abgegeben. Ich habe es wieder geschlossen, aber vielleicht sollte es nicht so sein.
Jonathan Allan

Antworten:

7

Gelee , 28 Bytes

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

Probieren Sie es 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?

Ich habe diese Antwort mit einem Blick auf eine dieser Zeilen geschrieben (lesen Sie die Zeilen von rechts nach links, und Sie erhalten meine magische Zeichenfolge!):

Bildbeschreibung hier eingeben

Lynn
quelle
73,540,211,105,102,870,315,464,559,332nd... was ?! Wie haben Sie diese Nummer gefunden? Auch wie dauert das nicht ewig zu laufen?
Magic Octopus Urn
@MagicOctopusUrn Grundsätzlich handelt es sich um eine Codierung der Reihenfolge der Buchstaben in dieser Zeichenfolge relativ zur Reihenfolge 00ABCDEFGHIJKLMNOPQRSTUVWXYZ. Jelly verfügt über integrierte Funktionen, um eine Permutation in eine solche Zahl und eine solche Zahl wieder in eine Permutation umzuwandeln. Siehe Fakultätszahlenbasis auf Wikipedia.
Lynn
1
Das ist das Coolste, was ich seit langer Zeit gesehen habe! Mit Fakultäten können Sie also im Grunde "wissen", wo die Permutation liegen wird, da die Permutationen in einer bestimmten Reihenfolge durchgeführt werden. Ist das ein ständiger Zeitzugang? Linear? Log? Etwas ganz anderes?
Magic Octopus Urn
7

Jelly ,  35 32 27  25 Bytes

-2 dank Dennis (Verschieben Sie die Permutation zu vermeiden %32)

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

Nimmt die Eingabe in Großbuchstaben vor; Ausgabe ist 1für wahr, 0für falsch.

Probieren Sie es online! Oder sehen Sie sich die Testsuite an .

Wie?

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

Vorherige 35-Byte-Lösung (Eingabe auch in Großbuchstaben) ...

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

MBASIC , 325 Bytes

Erster Versuch, bevor die großen Kanonen hier ankommen :-)

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

Ausgabe

? PULP
True

? RESEARCHER
True

? HOTDOGS
True

?
True

? A
False

? RACECAR
False

? PROGRAMMING
False

? PUZZLES
False
wooshinyobject
quelle
2

Perl 6 , 87 Bytes

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

Probieren Sie es online!

Wandelt das Wort in eine Reihe von Einsen und Nullen um und überprüft, ob es palindrom ist.

Erläuterung:

             *.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
Scherzen
quelle
2

Python 3 , 172 148 104 Bytes

Erster Code Golf überhaupt. Bitte seien Sie nett und bieten Sie Hilfe an :)

Dies basiert auf der C # -Antwort: /codegolf//a/175126/83877 . Ich habe die gleichen Ideen auf Python 3 angewendet. Ich habe mein Bestes gegeben, um den Code zu testen, aber ich bin mir sicher, dass ich noch viel mehr tun kann.

EDIT 1: Vielen Dank an @Stephen und @Cowabunghole, dass sie mir geholfen haben, Leerzeichen und unnötigen Code zu entfernen.

EDIT 2: Danke @JoKing für den Vorschlag, es in binärer Form zu tun. Dies ist ein wirklich netter Trick, bei dem '-' und '.' sind nicht einmal notwendig. Dies führte zu einer enormen Byteverringerung.

Lösung

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

Probieren Sie es online!

pwaivers
quelle
1
Willkommen bei PPCG! Hier sind 152 Bytes mit deaktiviertem Whitespace: Probieren Sie es online aus!
Stephen
1
Ein paar Tipps zum Speichern einiger Zeichen: Entfernen Sie Leerzeichen, wo immer Sie können. Zum Beispiel können Sie ändern , while i > 0:um while i>0:2 Bytes zu speichern. Ich könnte mich auch irren, aber ich denke, Sie können alles > 0aufheben und einfach nutzen while i:. Zweitens kann sich die Anweisung in der while-Schleife in derselben Zeile wie die while-Anweisung befinden, wodurch die neue Zeile und der Einzug gespeichert werden. Letztendlich ist dies überall ein schrecklicher Ratschlag, außer beim Code-Golfen. Wenn Sie jedoch Python 2 anstelle von Python 3 verwenden, können Sie 1 Byte von der Verwendung /anstelle der //Teilung einsparen .
Cowabunghole
1
Oh, auch, können Sie ~-ianstelle von verwenden i-1. Dies ist die gleiche Anzahl von Bytes, aber Sie können dann die Klammern weglassen, wodurch 2 Bytes eingespart werden.
Cowabunghole
1
Sie könnten binär tun, anstatt -und zu verwenden .. 105 Bytes
Jo King
1
Nein, ich habe bereits eine Perl 6-Antwort , die diese Technik verwendet. Fühlen Sie sich frei, um die Technik zu verwenden
Jo King
1

Pyth, 35 33 Bytes

Der Code enthält nicht druckbare Zeichen. Hier ist also ein 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

Probieren Sie es online aus. Testsuite.

Erläuterung

Ab ."dem Ende des Codes wird das Morse-Alphabet mit Punkten als \x08und Bindestrichen als \x07und durch Tabulatoren getrennt generiert .

c teilt die Zeichenfolge durch die Tabulatoren.

XzGübersetzt ( X) die Eingabe ( z) aus dem Alphabet ( G) in dieses "Morse-Alphabet".

sfasst die Morsezeichen zusammen. Für leere Eingaben wird 0 zurückgegeben, dies ist jedoch kein Problem.

_Iprüft, ob sich das Ergebnis Ibei Umkehrung ( _) nicht ändert ( ). Prüft bei leerer Eingabe, ob sich 0 beim Negieren nicht ändert.

PurkkaKoodari
quelle
0

Retina 0,8,2 , 87 Bytes

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

Probieren Sie es online! Link enthält Testfälle. Erläuterung:

[B-ILNPRSZ]
$&.

Alle Morsecodes für die Buchstaben in diesem Satz enden mit ..

[AJKMOQT-Y]
$&-

Alle Morsecodes für die Buchstaben in diesem Satz enden mit -.

T`L`\EDKN_UMS\EWNRTTMWGAI_ISADKG

Ersetzen Sie jeden Buchstaben durch den Buchstaben, dessen Morsecode das Präfix dieses Buchstabens ist (hier Eund Twerden einfach über das Unescaped gelöscht _, aber normalerweise würden sie in Leerzeichen umgewandelt). Zum Beispiel Psteht der Morse-Code für Wmit einem Extra .am Ende; Wir haben das .oben Gesagte hinzugefügt , und jetzt müssen wir nur noch das dekodieren W.

}

Wiederholen Sie die obigen Schritte, bis keine Buchstaben mehr vorhanden sind.

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

Wenn das erste und das letzte Zeichen identisch sind, löschen Sie beide.

+`

Wiederholen Sie diesen Vorgang für so viele übereinstimmende Zeichen.

^.?$

Wenn dies ein Palindrom war, ist höchstens noch ein Zeichen übrig.

Neil
quelle
0

Wolfram Language (Mathematica) , 107 Bytes

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

Probieren Sie es online!

Ähnlich wie bei dieser Gelee-Antwort: Wir betrachten Morse-Code als binär und schreiben einen String auf, " ETIANMSURWDKGOHVF L PJBXCYZQ"in dem die Position eines Zeichens in binär den Morse-Code angibt. Aber mit einer zusätzlichen 1 voran, weil wir unterscheiden wollen S = 000und H = 0000zum Beispiel. Dann wird ##2&@@@gleichzeitig diese führende 1 beseitigt und abgeflacht.

Mischa Lawrow
quelle
Ich hätte erwartet, dass Wolfram Language einen eingebauten Morsecode hat. Oder hat es eins, aber es ist zu ausführlich?
Jack Brounstein
1
Ich konnte keinen finden. (Und die Dokumentation enthält Beispielcode für einige Audiobefehle, die Morse-Code hart codieren, was ich nicht erwarten würde, wenn ein eingebautes vorhanden wäre.)
Misha Lavrov
0

05AB1E , 37 Bytes

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

Probieren Sie es online!


Kodiert das Alphabet in Basis 3, konvertiert in Basis 255:

12021110212102110101121022101111011012220212012110220210222012210221201210111020112011120122021120212202211

Basis 255:

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

Im Grunde zerlege ich es auf den Nullen, konstruiere die Zeichenfolge nach Position und überprüfe auf Palindrom.

Magische Kraken-Urne
quelle
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;}

Probieren Sie es online!

Ein Teil dieser Antwort wurde von Nick Larsen Morsecode Golf angepasst . Basierend auf den Kommentaren zu der Antwort könnte dies möglicherweise weiter verbessert werden.

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;
}
Erdmännchen
quelle
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

Probieren Sie es online!

Fehler auf Null-Zeichenfolge ... Kann jemand dabei helfen?

Testcode (Nachdem der Code in einen Skriptblock eingeschlossen und der Variablen $ Z zugewiesen wurde ...):

$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

Ausgabe:

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
quelle
Willkommen bei PPCG. Es wird nützlich sein , für Sie suchen Tipps für den Golfsport in Powershell
mazzy
Danke, @mazzy!
KGlasier