此字符串是回文(莫尔斯电码)吗?


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

规则

输入值

输入可以采用任何合理的格式。在任何情况下,输入字符串仅包含字母。该字符串将不包含空格,数字或标点符号。

输出量

您的程序应根据输入是否为回文,输出2个恒定的不同结果中的1个,例如True / False,1/0,HOTDOG / NOTHOTDOG

计分

这是因此最短答案以字节为单位。禁止出现标准漏洞。

测试用例

输入=>输出

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


4
只有我的票是一锤子,我将VTC视为与Luis相关联的挑战的骗子。大多数解决方案的大部分将是将输入转换为莫尔斯电码。
粗野的

1
看起来所有解决方案都不过是一个摩尔斯电码映射,并加上了“与反向相同”检查,因此我将重复进行关闭。
xnor

2
遗憾的是,由于重复目标已指定(a)输入来自标准输入(不允许使用函数),并且(b)必须保留非[AZ] | [Az] | [0- 9],因为它们在输入中。这些一起在这里提供了一些答案,对移植来说并非易事。
乔纳森·艾伦

哦,老兄-好像我也要敲开!我以为我只投了一票。我再次将其关闭,但感觉可能不应该如此。
乔纳森·艾伦

Answers:


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基本上,它是相对于order的字符串中字母顺序的编码00ABCDEFGHIJKLMNOPQRSTUVWXYZ。Jelly具有内置功能,可以将排列转换为这样的数字,然后将这样的数字转换回排列。请参阅基于维基百科的阶乘数。
林恩

1
这是我很长时间以来见过的最酷的东西!因此,基本上,使用阶乘可以“知道”置换的位置,因为置换是按特定顺序进行的。这是恒定时间访问吗?线性的?登录?还有其他东西吗?
魔术章鱼缸


7

果冻  35 32 27  25 字节

-2感谢Dennis(转移排列以避免 %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

专用集成电路,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#答案:https : //codegolf.stackexchange.com/a/175126/83877。我采用了相同的想法,并将其应用于Python3。我尽了最大努力对代码进行高尔夫球化处理,但是我敢肯定,我还能做很多事情。

编辑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字节
Jo King

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 用制表符分割字符串。

XzGX输入(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

将每个字母替换为摩尔斯电码是该字母的前缀的字母(在这里ET只需通过未转义的进行删除_,但通常它们会变成空格)。例如,P莫尔斯电码的末尾W有一个额外的符号.;我们添加了.上述内容,因此现在剩下的只是解码W

}

重复上述步骤,直到没有剩余字母为止。

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

如果第一个和最后一个字符相同,则将它们都删除。

+`

重复匹配的多个字符。

^.?$

如果这是回文,则最多只剩下一个字符。


0

Wolfram语言(Mathematica),107个字节

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

在线尝试!

类似于这个 Jelly答案:我们认为摩尔斯电码是二进制的,并写下一个字符串" ETIANMSURWDKGOHVF L PJBXCYZQ",其中字符的位置(以二进制形式)为我们提供了摩尔斯电码。但是加上一个额外的1 ,例如因为我们想区分S = 000H = 0000。然后##2&@@@同时摆脱该前导1并展平。


嗯,我希望Wolfram语言内置莫尔斯电码。还是有一个,但是太冗长了?
杰克·布劳恩斯坦

1
我找不到一个。(并且文档中包含一些音频命令的示例代码,这些代码对莫尔斯电码进行硬编码,如果内置有,我不希望有。)
Misha Lavrov

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

在线尝试!

此答案的一部分改编自Nick Larsen的摩尔斯电码高尔夫。根据对答案的评论,这有可能进一步发展。

取消高尔夫:

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

PowerShell204 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


谢谢@mazzy!
KGlasier
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.