Apakah string ini palindrome (dalam Kode Morse)?


16

Tantangan

Terinspirasi oleh video ini

Seperti yang Anda ketahui, palindrome adalah kata yang dieja sama maju seperti mundur. Kata "PULP" bukanlah palindrom, tetapi ketika diterjemahkan ke dalam Kode Morse (dengan jarak antar huruf dihapus), "PULP" menjadi ". - ...-.-...--." yang merupakan palindrome. Tugas Anda adalah menulis program atau fungsi yang mengambil string dan mengembalikan apakah kata itu palindrom dalam Kode Morse Internasional.

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

Aturan

Memasukkan

Masukan dapat diambil dalam format apa pun yang masuk akal. String input hanya akan berisi huruf dalam hal apa pun yang Anda inginkan. String tidak akan berisi spasi, angka, atau tanda baca.

Keluaran

Program Anda harus menampilkan 1 dari 2 hasil konstan yang berbeda berdasarkan pada apakah inputnya adalah palindrom, misalnya Benar / Salah, 1/0, HOTDOG / NOTHOTDOG

Mencetak gol

Ini adalah sehingga jawaban terpendek dalam byte menang. Celah standar dilarang.

Uji Kasus

Input => Output

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


4
Hanya suara saya adalah palu, saya akan VTC ini sebagai penipu dari tantangan Luis terkait; sebagian besar solusi akan mengkonversi input ke kode Morse.
Shaggy

1
Sepertinya semua solusi hanyalah pemetaan kode Morse dengan pemeriksaan "sama dengan membalikkan", jadi saya menutup sebagai duplikat.
xnor

2
Sayang sekali ini ditutup sebagai duplikat, karena target-duplikat telah menentukan (a) bahwa input berasal dari input standar (fungsi pelarangan) dan (b) seseorang harus meninggalkan non [AZ] | [Az] | [0] 9] karena mereka berada di input. Bersama-sama ini membuat beberapa jawaban di sini kurang dari sepele untuk port.
Jonathan Allan

Oh man - sepertinya aku juga palu! Saya pikir saya hanya membuat satu suara. Saya telah memalu tutupnya lagi, tetapi merasa mungkin tidak seharusnya.
Jonathan Allan

Jawaban:


7

Jelly , 28 byte

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

Cobalah online!

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

Saya menulis jawaban ini melihat salah satu dari ini (baca baris dari kanan ke kiri, dan Anda mendapatkan string ajaib saya!):

masukkan deskripsi gambar di sini


73,540,211,105,102,870,315,464,559,332nd... apa?! Bagaimana Anda menemukan bahwa nomor? Juga bagaimana yang tidak mengambil selamanya untuk menjalankan?
Magic Octopus Mm

@MagicOctopusUrn Pada dasarnya, ini adalah penyandian urutan huruf dalam string relatif terhadap urutan 00ABCDEFGHIJKLMNOPQRSTUVWXYZ. Jelly memiliki built-in untuk mengubah permutasi menjadi angka seperti itu, dan angka tersebut kembali ke permutasi. Lihat basis nomor faktorial di Wikipedia.
Lynn

1
Itu adalah hal paling keren yang pernah saya lihat dalam waktu yang lama! Jadi pada dasarnya dengan faktorial Anda bisa "tahu" di mana permutasi akan terletak, karena permutasi dilakukan dalam urutan tertentu. Apakah itu akses waktu yang konstan? Linier? Catatan? Sesuatu yang lain sama sekali?
Magic Gurita Guci


7

Jelly ,  35 32 27  25 byte

-2 Berkat Dennis (ubah permutasi untuk menghindari %32)

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

Mengambil input dalam huruf besar; output adalah 1true, 0false.

Cobalah online! Atau lihat test-suite .

Bagaimana?

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

Solusi 35 byte sebelumnya (juga membutuhkan input dalam huruf besar) ...

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

Upaya pertama, sebelum senjata besar sampai di sini :-)

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

Keluaran

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

Cobalah online!

Ubah kata menjadi serangkaian 1s dan 0s dan periksa apakah palindromik.

Penjelasan:

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

Golf kode pertama. Mohon berbaik hati dan menawarkan bantuan :)

Ini didasarkan pada jawaban C #: /codegolf//a/175126/83877 . Saya mengambil ide yang sama dan menerapkannya pada Python 3. Saya mencoba yang terbaik untuk golf-ify kode, tapi saya yakin ada banyak lagi yang bisa saya lakukan.

EDIT 1: Terima kasih @Stephen dan @Cowabunghole karena membantu saya menghapus beberapa spasi putih dan kode yang tidak perlu.

EDIT 2: Terima kasih @ JoKing atas saran untuk melakukannya dalam biner. Ini adalah trik yang sangat rapi di mana '-' dan '.' bahkan tidak perlu. Ini menyebabkan penurunan byte yang sangat besar.

Larutan

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

Cobalah online!


1
Selamat datang di PPCG! Berikut 152 byte dengan whitespace golf off: Cobalah online!
Stephen

