Chuỗi này có phải là một palindrom (trong Mã Morse) không?


16

Thử thách

Lấy cảm hứng từ video này

Như bạn có thể biết, palindrom là một từ được đánh vần giống như trước. Từ "PULP" không phải là một bảng màu, nhưng khi được dịch sang Mã Morse (với khoảng cách giữa các chữ cái bị xóa), "PULP" trở thành ". - ...-.-...--." đó là một palindrom. Nhiệm vụ của bạn là viết một chương trình hoặc hàm lấy một chuỗi và trả về việc từ đó có phải là một bảng màu trong Mã Morse quốc tế hay không.

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

Quy tắc

Đầu vào

Đầu vào có thể được thực hiện trong bất kỳ định dạng hợp lý. Chuỗi đầu vào sẽ chỉ chứa các chữ cái trong mọi trường hợp bạn thích. Chuỗi sẽ không chứa dấu cách, số hoặc dấu chấm câu.

Đầu ra

Chương trình của bạn sẽ xuất ra 1 trong 2 kết quả khác biệt không đổi dựa trên việc liệu đầu vào có phải là một bảng màu hay không, ví dụ: Đúng / Sai, 1/0, HOTDOG / NOTHOTDOG

Chấm điểm

Đây là để câu trả lời ngắn nhất trong byte thắng. Sơ hở tiêu chuẩn bị cấm.

Các trường hợp thử nghiệm

Đầu vào => Đầu ra

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


4
Chỉ có phiếu bầu của tôi là một cái búa, tôi VTC đây là một bản sao của thách thức mà Luis liên kết; phần lớn các giải pháp sẽ được chuyển đổi đầu vào thành mã Morse.
Xù xì

1
Có vẻ như tất cả các giải pháp chỉ là một ánh xạ mã Morse với một kiểm tra "giống như đảo ngược" được xử lý, vì vậy tôi đóng như một bản sao.
xnor

2
Thật đáng tiếc, điều này được đóng lại dưới dạng trùng lặp, vì mục tiêu trùng lặp đã chỉ định (a) đầu vào đó là từ đầu vào tiêu chuẩn (không cho phép các chức năng) và (b) người ta phải rời khỏi [AZ] | [Az] | [0- 9] vì chúng ở trong đầu vào. Cùng nhau làm cho một số câu trả lời ở đây ít hơn tầm thường với cổng.
Jonathan Allan

Ôi trời - hình như tôi cũng mở búa! Tôi nghĩ rằng tôi chỉ thực hiện một phiếu bầu duy nhất. Tôi đã đập nó một lần nữa, nhưng cảm thấy có lẽ không nên.
Jonathan Allan

Câu trả lời:


7

Thạch , 28 byte

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

Hãy thử trực tuyến!

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

Tôi đã viết câu trả lời này khi nhìn vào một trong số này (đọc các hàng từ phải sang trái và bạn nhận được chuỗi ma thuật của tôi!):

nhập mô tả hình ảnh ở đây


73,540,211,105,102,870,315,464,559,332nd... gì?! Làm thế nào bạn tìm thấy số đó ? Ngoài ra làm thế nào mà không mất mãi để chạy?
Bạch tuộc ma thuật Urn

@MagicOctopusUrn Về cơ bản, đó là mã hóa thứ tự của các chữ cái trong chuỗi đó so với thứ tự 00ABCDEFGHIJKLMNOPQRSTUVWXYZ. Jelly đã tích hợp sẵn để chuyển đổi một hoán vị thành một số như vậy và một số đó trở lại hoán vị. Xem cơ sở số giai thừa trên Wikipedia.
Lynn

1
Đó là điều tuyệt vời nhất tôi từng thấy trong một thời gian dài! Vì vậy, về cơ bản với các yếu tố bạn có thể "biết" vị trí hoán vị sẽ nằm ở đâu, bởi vì các hoán vị được thực hiện theo một thứ tự cụ thể. Đó có phải là một truy cập thời gian liên tục? Tuyến tính? Đăng nhập? Cái gì khác hoàn toàn?
Bạch tuộc ma thuật Urn


