Saya simetris, bukan palindromik!

22

Latar Belakang

Terinspirasi oleh saya seorang palindrome. Apakah kamu? , di mana disajikan fakta yang mengejutkan bahwa " ()()bukan palindrome, tapi ())(", saya bertanya pada diri sendiri apa yang ada ()()dan jawabannya adalah sederhana: itu adalah string dengan sumbu simetri vertikal!

Tugas

Tulis program atau fungsi yang menggunakan string S (atau padanan yang sesuai dalam bahasa Anda) sebagai input, memeriksa simetri di sepanjang sumbu vertikal, dan mengembalikan nilai yang benar atau salah . Anda dapat menggunakan segala cara yang masuk akal untuk mengambil input dan memberikan output.

Simetri reflektif

Simetri reflektif di sekitar sumbu vertikal (atau simetri kiri-kanan) berarti bahwa jika Anda meletakkan cermin secara vertikal di tengah tepat string, gambar yang dipantulkan pada paruh pertama string identik dengan paruh kedua string.

Misalnya, string berikut simetris reflektif di sekitar sumbu vertikal:

()()
()()()
[A + A]
WOW ! WOW
OH-AH_wx'xw_HA-HO
(<<[[[T*T]]]>>)
(:)
)-(
())(()
qpqp

sedangkan yang berikut ini tidak:

())(
((B))
11
+-*+-
WOW ! wow
(;)
qppq

Aturan kontes

• Program atau fungsi Anda hanya akan menerima karakter ASCII yang dapat dicetak. Anda dapat memasukkan atau tidak string kosong, (yang tentu saja simetris!) Sebagai masukan hukum, yang lebih baik untuk Anda.

• Karakter ASCII yang dapat dianggap simetris sehubungan dengan sumbu vertikal adalah sebagai berikut (perhatikan ruang awal, dan perbedaan antara huruf besar dan kecil):

 !"'+*-.:=AHIMOTUVWXY^_ovwx|

Karakter ASCII yang dapat dianggap "dicerminkan" dan karakter yang sesuai adalah:

()<>[]{}qpbd/\

Perhatikan bahwa, karena mereka dicerminkan, Anda dapat memiliki keduanya ()juga )(, /\dan \/, dll.

Semua karakter ASCII yang dapat dicetak lainnya harus dianggap asimetris dan tanpa karakter yang sesuai dengan cermin.

• Ini adalah tantangan : semakin pendek program Anda, diukur dalam byte, semakin baik, dalam bahasa pemrograman apa pun.

• Pujian kepada orang-orang yang akan menghasilkan program simetris!

Catatan : pertanyaan ini bukan merupakan duplikat dari "Convenient Palindrome" , yang mengharuskan untuk memeriksa string palindrom di mana tanda kurung dibalik. Pertanyaan ini berbeda karena dua alasan:

1) itu adalah pembatasan pertanyaan lain untuk apa yang menyangkut karakter non-kurung, karena hanya karakter simetris yang dapat muncul dalam urutan terbalik.