1
Beberapa tips untuk menyimpan beberapa karakter: Hapus spasi putih di mana pun Anda bisa. Misalnya, Anda dapat mengubah while i > 0:untuk while i>0:menyimpan 2 bytes. Juga, saya bisa saja salah tetapi saya pikir Anda bisa menghapus > 0semuanya dan hanya menggunakan while i:. Kedua, pernyataan di loop sementara bisa pergi pada baris yang sama dengan while, menyimpan baris baru dan lekukan. Terakhir, ini adalah saran yang mengerikan di mana-mana kecuali saat bermain golf, tetapi jika Anda menggunakan Python 2 dan bukan Python 3, Anda dapat menghemat 1 byte dari penggunaan /alih-alih //untuk pembagian.
Cowabunghole

1
Oh, juga, Anda dapat menggunakan ~-ibukan i-1. Ini adalah jumlah byte yang sama, tetapi Anda kemudian dapat menghilangkan tanda kurung yang menghemat 2 byte.
Cowabunghole

1
Anda bisa melakukan biner daripada menggunakan -dan .. 105 byte
Jo King

1
Nah, saya sudah mendapat jawaban Perl 6 yang menggunakan teknik ini. Jangan ragu untuk menggunakan teknik ini
Jo King

1

Pyth, 35 33 byte

Kode berisi karakter yang tidak patut dicetak, jadi ini 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

Cobalah online. Suite uji.

Penjelasan

Mulai dari ."akhir kode menghasilkan alfabet Morse, dengan titik-titik sebagai \x08dan berlari sebagai \x07, dan dipisahkan oleh tab.

c memisahkan string dengan tab.

XzGmenerjemahkan ( X) input ( z) dari alfabet ( G) ke "alfabet Morse" ini.

smenjumlahkan (bergabung) simbol Morse bersama-sama. Untuk input kosong, mengembalikan 0, tetapi ini bukan masalah.

_Imemeriksa apakah hasilnya tidak berubah ( I) saat dibalik ( _). Untuk input kosong, periksa apakah 0 tidak berubah ketika dinegasikan.


0

Retina 0.8.2 , 87 byte

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

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

[B-ILNPRSZ]
$&.

Semua kode Morse untuk huruf-huruf pada set ini diakhiri dengan ..

[AJKMOQT-Y]
$&-

Semua kode Morse untuk huruf-huruf pada set ini diakhiri dengan -.

T`L`\EDKN_UMS\EWNRTTMWGAI_ISADKG

Ganti setiap huruf dengan huruf yang kode Morse-nya adalah awalan dari huruf itu (di sini Edan Thanya dihapus melalui yang tidak terhapuskan _, tetapi biasanya mereka akan berubah menjadi spasi). Misalnya, Padalah kode Morse Wdengan tambahan .di bagian akhir; kami menambahkan di .atas jadi sekarang yang tersisa adalah untuk memecahkan kode W.

}

Ulangi tahap di atas sampai tidak ada huruf yang tersisa.

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

Jika karakter pertama dan terakhir sama, hapus keduanya.

+`

Ulangi sebanyak karakter yang cocok.

^.?$

Jika ini adalah palindrome, maka paling tidak ada satu karakter yang tersisa.


0

Bahasa Wolfram (Mathematica) , 107 byte

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

Cobalah online!

Mirip dengan jawaban Jelly ini : kita menganggap kode Morse sebagai biner, dan menuliskan string di " ETIANMSURWDKGOHVF L PJBXCYZQ"mana posisi karakter, dalam biner, memberi kita kode Morse-nya. Tetapi dengan 1 tambahan ditambahkan karena kami ingin membedakan S = 000dan H = 0000, misalnya. Kemudian ##2&@@@secara bersamaan menyingkirkan 1 terkemuka ini dan meratakan.


Huh, saya sudah mengira Bahasa Wolfram memiliki kode Morse bawaan. Atau apakah ada, tapi terlalu bertele-tele?
Jack Brounstein

1
Saya tidak dapat menemukan satu. (Dan dokumentasi termasuk contoh kode untuk beberapa perintah audio yang mengkode kode Morse, yang tidak saya harapkan jika ada built-in.)
Misha Lavrov

0

05AB1E , 37 byte

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

Cobalah online!


Mengkodekan alfabet dalam basis 3, dikonversi ke basis 255:

12021110212102110101121022101111011012220212012110220210222012210221201210111020112011120122021120212202211

Basis 255:

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

Kemudian pada dasarnya, saya pisahkan pada 0's, membangun string dengan posisi dan memeriksa palindrome.


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

Cobalah online!

Sebagian dari jawaban ini diadaptasi dari kode morse golf Nick Larsen . Berdasarkan komentar pada jawabannya, ini bisa berpotensi untuk golf lebih lanjut.

Tidak Terkumpul:

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

Cobalah online!

Kesalahan pada string nol ... Adakah yang bisa membantu dengan ini?

Kode uji (Setelah membungkus kode dalam Blok Skrip dan ditugaskan ke variabel $ 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

Keluaran:

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

Selamat datang di PPCG. Ini akan berguna bagi Anda untuk melihat Tips untuk bermain golf di PowerShell
mazzy

Terima kasih, @mazzy!
KGlasier
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.