สตริงนี้เป็น palindrome (ในรหัสมอร์ส) หรือไม่


16

ท้าทาย

แรงบันดาลใจจากวิดีโอนี้

อย่างที่คุณอาจทราบว่า palindrome เป็นคำที่สะกดเหมือนกันกับที่เป็นไปข้างหลัง คำว่า "PULP" ไม่ใช่ Palindrome แต่เมื่อแปลเป็น Morse Code (เมื่อเว้นวรรคระหว่างตัวอักษรที่ลบออก) "PULP" จะกลายเป็น ". - ... -.-... -." ซึ่งเป็น palindrome งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นซึ่งใช้สตริงและส่งคืนว่าคำนั้นเป็น Palindrome ใน International Morse Code หรือไม่

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 โดยขึ้นอยู่กับว่าอินพุตเป็น Palindrome เช่น True / False, 1/0, HOTDOG / NOTHOTDOG

เกณฑ์การให้คะแนน

นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

กรณีทดสอบ

อินพุต => เอาท์พุท

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


4
เฉพาะการโหวตของฉันคือค้อนฉันจะ VTC นี่เป็นคู่ปรับของความท้าทายที่หลุยส์เชื่อมโยง กลุ่มโซลูชั่นส่วนใหญ่จะทำการแปลงอินพุตให้เป็นรหัสมอร์ส
Shaggy

1
ดูเหมือนว่าการแก้ปัญหาทั้งหมดเป็นเพียงการจับคู่รหัสมอร์สที่มีเครื่องหมาย "เหมือนกับย้อนกลับ" ดังนั้นฉันจึงปิดเป็นรายการซ้ำ
xnor

2
มันเป็นความอัปยศที่ถูกปิดเนื่องจากซ้ำกันเนื่องจากเป้าหมายที่ซ้ำกันได้ระบุไว้ (a) อินพุตนั้นมาจากอินพุตมาตรฐาน (ฟังก์ชั่นที่ไม่อนุญาต) และ (b) หนึ่งต้องไม่ปล่อย [AZ] | [Az] | [0- 9] ตามที่อยู่ในอินพุต การรวมกันเหล่านี้ทำให้คำตอบที่นี่น้อยกว่าเล็กน้อยที่จะพอร์ต
Jonathan Allan

โอ้มนุษย์ - ดูเหมือนว่าฉันจะเปิดด้วยเช่นกัน! ฉันคิดว่าฉันเพิ่งจะลงคะแนนเดียว ฉันใช้ค้อนทุบมันปิดอีกครั้ง แต่รู้สึกว่ามันไม่ควรจะเป็น
Jonathan Allan

คำตอบ:


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... อะไร?! คุณพบหมายเลขนั้นได้อย่างไร ด้วยวิธีการที่ไม่ใช้เวลาตลอดไปในการทำงาน?
Magic Octopus Urn

@MagicOctopusUrn 00ABCDEFGHIJKLMNOPQRSTUVWXYZโดยทั่วไปก็การเข้ารหัสของคำสั่งของตัวอักษรในการที่สตริงเทียบกับการสั่งซื้อ เจลลี่ได้มีการสร้างการแปลงการเปลี่ยนแปลงในจำนวนดังกล่าวและจำนวนกลับเข้าไปในการเปลี่ยนแปลง ดูตัวเลขฐานแฟคทอเรียลบนวิกิพีเดีย
ลินน์

1
นั่นคือสิ่งที่ยอดเยี่ยมที่สุดที่ฉันเคยพบเห็นมานาน! ดังนั้นโดยพื้นฐานกับแฟคทอเรียลคุณสามารถ "รู้" ว่าการเรียงสับเปลี่ยนจะอยู่ที่ไหนเพราะการเรียงสับเปลี่ยนจะทำตามลำดับที่เฉพาะเจาะจง นั่นเป็นการเข้าถึงเวลาที่แน่นอนหรือไม่ เชิงเส้น? เข้าสู่ระบบ? มีอะไรอีกบ้าง?
Magic Octopus Urn


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 bytes

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

ลองออนไลน์!

แปลงคำเป็นชุดของ 1s และ 0s แล้วตรวจสอบว่าเป็น palindromic หรือไม่

คำอธิบาย:

             *.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 /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:ประการที่สองคำสั่งในขณะที่ลูปสามารถไปในบรรทัดเดียวกันกับในขณะที่ประหยัดขึ้นบรรทัดใหม่และเยื้อง สุดท้ายนี้เป็นคำแนะนำที่น่ากลัวทุกที่ยกเว้นเมื่อใช้รหัสกอล์ฟ แต่ถ้าคุณใช้ 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 ไบต์

รหัสมีอักขระที่ไม่สามารถพิมพ์ได้ดังนั้นนี่คือ 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จะถูกลบเพียงแค่ผ่านทาง unescaped _แต่โดยปกติแล้วพวกเขาจะกลายเป็นช่องว่าง) ตัวอย่างเช่นPเป็นรหัสมอร์สWด้วยการเสริม.ในตอนท้าย; เราเพิ่มดังกล่าวข้างต้นดังนั้นตอนนี้ทั้งหมดที่เหลืออยู่คือการถอดรหัส.W

}

ทำซ้ำขั้นตอนข้างต้นจนกว่าจะไม่มีตัวอักษรเหลืออยู่

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

หากอักขระตัวแรกและตัวสุดท้ายเหมือนกันให้ลบออกทั้งคู่

+`

ทำซ้ำสำหรับอักขระที่ตรงกันมากที่สุด

^.?$

หากนี่คือ palindrome แสดงว่ามีอักขระไม่เกินหนึ่งตัว


0

ภาษา Wolfram (Mathematica) , 107 ไบต์

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

ลองออนไลน์!

คล้ายกับคำตอบของเยลลี่นี้ : เราคิดว่ารหัสมอร์สเป็นเลขฐานสองและเขียนสตริง" ETIANMSURWDKGOHVF L PJBXCYZQ"ที่ตำแหน่งของตัวละครในรูปแบบไบนารีให้รหัสมอร์สของเรา แต่ด้วยการเสริมพิเศษ 1 รายการเพราะเราต้องการแยกแยะS = 000และH = 0000ตัวอย่างเช่น จากนั้นก็##2&@@@กำจัด 1 ชั้นนำและแบนไปพร้อม ๆ กัน


อืมฉันคาดว่า Wolfram Language จะมีรหัสมอร์สในตัว หรือมันมีหนึ่ง แต่มัน verbose มากเกินไป?
Jack Brounstein

1
ฉันหาไม่เจอ (และเอกสารรวมถึงโค้ดตัวอย่างสำหรับคำสั่งเสียงบางอย่างที่ยากรหัสรหัสมอร์สซึ่งผมจะไม่คาดหวังว่าหากในตัวมีอยู่.)
Misha Lavrov

0

05AB1E , 37 ไบต์

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

ลองออนไลน์!


เข้ารหัสตัวอักษรในฐาน 3 แปลงเป็นฐาน 255:

12021110212102110101121022101111011012220212012110220210222012210221201210111020112011120122021120212202211

ฐาน 255:

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

จากนั้นโดยทั่วไปฉันแยกมันออกจาก 0 สร้างสตริงตามตำแหน่งและตรวจสอบ palindrome


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นิคเสนกอล์ฟรหัสมอร์สจากความคิดเห็นเกี่ยวกับคำตอบสิ่งนี้อาจเกิดขึ้นได้อีก

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

ลองออนไลน์!

ข้อผิดพลาดในสตริง 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

ขอบคุณ @azaz!
KGlasier
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.