この文字列は回文(モールス信号)ですか?


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
私の投票だけがハンマーです。これは、ルイスがリンクしたチャレンジのduとしてVTCにしたいと思います。ほとんどのソリューションの大部分は、入力をモールス信号に変換します。
シャギー

1
すべてのソリューションは、「逆と同じ」チェックが付けられたモールス符号マッピングであるように見えるため、重複して閉じています。
XNOR

2
複製先が(a)入力が標準入力(関数を許可しない)からのものであり、(b)非[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?

私はこれらの1つを見てこの答えを書きました(行を右から左に読んでください、そしてあなたは私の魔法の文字列を取得します!):

ここに画像の説明を入力してください


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ŒḂ

入力を大文字にします。出力は1true、0falseの場合です。

オンラインでお試しください!または、テストスイートを参照してください。

どうやって?

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の3172の 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
いくつかの文字を保存するためのいくつかのヒント:できる限り空白を削除します。たとえば、2バイトを節約while i > 0:するwhile i>0:ように変更できます。また、私は間違っている可能性がありますが、> 0完全に廃止し、単に使用することができると思いますwhile i:。次に、whileループ内のステートメントはwhileと同じ行に移動でき、改行とインデントを保存できます。最後に、これはコードゴルフの場合を除いてどこでもひどいアドバイスですが、Python 3の代わりにPython 2を使用/すると//、除算の代わりに1バイトを節約できます。
Cowabunghole

1
また、~-i代わりにを使用することもできますi-1。これは同じバイト数ですが、2バイトを節約する括弧を省略することができます。
Cowabunghole

1
-およびを使用する代わりにバイナリを実行できます.105バイト
ジョーキング

1
いや、このテクニックを使ったPerl 6の答えはすでにあります。テクニックを自由に使用してください
ジョーキング

1

Pyth、35 33バイト

コードには印刷できない文字が含まれているため、16進ダンプを示します。

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を返しますが、これは問題ではありません。

_II反転(_)しても結果が変わらない()かどうかをチェックします。入力が空の場合、否定されたときに0が変わらないかどうかをチェックします。


0

Retina 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

最初と最後の文字が同じ場合は、両方を削除します。

+`

一致する文字の数だけ繰り返します。

^.?$

これが回文である場合、最大で1文字が残っています。


0

Wolfram言語(Mathematica)、107バイト

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

オンラインでお試しください!

このゼリーの答えと同様に、モールス信号をバイナリと考え、バイナリの文字" ETIANMSURWDKGOHVF L PJBXCYZQ"の位置がモールス信号を与える文字列を書き留めます。しかし、たとえばS = 000とを区別したいので、追加の1を追加H = 0000します。次に##2&@@@、この先頭の1を同時に取り除き、フラット化します。


ええと、Wolfram Languageにはモールス信号が組み込まれていると思っていました。または、1つありますが、冗長すぎますか?
ジャックブラウンスタイン

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

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

オンラインでお試しください!

NULL文字列のエラー...誰でもこれを助けることができますか?

コードのテスト(スクリプトブロックでコードをラップし、変数$ 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.