Czy ten ciąg jest palindromem (w kodzie Morse'a)?

16

Wyzwanie

Inspirowany tym filmem

Jak zapewne wiesz, palindrom to słowo, które jest pisane tak samo do przodu, jak i do tyłu. Słowo „PULP” nie jest palindromem, ale po przetłumaczeniu na kod Morse'a (z usuniętymi odstępami między literami) „PULP” staje się „. - ...-.-...--.” który jest palindromem. Twoim zadaniem jest napisanie programu lub funkcji, która pobiera ciąg znaków i zwraca, czy to słowo jest palindromem w międzynarodowym kodzie Morse'a.

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

Zasady

Wejście

Dane wejściowe można przyjmować w dowolnym rozsądnym formacie. Łańcuch wejściowy będzie zawierał tylko litery w każdym przypadku, który wolisz. Ciąg nie będzie zawierał spacji, cyfr ani interpunkcji.

Wynik

Twój program powinien wypisać 1 z 2 stałych, odrębnych wyników na podstawie tego, czy dane wejściowe są palindromem, np. True / False, 1/0, HOTDOG / NOTHOTDOG

Punktacja

To jest więc wygrywa najkrótsza odpowiedź w bajtach. Standardowe luki są zabronione.

Przypadki testowe

Dane wejściowe => Dane wyjściowe

"PULP"       => True
"RESEARCHER" => True
"HOTDOGS"    => True
""           => True
"A"          => False
"RACECAR"    => False
"PROGRAMMING"=> False
"PUZZLES"    => False
Cowabunghole
źródło
powiązane
Luis felipe De jesus Munoz
4
Tylko mój głos to młotek, chciałbym to zrobić jako duplikat wyzwania, które łączył Luis; większość rozwiązań będzie polegała na konwersji danych wejściowych na kod Morse'a.
Kudłaty,
1
Wygląda na to, że wszystkie rozwiązania są po prostu odwzorowaniami kodu Morse'a z zaznaczonym sprawdzeniem „to samo jak wstecz”, więc zamykam się jako duplikat.
xnor
2
Szkoda, że ​​jest zamknięty jako duplikat, ponieważ duplikat-cel określił (a) że dane wejściowe pochodzą ze standardowego wejścia (funkcje niedozwolone) i (b) należy pozostawić wartość inną niż [AZ] | [Az] | [0- 9] jak są na wejściu. Łącznie sprawiają to, że niektóre odpowiedzi tutaj nie są łatwe do przeniesienia.
Jonathan Allan,
O rany - wygląda na to, że ja też się otwieram! Myślałem, że zrobiłem tylko jeden głos. Uderzyłem go ponownie, ale myślę, że nie powinno tak być.
Jonathan Allan,

Odpowiedzi:

7

Galaretka , 28 bajtów

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

Wypróbuj 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?

Napisałem tę odpowiedź, patrząc na jeden z nich (przeczytaj rzędy od prawej do lewej, a dostaniesz mój magiczny ciąg!):

wprowadź opis zdjęcia tutaj

Lynn
źródło
73,540,211,105,102,870,315,464,559,332nd... co?! Jak znalazłeś ten numer? Również jak to nie trwa wiecznie ?
Magic Octopus Urn
@MagicOctopusUrn Zasadniczo jest to kodowanie kolejności liter w tym ciągu w stosunku do kolejności 00ABCDEFGHIJKLMNOPQRSTUVWXYZ. Galaretka ma wbudowane funkcje przekształcania permutacji w taką liczbę, a taką liczbę z powrotem w permutację. Zobacz bazę silni na podstawie Wikipedii.
Lynn,
1
To najfajniejsza rzecz, jaką widziałem od dłuższego czasu! Tak więc w zasadzie za pomocą silni można „wiedzieć”, gdzie będzie leżeć permutacja, ponieważ permutacje są wykonywane w określonej kolejności. Czy to jest stały dostęp do czasu? Liniowy? Log? Coś zupełnie innego?
Magic Octopus Urn
7

Galaretka ,  35 32 27  25 bajtów

-2 dzięki Dennisowi (przesuń permutację, aby uniknąć %32)

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

Pobiera dane dużymi literami; wyjście jest 1prawdziwe, a 0fałszywe.

Wypróbuj online! Lub zobacz pakiet testowy .

W jaki sposób?

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

Poprzednie rozwiązanie 35-bajtowe (również pobiera duże litery) ...

ØẠḣ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
źródło
2

MBASIC , 325 bajtów

Pierwsza próba, zanim dotrą tu duże pistolety :-)

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

Wynik

? PULP
True

? RESEARCHER
True

? HOTDOGS
True

?
True

? A
False

? RACECAR
False

? PROGRAMMING
False

? PUZZLES
False
wooshinyobject
źródło
2

Perl 6 , 87 bajtów

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

Wypróbuj online!

Konwertuje słowo na ciąg 1 i 0 i sprawdza, czy jest ono palindromiczne.

Wyjaśnienie:

             *.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
źródło
2

Python 3 , 172 148 104 bajtów

Pierwszy kod golfowy w historii. Bądź uprzejmy i zaoferuj wszelką pomoc :)

Jest to oparte na odpowiedzi w języku C #: /codegolf//a/175126/83877 . Wziąłem te same pomysły i zastosowałem je w Pythonie 3. Starałem się jak najlepiej zagrać w golfa, ale jestem pewien, że jest o wiele więcej do zrobienia.

EDYCJA 1: Dzięki @Stephen i @Cowabunghole za pomoc w usunięciu białych znaków i niepotrzebnego kodu.