7

Thạch ,  35 32 27  25 byte

-2 nhờ Dennis (thay đổi hoán vị để tránh %32)

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

Đưa đầu vào trong chữ hoa; đầu ra là 1đúng, 0sai.

Hãy thử trực tuyến! Hoặc xem bộ thử nghiệm .

Làm sao?

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

Giải pháp 35 byte trước đó (cũng lấy đầu vào bằng chữ in hoa) ...

ØẠḣ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 byte

Nỗ lực đầu tiên, trước khi những khẩu súng lớn đến đây :-)

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

Đầu ra

? PULP
True

? RESEARCHER
True

? HOTDOGS
True

?
True

? A
False

? RACECAR
False

? PROGRAMMING
False

? PUZZLES
False


2

Perl 6 , 87 byte

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

Hãy thử trực tuyến!

Chuyển đổi từ thành một chuỗi 1 và 0 và kiểm tra xem nó có phải là palindromic không.

Giải trình:

             *.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 byte

Mã golf đầu tiên bao giờ hết. Hãy tử tế và cung cấp bất kỳ trợ giúp :)

Điều này dựa trên câu trả lời C #: /codegolf//a/175126/83877 . Tôi đã lấy những ý tưởng tương tự và áp dụng nó cho Python 3. Tôi đã cố gắng hết sức để chơi golf-ify mã, nhưng tôi chắc chắn rằng tôi còn có thể làm được nhiều hơn nữa.

EDIT 1: Cảm ơn @Stephen và @Cowabunghole đã giúp tôi xóa một số khoảng trắng và mã không cần thiết.

EDIT 2: Cảm ơn @JoKing về đề xuất thực hiện nó trong hệ nhị phân. Đây là một mẹo thực sự gọn gàng trong đó '-' và '.' thậm chí không cần thiết Điều này dẫn đến việc giảm byte rất lớn.

Giải pháp

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

Hãy thử trực tuyến!


1
Chào mừng đến với PPCG! Dưới đây là 152 byte với khoảng trắng được đánh dấu: Hãy thử trực tuyến!
Stephen

1
Một vài mẹo để lưu một vài ký tự: Xóa khoảng trắng ở mọi nơi bạn có thể. Ví dụ, bạn có thể thay đổi while i > 0:để while i>0:tiết kiệm 2 byte. Ngoài ra, tôi có thể sai nhưng tôi nghĩ bạn có thể loại bỏ > 0hoàn toàn và chỉ cần sử dụng while i:. Thứ hai, câu lệnh trong vòng lặp while có thể đi trên cùng một dòng với while, lưu dòng mới và thụt lề. Cuối cùng, đây là lời khuyên khủng khiếp ở mọi nơi trừ khi chơi golf, nhưng nếu bạn sử dụng Python 2 thay vì Python 3, bạn có thể tiết kiệm 1 byte từ việc sử dụng /thay vì //chia.
Cowabunghole

1
Oh, ngoài ra, bạn có thể sử dụng ~-ithay vì i-1. Đây là cùng số byte, nhưng sau đó bạn có thể bỏ qua dấu ngoặc đơn để lưu 2 byte.
Cowabunghole

1
Bạn có thể làm nhị phân thay vì sử dụng -.. 105 byte
Jo King

1
Không, tôi đã có câu trả lời Perl 6 sử dụng kỹ thuật này. Hãy sử dụng kỹ thuật này
Jo King

1

Bình thường, 35 33 byte

Mã này chứa các ký tự không thể in được, vì vậy đây là một 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

Hãy thử trực tuyến. Bộ thử nghiệm.

Giải trình

Bắt đầu từ ."cuối mã tạo ra bảng chữ cái Morse, với các dấu chấm \x08và dấu gạch ngang \x07và được phân tách bằng các tab.

c chia chuỗi bằng các tab.

