ฉันสมมาตรไม่ใช่ palindromic!


22

พื้นหลัง

แรงบันดาลใจจากฉันเป็นสีขาว คุณเป็น ที่ซึ่งมีการนำเสนอข้อเท็จจริงที่น่าตกใจว่า“ ()()ไม่ใช่ Palindrome แต่())(” ฉันถามตัวเองว่าอะไรคือ()()คำตอบคือ: มันเป็นสตริงที่มีแกนสมมาตรในแนวตั้ง!

งาน

เขียนโปรแกรมหรือฟังก์ชั่นที่รับสตริง S (หรือเทียบเท่าที่เหมาะสมในภาษาของคุณ) เป็นอินพุตตรวจสอบความสมมาตรตามแกนตั้งและส่งกลับค่าความจริงหรือค่าเท็จตามลำดับ คุณสามารถใช้วิธีการที่สมเหตุสมผลเพื่อรับอินพุตและจัดเตรียมเอาต์พุต

สมมาตรสะท้อนแสง

การสะท้อนสมมาตรรอบแกนตั้ง (หรือสมมาตรซ้ายขวา) หมายความว่าหากคุณวางกระจกในแนวตั้งตรงกึ่งกลางของสตริงภาพสะท้อนของครึ่งแรกของสตริงจะเหมือนกับครึ่งหลังของสตริง

ตัวอย่างเช่นสตริงต่อไปนี้เป็นสมมาตรการสะท้อนรอบแกนตั้ง:

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

ในขณะที่ต่อไปนี้ไม่:

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

กฎของการแข่งขัน

•โปรแกรมหรือฟังก์ชั่นของคุณจะได้รับเฉพาะอักขระ ASCII ที่พิมพ์ได้ คุณสามารถรวมหรือไม่ใช้สตริงว่าง (ซึ่งเป็นสมมาตรแน่นอน!) เป็นอินพุตทางกฎหมายซึ่งดีกว่าสำหรับคุณ

•อักขระ ASCII ที่ถือได้ว่าสมมาตรเทียบกับแกนแนวตั้งมีดังต่อไปนี้ (หมายเหตุช่องว่างเริ่มต้นและความแตกต่างระหว่างตัวอักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก):

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

อักขระ ASCII ที่ถือเป็น“ มิร์เรอร์” และอักขระที่เกี่ยวข้องคือ:

()<>[]{}qpbd/\

โปรดทราบว่าเนื่องจากพวกเขาจะสะท้อนคุณสามารถมีทั้งสอง()เช่นเดียวกับ)(, /\และ\/อื่น ๆ

อักขระ ASCII ที่พิมพ์ได้อื่นทั้งหมดต้องถูกพิจารณาแบบไม่สมมาตรและไม่มีอักขระที่สอดคล้องกันแบบมิรเรอร์

•นี่เป็นความท้าทายของ : ยิ่งโปรแกรมของคุณสั้นลงเท่าไหร่ก็ยิ่งดีขึ้นในภาษาโปรแกรมใด ๆ

•ความรุ่งโรจน์ต่อคนที่จะสร้างโปรแกรมสมมาตร!

หมายเหตุ : คำถามนี้ไม่ได้ซ้ำกับ"Convenient Palindrome"ซึ่งต้องการตรวจสอบสตริง palindromic ที่วงเล็บถูกพลิกคำถามนี้แตกต่างกันด้วยเหตุผลสองประการ:

1) เป็นข้อ จำกัด ของคำถามอื่น ๆ สำหรับสิ่งที่เกี่ยวข้องกับอักขระที่ไม่ใช่วงเล็บเนื่องจากอักขระที่สมมาตรสามารถปรากฏในลำดับย้อนกลับได้

