Является ли эта строка палиндромом (в азбуке Морзе)?


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

Попробуйте онлайн!

Преобразует слово в серию из 1 и 0 и проверяет, является ли оно палиндромным.

Объяснение:

             *.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. Я старался изо всех сил, чтобы поиграть в код, но я уверен, что я могу сделать гораздо больше.

РЕДАКТИРОВАТЬ 1: Спасибо @Stephen и @Cowabunghole за помощь в удалении пробелов и ненужного кода.

РЕДАКТИРОВАТЬ 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 может идти в той же строке, что и while, сохраняя новую строку и отступ. И, наконец, это ужасный совет везде, кроме случаев, когда вы играете в код, но если вы используете Python 2 вместо Python 3, вы можете сэкономить 1 байт /вместо использования //для деления.
Cowabunghole

1
О, также, вы можете использовать ~-iвместо i-1. Это то же количество байтов, но вы можете опустить скобки, которые экономят 2 байта.
Cowabunghole

1
Вы можете сделать двоичный файл вместо использования -и .. 105 байтов
Джо Кинг,

1
Нет, у меня уже есть ответ на Perl 6, который использует технику. Не стесняйтесь использовать технику
Джо Кинг

1

Pyth, 35 33 байта

Код содержит непечатаемые символы, так что вот 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

Попробуйте онлайн. Тестирование.

объяснение

Начиная с ."конца кода генерируется азбука Морзе с точками в виде\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

Wolfram Language (Mathematica) , 107 байт

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

Попробуйте онлайн!

Аналогично этому ответу Jelly: мы думаем о коде Морзе как о двоичном и записываем строку, в " 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;}

Попробуйте онлайн!

Часть этого ответа была адаптирована из азбуки Морзе Ника Ларсена . Основываясь на комментариях к ответу, это может быть дальше.

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

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.