Чи є ця струна паліндром (за кодом Морзе)?


16

Виклик

Натхненний цим відео

Як ви можете знати, паліндром - це слово, яке пишеться так само, як і назад. Слово "PULP" не є паліндром, але при перекладі в код Морзе (з проміжком між літерами видалено) "PULP" стає ". - ...-.-...--". що є паліндром. Ваше завдання - написати програму або функцію, яка бере рядок і повертає, чи є це слово паліндром у Міжнародному кодексі Морзе.

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

Правила

Вхідні дані

Введення даних може бути здійснено у будь-якому розумному форматі. Рядок введення буде містити лише літери в будь-якому випадку, який ви бажаєте. Рядок не буде містити пробілів, чисел або розділових знаків.

Вихідні дані

Ваша програма повинна виводити 1 з 2 постійних чітких результатів на основі того, чи є вхід паліндром, наприклад, True / False, 1/0, HOTDOG / NOTHOTDOG

Оцінка балів

Це тому найкоротша відповідь у байтах виграє. Стандартні лазівки заборонені.

Випробування

Вхід => Вихід

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


4
Тільки мій голос - це молот, я б надавав це на виклик як невідступну проблему, яку Луїс пов’язував; Основна частина більшості рішень буде перетворювати вхід в код Морзе.
Кудлатий

1
Схоже, що всі рішення - це лише відображення коду Морзе з позначкою "те саме, що і зворотний", тому я закриваюсь як дублікат.
xnor

2
Прикро, що це закрито як дублікат, оскільки дублікат-ціль вказав (а), що введення відбувається зі стандартного вводу (забороняє функції) і (б) потрібно залишити не [AZ] | [Az] | [0- 9], як вони знаходяться на вході. Разом вони роблять тут деякі відповіді менш тривіальними для порту.
Джонатан Аллан

О людино - схоже, я і молот відкритий! Я думав, що щойно я провів один голос. Я знову забив її закритою, але відчуваю, що може бути не так.
Джонатан Аллан

Відповіді:


7

Желе , 28 байт

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

Спробуйте в Інтернеті!

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

Я написав цю відповідь, дивлячись на один із них (читайте рядки справа наліво, і ви отримуєте мою чарівну рядок!):

введіть тут опис зображення


73,540,211,105,102,870,315,464,559,332nd... що?! Як ти знайшов це число? Також як це не потрібно вічно бігати?
Чарівний восьминога Урна

@MagicOctopusUrn В основному це кодування порядку букв у цьому рядку щодо порядку 00ABCDEFGHIJKLMNOPQRSTUVWXYZ. Jelly має вбудовані модулі для перетворення перестановки в таке число, а таке число назад у перестановку. Дивіться базу фактичних номерів у Вікіпедії.
Лінн

1
Це найкрутіша річ, яку я бачив за довгий час! Тому в основному за допомогою фабрикантів ви можете «знати», де буде лежати перестановка, оскільки перестановки робляться в певному порядку. Це постійний доступ у часі? Лінійний? Увійти? Щось ще цілком?
Чарівний восьминога Урна


7

Желе ,  35 32 27  25 байт

-2 завдяки Деннісу (змініть перестановку, щоб уникнути %32)

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

Вводить великі регістри; вихід - 1для істинного, 0для хибного.

Спробуйте в Інтернеті! Або побачити тест-люкс .

Як?

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

Попереднє 35-байтне рішення (також приймає вхід у верхній регістр) ...

ØẠḣ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 байт

Перша спроба, перш ніж великі гармати потраплять сюди :-)

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

Вихідні дані

? PULP
True

? RESEARCHER
True

? HOTDOGS
True

?
True

? A
False

? RACECAR
False

? PROGRAMMING
False

? PUZZLES
False


2

Perl 6 , 87 байт

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

Спробуйте в Інтернеті!

Перетворює слово в ряд 1s і 0s і перевіряє, чи воно паліндромне.

Пояснення:

             *.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 байт

Перший код гольф коли-небудь. Будь ласка, будьте ласкаві і запропонуйте будь-яку допомогу :)

Це засновано на відповіді C #: /codegolf//a/175126/83877 . Я взяв ті самі ідеї і застосував її до Python 3. Я спробував усе можливе, щоб код гольф-ify, але я впевнений, що я можу зробити набагато більше.

EDIT 1: Дякую @Stephen та @Cowabunghole, що допомогли мені видалити пробіл та непотрібний код.

EDIT 2: Дякую @JoKing за пропозицію зробити це у двійковій формі. Це дійсно акуратний трюк, де "-" і "." навіть не потрібні. Це призвело до величезного зменшення байтів.

Рішення

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

Спробуйте в Інтернеті!


1
Ласкаво просимо до PPCG! Ось 152 байти з пробілом у гольф: Спробуйте в Інтернеті!
Стівен