2) Karena didasarkan pada konsep simetri, dan bukan pada konsep "palindrom nyaman", karakter cermin dapat muncul dalam kedua urutan, yaitu []dan ][, dan ini membuat program untuk menyelesaikannya berbeda dari program yang memecahkan masalah lainnya. .

Renzo
sumber
6
Hanya untuk siapa saja yang bertanya-tanya, Charcoal tidak mencerminkan huruf. :(
totallyhuman
4
Saya tidak setuju dengan dupeyness, karena target dupe tidak mencerminkan huruf dan ini tidak.
Stephen
Maaf, saya melewatkan contoh, kesalahan saya
jrtapsell
6
Mengapa tidak 8dianggap "simetris"?
Scott Milner
2
@ FunkyComputerMan Ini pada dasarnya tidak sama dengan target dupe sama sekali. Pertama dan terutama, ini tidak memiliki batasan kode sumber.
Jonathan Allan

Jawaban:

7

JavaScript (ES6), 130 125 113 byte

f=
s=>s==[...s].reverse(s=`()<>[]{}qpbd/\\`).map(c=>s[s.indexOf(c)^1]||/[- !"'+*.:=AHIMOT-Y^_ovwx|]/.exec(c)).join``
<input oninput=o.textContent=f(this.value)><pre id=o>

Sunting: Disimpan 5 byte berkat @Arnauld. Menyimpan 11 byte lebih lanjut berkat @YairRand.

Neil
sumber
Bisakah Anda menggunakan regexp bukan includes()? Seperti /[- !"'+*.:=AHIMO^_ovwx|T-Y]/.test(c).
Arnauld
@Arnauld Memang, rentang itu sangat membantu, terima kasih!
Neil
Anda dapat bermain golf [...s].reverse().map(...)ke: s::[].map().reverse()jika Anda setuju dengan menggunakan fitur ES-next baru. tautan
Downgoat
@Downgoat Apakah Anda memiliki tautan ke spesifikasi fitur itu?
Neil
1
@ Neil sini
Downgoat
5

Jelly , 69 62 byte

“(<[{qb/“ !"'+*-.:=AHIMOTUVWXY^_ovwx|“)>]}pd\”,Ṛ$F©f@ð®œs2¤yU⁼

Cobalah online!

Semua uji kasus

-7 byte terima kasih kepada @JonathanAllan

Bagaimana itu bekerja

“(<[{qb/“ !"'+*-.:=AHIMOTUVWXY^_ovwx|“)>]}pd\”,Ṛ$F©f@ð®œs2¤yU⁼  main link

“(<[{qb/“ !"'+*-.:=AHIMOTUVWXY^_ovwx|“)>]}pd\”  The literal list of strings  ['(<[{qb/', ' !"\'+*-.:=AHIMOTUVWXY^_ovwx|', ')>]}pd\\']
               $                 Last two links (if not part of an LCC) as a monad 
            Ṛ                    Reverse array Does not vectorize.
           ,                     Pair; return [x, y].
                 ©               Copy link result to register (® atom to retrieve). 
              F                  Flatten list.
                  f              Filter; remove the elements from x that are not in y.
                   @             Swaps operands. 

                    ð            Start a new dyadic chain
                         ¤       Nilad followed by links as a nilad. 
                      2          The literal integer 2
                   ®             Restore; retrieve the value of the register. Initially 0.
                    œs           Split x into y chunks of similar lengths.
                          y      Translate the elements of y according to the mapping in x.
                           U     Upend; reverse an array.
                            ⁼    Equals. Does not vectorize.
fireflame241
sumber
Simpan enam byte menggunakan filter: ¢FiЀ;1Ạðaµ¢yU⁼->¢Ff@ð¢yU⁼
Jonathan Allan
Simpan yang lain dengan menggunakan register (semuanya dalam satu baris sekarang):...}pd\”,Ṛ$Fœs©2Ff@ð®yU⁼
Jonathan Allan
(... walaupun pada panjang yang sama ...}pd\”,Ṛ$F©f@ð®œs2¤yU⁼bisa dibilang lebih baik)
Jonathan Allan
Ditemukan satu byte lagi, simpan hanya dengan menyandikan satu dari setiap pasang ordinals yang berdekatan dari set simetris (edit komentar yang dihapus dengan kode yang lebih baik)
Jonathan Allan
4

Python 3, 211 208 195 byte

lambda S,p="()<>[]{}qpbd\/",s=" !\"'+*-.:=AHIMOTUVWXY^_ovwx|":(S==S.translate({ord(s[2*x]):s[2*x+1]for s in(p,p[::-1])for x in range(7)})[::-1])*(~len(S)%2*s[len(S)//2]in s)*(not set(S)-set(p+s))

Disimpan 13 byte berkat Jonathan Allan.

L3viathan
sumber
1
Hemat 9 byte : 1. membalikkan urutan garis miring sehingga tidak perlu melarikan diri; 2. menggunakan 2*xdan range(7); 3. gunakan perkalian untuk menghindari >2tes; 4. gunakan bitwise bukan pada len(S)untuk menghindari notdari not len(S)%2; 5. menggunakan fakta bahwa ''in'blah'adalah Trueuntuk memungkinkan perkalian tali ~len(S)%2*s[len(S)//2]in s.
Jonathan Allan
1
Simpan 4 lebih banyak inlining semuanya
Jonathan Allan
2

SOGL V0.12 , 88 byte

"el²┘N!←8mYdDm⁵╔C⅛┌6▼ģη⁷fņ‘;W‽0←}C
l»{Kα}lalh=‽;KCø;{:↔³↔=?"qpbd”⁴²+:GW:2%«H+W}:h=?:CΚ}=

Coba Di Sini!

~ 24 byte untuk menambahkan qpbdmirroring dan 6 byte untuk (x-1 XOR 1) + 1: /

dzaima
sumber
2

Kotlin 1.1, 201 199 byte

{var R="(<[{qb/\\dp}]>)"
var m=HashMap<Any,Any>()
"\"!'+*-.:=AHIMOTUVWXY^_ovwx| ".map{m[it]=it}
R.indices.map{m[R[it]]=R[R.length-(it+1)]}
it.zip(it.reversed()).filter{m[it.first]!=it.second}.none()}

Yg diperindahkan

{
    var R = "(<[{qb/\\dp}]>)"
    var m = HashMap<Any, Any>()
    "\"!'+*-.:=AHIMOTUVWXY^_ovwx| ".map { m[it] = it }
    R.indices.map { m[R[it]] = R[R.length - (it + 1)] }
    it.zip(it.reversed()).filter { m[it.first] != it.second }.none()
}

Uji

var i:(String)->Boolean =
{var R="(<[{qb/\\dp}]>)"
var m=HashMap<Any,Any>()
"\"!'+*-.:=AHIMOTUVWXY^_ovwx| ".map{m[it]=it}
R.indices.map{m[R[it]]=R[R.length-(it+1)]}
it.zip(it.reversed()).filter{m[it.first]!=it.second}.none()}
fun main(args: Array<String>) {
    var GOOD = listOf("()()",
            "()()()",
            "[A + A]",
            "WOW ! WOW",
            "OH-AH_wx'xw_HA-HO",
            "(<<[[[T*T]]]>>)",
            "(:)",
            ")-(",
            "())(()",
            "qpqp")

    var BAD = listOf("())(",
            "((B))",
            "11",
            "+-*+-",
            "WOW ! wow",
            "(;)",
            "qppq")

    GOOD.filterNot { i(it) }.forEach { throw AssertionError(it) }
    BAD.filter { i(it) }.forEach { throw AssertionError(it) }
    println("Test Passed")
}

Tidak dapat berjalan di TIO karena 1.1 tidak didukung

jrtapsell
sumber
Anda dapat membuatnya berfungsi pada 1.0 dengan hanya mengimpor HashMap. Coba online!
CAD97
Apakah skor saya akan dengan atau tanpa impor?
jrtapsell
karena impor hanya shim untuk membuatnya berfungsi pada 1.0, di mana ia bekerja pada 1.1 apa adanya, asalkan jawabannya menentukan 1.1 Anda akan diberi skor tanpa impor. Saya akan memasukkan catatan, untuk berjaga-jaga jika seseorang tidak tahu HashMap (efektif) diimpor dalam 1.1 secara otomatis.
CAD97
2

Python 2 , 182 167 163 162 160 158 byte

lambda s:s[::-1]==s.translate(m(t+w,w+t),m("","").translate(None," !\"'+*-.:=AHIMOTUVWXY^_ovwx|"+t+w))
from string import*
m=maketrans
t=")>[{/qd"
w="(<]}\pb"

Cobalah online!

Disimpan 2 byte berkat Jonathan Allan

Penjelasan Pertama, kita perlu membuat daftar semua karakter yang tidak memiliki simetris (karakter itu sendiri:, A... atau karakter lain (untuk ), ...):

  • m("","") mengembalikan string dengan semua karakter yang tersedia.

  • m("","").translate(None," \t!\"'+*-.:=AHIMOTUVWXY^_ovwx|"+t+w)) menghapus dari semua karakter yang tersedia karakter yang memiliki simetris.

Kemudian, kami memetakan setiap char ke char simetris dan menghapus karakter yang tidak memiliki simetris s.translate(m(t+w,w+t),<chars that don't have a symmetric>)

Jika hasilnya sama dengan string terbalik, kami memiliki string simetris.

jferard
sumber
Jika Anda memindahkan garis miring dari ujung kanan tdan wAnda dapat melepaskannya, misalnya w="(<]{\pb". Simpan byte lain dengan from string import*;m=maketrans(saya pribadi mencari baris baru ketika ;tidak menyimpan byte meskipun). Anda juga tidak perlu menyebutkan nama fungsinya asalkan itu dapat digunakan kembali dan tidak bersifat rekursif, yang akan menyelamatkan 2.
Jonathan Allan
Anda juga tidak perlu menyebutkan nama fungsinya asalkan itu dapat digunakan kembali dan tidak rekursif, yang menyimpan 2 TIO lainnya (catatan: kode yang telah Anda daftarkan dan pada tautan Anda adalah 162 byte)
Jonathan Allan
@ Jonathan Allan, terima kasih. Saya sudah menghapus (secara mental) dua byte untuk f=, tetapi versi Anda lebih bersih.
jferard
1

Perl 5 , 102 + 1 (-p) = 103 byte

$_=!/[^ !"'+*.:=AHIMOT-Y^_ovwx|()<>[\]{}qpbd\/\\-]/&&$_ eq reverse y|()<>[]{}qpbd/\\|)(><][}{pqdb\\/|r

Cobalah online!

Xcali
sumber
1

Scala , 140 byte

s.zip(s.reverse).forall(c=>(" !\"'+*-.:=AHIMOTUVWXY^_ovwx|".flatMap(x=>x+""+x)+"()<>[]{}qpbd/\\\\/dbpq}{][><)(").indexOf(c._1+""+c._2)%2==0)

Cobalah online!

selada kubik
sumber