XzGdịch ( X) đầu vào ( z) từ bảng chữ cái ( G) sang "bảng chữ cái Morse" này.

stổng (tham gia) các biểu tượng Morse với nhau. Đối với đầu vào trống, trả về 0, nhưng đây không phải là vấn đề.

_Ikiểm tra nếu kết quả không thay đổi ( I) khi đảo ngược ( _). Đối với đầu vào trống, kiểm tra nếu 0 không thay đổi khi bị phủ định.


0

Võng mạc 0.8.2 , 87 byte

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải trình:

[B-ILNPRSZ]
$&.

Tất cả các mã Morse cho các chữ cái trong bộ này đều kết thúc bằng ..

[AJKMOQT-Y]
$&-

Tất cả các mã Morse cho các chữ cái trong bộ này đều kết thúc bằng -.

T`L`\EDKN_UMS\EWNRTTMWGAI_ISADKG

Thay thế mỗi chữ cái bằng chữ cái có mã Morse là tiền tố của chữ cái đó (ở đây ETđược xóa đơn giản thông qua ký tự không được giải mã _, nhưng thông thường chúng sẽ được chuyển thành khoảng trắng). Chẳng hạn, Pmã Morse Wcó thêm .phần cuối; chúng tôi đã thêm .ở trên để bây giờ tất cả những gì còn lại là để giải mã W.

}

Lặp lại các giai đoạn trên cho đến khi không còn chữ cái nào.

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

Nếu các ký tự đầu tiên và cuối cùng giống nhau, hãy xóa cả hai.

+`

Lặp lại cho càng nhiều ký tự phù hợp.

^.?$

Nếu đây là một bảng màu, thì có nhiều nhất một ký tự.


0

Ngôn ngữ Wolfram (Mathicala) , 107 byte

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

Hãy thử trực tuyến!

Tương tự như câu trả lời Jelly này : chúng ta nghĩ mã Morse là nhị phân và viết ra một chuỗi " ETIANMSURWDKGOHVF L PJBXCYZQ"trong đó vị trí của một ký tự, trong nhị phân, cung cấp cho chúng ta mã Morse. Nhưng với thêm 1 dự phòng vì chúng tôi muốn phân biệt S = 000H = 0000, ví dụ. Sau đó ##2&@@@đồng thời thoát khỏi dẫn đầu 1 này và làm phẳng.


Huh, tôi đã mong đợi Ngôn ngữ Wolfram được tích hợp mã Morse. Hoặc nó có một cái, nhưng nó quá dài dòng?
Jack Brounstein

1
Tôi không thể tìm thấy một. (Và tài liệu này bao gồm mã ví dụ cho một số lệnh âm thanh mã cứng Morse, mã mà tôi không mong đợi nếu tồn tại tích hợp.)
Misha Lavrov

0

05AB1E , 37 byte

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

Hãy thử trực tuyến!


Mã hóa bảng chữ cái trong cơ sở 3, được chuyển đổi sang cơ sở 255:

12021110212102110101121022101111011012220212012110220210222012210221201210111020112011120122021120212202211

Cơ sở 255:

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

Sau đó, về cơ bản, tôi tách nó ra khỏi 0, xây dựng chuỗi theo vị trí và kiểm tra palindrom.


0

C # (.NET Core) , 191 byte

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

Hãy thử trực tuyến!

Một phần của câu trả lời này được chuyển thể từ môn đánh gôn morse của Nick Larsen . Dựa trên các ý kiến ​​về câu trả lời, điều này có khả năng có thể được đánh gôn hơn nữa.

Ung dung:

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 byte

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

Hãy thử trực tuyến!

Lỗi trên chuỗi null ... Có ai có thể giúp với điều này không?

Mã kiểm tra (Sau khi gói mã trong Khối tập lệnh và được gán cho biến $ 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

Đầu ra:

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

Chào mừng đến với PPCG. Nó sẽ hữu ích cho bạn để xem Mẹo chơi gôn trong PowerShell
mazzy

Cảm ơn, @mazzy!
KGlasier
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.