1
Кілька порад, щоб зберегти кілька символів: Видаліть пробіли скрізь, де можна. Наприклад, ви можете змінити , while i > 0:щоб while i>0:врятувати 2 байта. Крім того, я можу помилитися, але я думаю, що ти можеш взагалі покінчити > 0і просто скористатися while i:. По-друге, оператор у циклі while може переходити на той самий рядок, що й час, зберігаючи новий рядок та відступ. Нарешті, це жахлива порада скрізь, за винятком випадків, коли ви використовуєте код для гольфу, але якщо ви використовуєте Python 2 замість Python 3, ви можете зберегти 1 байт від використання, /а не //для поділу.
Cowabunghole

1
О, також, ви можете використовувати ~-iзамість цього i-1. Це така ж кількість байтів, але ви можете опустити дужки, що зберігає 2 байти.
Cowabunghole

1
Ви можете робити двійкові замість використання -та .. 105 байт
Джо Кінг

1
Ні, я вже отримав відповідь Perl 6, яка використовує техніку. Не соромтеся використовувати техніку
Jo King

1

Pyth, 35 33 байт

Код містить недруковані символи, тож ось шестнадцятковий.

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

Спробуйте в Інтернеті. Тестовий набір.

Пояснення

Починаючи з ."кінця коду, генерується алфавіт Морзе, з точками як \x08і тире як \x07і розділеними вкладками.

c розбиває рядок на вкладки.

XzGпереводить ( X) вхід ( z) з алфавіту ( G) в цей "алфавіт Морзе".

sпідсумовує (приєднується) символи Морзе разом. Для порожніх входів повертає 0, але це не проблема.

_Iперевіряє, чи результат не змінюється ( I) при звороті ( _). Для порожнього введення перевіряйте, чи 0 не змінюється, коли його заперечують.


0

Сітківка 0,8,2 , 87 байт

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

Спробуйте в Інтернеті! Посилання включає тестові випадки. Пояснення:

[B-ILNPRSZ]
$&.

Всі коди Морзе для букв у цьому наборі закінчуються на ..

[AJKMOQT-Y]
$&-

Всі коди Морзе для букв у цьому наборі закінчуються на -.

T`L`\EDKN_UMS\EWNRTTMWGAI_ISADKG

Замінити кожну букву з буквою якого азбука Морзе є префіксом цього листа (тут Eі Tпросто видаляються через неекранований _, але , як правило , вони будуть перетворені в пробілу). Наприклад, Pце код Морзе Wз додатковим .на кінці; ми додали .вище, так що тепер залишається лише розшифрувати W.

}

Повторіть вищезазначені етапи, поки не залишиться літер.

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

Якщо перший і останній символи однакові, видаліть їх обох.

+`

Повторіть для якомога більшої кількості символів.

^.?$

Якщо це був паліндром, то залишився щонайменше один символ.


0

Мова Вольфрама (Mathematica) , 107 байт

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

Спробуйте в Інтернеті!

Подібно до цієї відповіді Джеллі: ми вважаємо код Морзе як двійковий, і записуємо рядок, " ETIANMSURWDKGOHVF L PJBXCYZQ"де положення символу у двійковій формі дає нам його код Морзе. Але з додатковою 1 передує , тому що ми хочемо , щоб розрізняти S = 000і H = 0000, наприклад. Потім ##2&@@@одночасно позбавляється від цього ведучого 1 і сплющується.


Так, я б очікував, що у Wolfram Language буде вбудований код Морзе. Або він має його, але він занадто багатослівний?
Джек Браунштейн

1
Я не зміг його знайти. (І документація включає приклад коду для деяких звукових команд, які жорстко кодує Морзе, який я б не очікував, якщо існує вбудований модуль.)
Міша Лавров

0

05AB1E , 37 байт

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

Спробуйте в Інтернеті!


Кодує алфавіт у базі 3, перетворений на базу 255:

12021110212102110101121022101111011012220212012110220210222012210221201210111020112011120122021120212202211

База 255:

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

Тоді я в основному розбиваю його на 0, будую рядок за позицією та перевіряю на паліндром.


0

C # (.NET Core) , 191 байт

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

Спробуйте в Інтернеті!

Частина цієї відповіді була адаптована з гольф-коду Морза Коля Ніка Ларсена . Виходячи з коментарів до відповіді, це потенційно може бути додатково гольф.

Безголівки:

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 байт

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

Спробуйте в Інтернеті!

Помилки нульового рядка ... Чи може хтось у цьому допомогти?

Тестовий код (Після загортання коду в блок скриптів і присвоєння змінної $ 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

Вихід:

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

Ласкаво просимо до PPCG. Вам буде корисно подивитися Поради щодо гольфу в PowerShell
mazzy

Дякую, @mazzy!
KGlasier
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.