2) เนื่องจากมันขึ้นอยู่กับแนวคิดของความสมมาตรและไม่ได้อยู่ในแนวคิดของ "palindrome สะดวกสบาย", อักขระที่มิเรอร์จึงสามารถปรากฏได้ทั้งในลำดับ[]และ][และทำให้โปรแกรมเพื่อแก้ปัญหาต่างจากโปรแกรมที่แก้ปัญหาอื่น ๆ .


6
สำหรับทุกคนที่สงสัย Charcoal ไม่ได้สะท้อนตัวอักษร :(
เต็มเปาโดยมนุษย์

4
ฉันไม่เห็นด้วยกับ dupeyness เนื่องจากเป้าหมายของ dupe นั้นไม่ได้สะท้อนตัวอักษรและสิ่งนี้จะเกิดขึ้น
สตีเฟ่น

ขออภัยฉันพลาดตัวอย่างความผิดพลาดของฉัน
jrtapsell

6
ทำไมไม่8ถือว่าเป็น "สมมาตร"
Scott Milner

2
@FunkyComputerMan มันไม่เหมือนกันกับเป้าหมายล่อเป้าเลย ก่อนอื่นสิ่งนี้ไม่มีข้อ จำกัด ของซอร์สโค้ด
Jonathan Allan

คำตอบ:


7

JavaScript (ES6), 130 125 113 ไบต์

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>

แก้ไข: บันทึก 5 ไบต์ขอบคุณ @Arnauld บันทึกเพิ่มเติมอีก 11 ไบต์ด้วย @YairRand


คุณสามารถใช้ regexp แทนได้includes()หรือไม่ /[- !"'+*.:=AHIMO^_ovwx|T-Y]/.test(c)เช่น
Arnauld

@Arnauld แน่นอนว่าช่วงนั้นมีประโยชน์มากขอบคุณ!
Neil

คุณสามารถตีกอล์ฟ[...s].reverse().map(...)ไปที่: s::[].map().reverse()หากคุณตกลงกับการใช้คุณสมบัติ ES-next ใหม่ ลิงก์
Downgoat

@Downgoat คุณมีลิงค์ไปยังข้อมูลจำเพาะของคุณสมบัตินั้นหรือไม่?
Neil


5

เจลลี่ , 69 62 ไบต์

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

ลองออนไลน์!

กรณีทดสอบทั้งหมด

-7 ไบต์ขอบคุณ @JonathanAllan

มันทำงานอย่างไร

“(<[{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.

บันทึกหกไบต์โดยใช้ตัวกรอง: ¢FiЀ;1Ạðaµ¢yU⁼->¢Ff@ð¢yU⁼
Jonathan Allan

บันทึกอื่นโดยใช้การลงทะเบียน (ทั้งหมดในหนึ่งบรรทัดตอนนี้):...}pd\”,Ṛ$Fœs©2Ff@ð®yU⁼
Jonathan Allan

(... ถึงแม้จะมีความยาวเท่ากัน...}pd\”,Ṛ$F©f@ð®œs2¤yU⁼ก็ถือว่าดีกว่า)
Jonathan Allan

พบอีกหนึ่งไบต์บันทึกโดยการเข้ารหัสเพียงหนึ่งคู่แต่ละคู่ของลำดับที่ติดกันจากชุดสมมาตร (แก้ไขความคิดเห็นที่ถูกลบด้วยรหัสที่ดีกว่า)
Jonathan Allan

4

Python 3, 211 208 195 ไบต์

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

บันทึกแล้ว 13 ไบต์ขอบคุณ Jonathan Allan


1
บันทึก 9 ไบต์ : 1. ลำดับการย้อนกลับของเครื่องหมายทับจึงไม่จำเป็นต้องหลบหนี 2. ใช้2*xและrange(7); 3. ใช้การคูณเพื่อหลีกเลี่ยงการ>2ทดสอบ 4. ใช้ bitwise ไม่ได้บนlen(S)เพื่อหลีกเลี่ยงการnotของnot len(S)%2; 5. ใช้ความจริงที่ว่า''in'blah'คือการอนุญาตให้คูณสตริงTrue ~len(S)%2*s[len(S)//2]in s
Jonathan Allan

1
ประหยัดทุกสิ่งที่อินไลน์อีก 4 รายการ
Jonathan Allan


2

Kotlin 1.1, 201 199 bytes

{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()}

เชิดชู

{
    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()
}

ทดสอบ

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

ไม่สามารถทำงานบน TIO ได้เนื่องจากไม่รองรับ 1.1


คุณสามารถทำให้มันใช้งานได้กับ 1.0 เพียงแค่นำเข้า HashMap ลองใช้ออนไลน์!
CAD97

คะแนนของฉันจะมีหรือไม่มีการนำเข้าหรือไม่
jrtapsell

เนื่องจากการนำเข้าเป็นเพียง shim เพื่อให้ทำงานบน 1.0 ซึ่งทำงานบน 1.1 ตามเดิมตราบใดที่คำตอบระบุ 1.1 คุณจะได้รับคะแนนโดยไม่มีการนำเข้า ฉันจะใส่บันทึกย่อไว้ในกรณีที่มีคนไม่ทราบว่า HashMap นั้นนำเข้ามาอย่างมีประสิทธิภาพใน 1.1 โดยอัตโนมัติ
CAD97

2

Python 2 , 182 167 163 162 160 158 ไบต์

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"

ลองออนไลน์!

บันทึก 2 ไบต์ขอบคุณ Jonathan Allan

คำอธิบาย ก่อนอื่นเราต้องสร้างรายการตัวอักษรทั้งหมดที่ไม่มีความสมมาตร (ตัวของมันเอง: A, ... หรือตัวอักษรอื่น(สำหรับ), ... ):

  • m("","") ส่งคืนสตริงที่มีตัวอักษรที่มีอยู่ทั้งหมด

  • m("","").translate(None," \t!\"'+*-.:=AHIMOTUVWXY^_ovwx|"+t+w)) ลบออกจากตัวอักษรที่มีอยู่ทั้งหมดตัวอักษรที่มีความสมมาตร

จากนั้นเราแมปถ่านทุกตัวกับถ่านแบบสมมาตรและลบตัวอักษรที่ไม่มีความสมมาตร s.translate(m(t+w,w+t),<chars that don't have a symmetric>)

หากผลลัพธ์เท่ากับสตริงที่ตรงกันข้ามเรามีสตริงสมมาตร


ถ้าคุณย้ายทับจากด้านขวาสุดของtและคุณสามารถนำหลบหนีเช่นw w="(<]{\pb"บันทึกไบต์อื่นด้วยfrom string import*;m=maketrans(โดยส่วนตัวแล้วฉันจะขึ้นบรรทัดใหม่เมื่อ;ไม่บันทึกไบต์) นอกจากนี้คุณไม่จำเป็นต้องตั้งชื่อฟังก์ชั่นตราบใดที่มันสามารถนำมาใช้ซ้ำและไม่ซ้ำซึ่งช่วยประหยัดอีก 2
โจนาธานอัลลัน

นอกจากนี้คุณไม่จำเป็นต้องตั้งชื่อฟังก์ชั่นตราบใดที่มันสามารถนำมาใช้ซ้ำและไม่เกิดซ้ำซึ่งจะบันทึกอีก 2 TIO (หมายเหตุ: รหัสที่คุณระบุไว้และที่ลิงค์ของคุณคือ 162 ไบต์)
Jonathan Allan

@ JonathanAllan ขอบคุณ ฉันลบไปแล้ว (ทางจิตใจ) สองไบต์สำหรับf=แต่เวอร์ชันของคุณสะอาดกว่า
jferard


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