EDYCJA 2: Dzięki @JoKing za sugestię zrobienia tego w wersji binarnej. To naprawdę fajna sztuczka, w której „-” i „.” nie są nawet konieczne. Doprowadziło to do ogromnego zmniejszenia bajtów.

Rozwiązanie

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

Wypróbuj online!

falochrony
źródło
1
Witamy w PPCG! Oto 152 bajty z wyłączonymi spacjami: Wypróbuj online!
Stephen
1
Kilka wskazówek, jak zaoszczędzić kilka znaków: Usuń białe znaki wszędzie, gdzie możesz. Na przykład możesz zmienić while i > 0:na, while i>0:aby zapisać 2 bajty. Mogę się również mylić, ale myślę, że możesz > 0całkowicie zrezygnować z tego i po prostu użyć while i:. Po drugie, instrukcja w pętli while może iść w tym samym wierszu co while, zapisując nową linię i wcięcie. Wreszcie, jest to okropna rada wszędzie, z wyjątkiem gry w golfa, ale jeśli używasz Python 2 zamiast Python 3, możesz zaoszczędzić 1 bajt /zamiast używać //do dzielenia.
Cowabunghole
1
Och, możesz też użyć ~-izamiast i-1. Jest to ta sama liczba bajtów, ale możesz pominąć nawiasy, które oszczędzają 2 bajty.
Cowabunghole
1
Możesz zrobić binarnie zamiast używać -i .. 105 bajtów
Jo King
1
Nie, mam już odpowiedź Perl 6, która wykorzystuje tę technikę. Zachęcamy do skorzystania z tej techniki
Jo King
1

Pyth, 35 33 bajtów

Kod zawiera znaki niedrukowalne, więc oto zrzut heksowy.

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

Wypróbuj online. Zestaw testowy.

Wyjaśnienie

Zaczynając od ."końca kodu, generuje alfabet Morse'a, z kropkami jako \x08i myślnikami jako \x07i oddzielonymi tabulatorami.

c dzieli ciąg według zakładek.

XzGtłumaczy ( X) input ( z) z alfabetu (G ) na ten „alfabet Morse'a”.

ssumuje (łączy) symbole Morse'a razem. W przypadku pustych danych wejściowych zwraca 0, ale nie stanowi to problemu.

_Isprawdza, czy wynik nie zmienia się ( I) po odwróceniu ( _). W przypadku pustych danych wejściowych sprawdza, czy 0 nie zmienia się po zanegowaniu.

PurkkaKoodari
źródło
0

Retina 0.8.2 , 87 bajtów

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

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:

[B-ILNPRSZ]
$&.

Wszystkie kody Morse'a dla liter w tym zestawie kończą się na ..

[AJKMOQT-Y]
$&-

Wszystkie kody Morse'a dla liter w tym zestawie kończą się na -.

T`L`\EDKN_UMS\EWNRTTMWGAI_ISADKG

Zastąp każdą literę literą, której kod Morse'a jest prefiksem tej litery (tutaj Ei Tsą po prostu usuwane przez nieskalowane _, ale normalnie byłyby zamienione na spacje). Na przykład, Pto kod Morse'a Wz dodatkowym .na końcu; dodaliśmy .powyższe, więc teraz pozostaje tylko odkodować W.

}

Powtarzaj powyższe etapy, aż nie pozostaną żadne litery.

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

Jeśli pierwszy i ostatni znak są takie same, usuń je oba.

+`

Powtórz dla dowolnej liczby pasujących znaków.

^.?$

Jeśli był to palindrom, pozostała co najwyżej jedna postać.

Neil
źródło
0

Wolfram Language (Mathematica) , 107 bajtów

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

Wypróbuj online!

Podobna do tej Jelly odpowiedź: myślimy o kodzie Morse'a jako binarne i zanotować ciąg " ETIANMSURWDKGOHVF L PJBXCYZQ"gdzie pozycja znaku w formacie binarnym, daje nam swój kod Morse'a. Ale z dodanym dodatkowym 1, ponieważ chcemy rozróżnić S = 000i H = 0000na przykład. Następnie ##2&@@@jednocześnie pozbywa się tej wiodącej 1 i spłaszcza się.

Misza Ławrow
źródło
Huh, spodziewałbym się, że Wolfram Language będzie miał wbudowany kod Morse'a. A może ma, ale jest zbyt gadatliwy?
Jack Brounstein
1
Nie mogłem znaleźć. (A dokumentacja zawiera przykładowy kod dla niektórych poleceń audio, które kodują kod Morse'a na stałe, czego nie spodziewałbym się, gdyby istniał wbudowany).
Misha Lavrov,
0

05AB1E , 37 bajtów

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

Wypróbuj online!


Koduje alfabet w bazie 3, przekonwertowany na bazę 255:

12021110212102110101121022101111011012220212012110220210222012210221201210111020112011120122021120212202211

Baza 255:

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

Następnie w zasadzie dzielę go na zera, konstruuję ciąg według pozycji i sprawdzam palindrom.

Urna Magicznej Ośmiornicy
źródło
0

C # (.NET Core) , 191 bajtów

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

Wypróbuj online!

Część tej odpowiedzi została zaadaptowana z golfa Morse'a Nicka Larsena . Opierając się na komentarzach do odpowiedzi, można potencjalnie pograć w golfa.

Nie golfowany:

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;
}
Surykatka
źródło
0

PowerShell , 204 187 bajtów

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

Wypróbuj online!

Błędy w łańcuchu zerowym ... Czy ktoś może w tym pomóc?

Kod testowy (po zawinięciu kodu w blok skryptu i przypisaniu do zmiennej $ 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

Wynik:

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
źródło
Witamy w PPCG.
Przyda
Dzięki, @mazzy!
KGlasier