มีความพยายามก่อนหน้านี้ สองสามครั้งที่จะถามคำถามนี้ แต่ก็ไม่สอดคล้องกับมาตรฐานที่ทันสมัยในเว็บไซต์นี้ ตามการอภิปรายเกี่ยวกับ Metaฉันจะทำการโพสต์ใหม่ในลักษณะที่อนุญาตให้มีการแข่งขันที่เป็นธรรมภายใต้กฎเกณฑ์ที่ทันสมัยของเรา
พื้นหลัง
palindromeคือสตริงว่า "อ่านไปข้างหน้าและข้างหลังเดียวกัน" คือการย้อนกลับของสตริงเป็นเช่นเดียวกับสตริงตัวเอง เราไม่ได้พูดถึงเรื่อง "palindromes ที่สะดวกสบาย" ที่นี่ แต่เป็นการกลับตัวอักขระทีละตัวอักษรอย่างเข้มงวด ตัวอย่างเช่น()()
ไม่ใช่ palindrome แต่())(
เป็น
งาน
เขียนโปรแกรมหรือฟังก์ชั่นที่รับสตริงS (หรือเทียบเท่าที่เหมาะสมในภาษาของคุณ) เป็นอินพุตและมีเอาต์พุตQหนึ่งรายการ(ของประเภทที่คุณเลือก) คุณสามารถใช้วิธีการที่สมเหตุสมผลเพื่อรับอินพุตและจัดเตรียมเอาต์พุต
- เมื่ออินพุตSเป็น palindrome เอาต์พุตQควรมีค่าA (นั่นคือค่าเดียวกันสำหรับ palindromic Sใด ๆ)
- เมื่ออินพุตSไม่ใช่ Palindrome เอาต์พุตQควรมีค่าB (ซึ่งเป็นค่าเดียวกันสำหรับS ที่ไม่ใช่ palindromic S )
- AและBจะต้องแตกต่างจากกัน
หรือกล่าวอีกนัยหนึ่งคือจับคู่ palindromes ทั้งหมดกับค่าหนึ่งและไม่ใช่ palindromes อื่น
นอกจากนี้โปรแกรมหรือฟังก์ชั่นที่คุณเขียนจะต้องเป็น Palindrome นั้นเอง (เช่นซอร์สโค้ดของมันจะต้องเป็น Palindromic) ซึ่งทำให้เกิดความท้าทายแบบ จำกัด แหล่งที่มา
ชี้แจง
- แม้ว่า
true
และfalse
เป็นตัวเลือกที่ชัดเจนสำหรับAและBคุณสามารถใช้สองค่าที่แตกต่างกันสำหรับผลลัพธ์ "is a palindrome" และ "ไม่ใช่ palindrome" ซึ่งไม่จำเป็นต้องเป็นบูลีน - เรากำลังนิยามการย้อนกลับของสตริงที่ระดับตัวละครที่นี่
éé
เป็น palindromic โดยไม่คำนึงว่าโปรแกรมนั้นเข้ารหัสใน UTF-8 หรือ Latin-1 แม้ว่าจะไม่ใช่ลำดับ palindromic ของ octets หลังจากการเข้ารหัส UTF-8 - อย่างไรก็ตามแม้ว่าโปรแกรมของคุณมีอักขระที่ไม่ใช่ ASCII แต่ก็จำเป็นต้องใช้งานกับอินพุต ASCII เท่านั้น โดยเฉพาะอินพุตSจะมีอักขระ ASCII ที่พิมพ์ได้ (รวมถึงช่องว่าง แต่ไม่รวมถึงบรรทัดใหม่) เหนือสิ่งอื่นใดซึ่งหมายความว่าหากคุณปฏิบัติต่ออินพุตเป็นลำดับไบต์แทนที่จะเป็นลำดับอักขระโปรแกรมของคุณจะยังคงปฏิบัติตามข้อกำหนด (เว้นแต่ว่าการเข้ารหัส I / O ภาษาของคุณจะแปลกมาก ) ดังนั้นคำจำกัดความของ palindrome ในสัญลักษณ์แสดงหัวข้อก่อนหน้ามีความสำคัญจริงๆเมื่อตรวจสอบว่าโปรแกรมมีรูปแบบที่ถูกต้อง
- การซ่อนโปรแกรมครึ่งหนึ่งในความคิดเห็นหรือสตริงตามตัวอักษรในขณะที่ไม่ได้สร้างสรรค์นั้นถือว่าถูกกฎหมาย คุณได้รับคะแนนตามความยาวไม่ใช่ความคิดสร้างสรรค์ดังนั้นอย่าลังเลที่จะใช้วิธี "น่าเบื่อ" เพื่อให้แน่ใจว่าโปรแกรมของคุณเป็น Palindrome แน่นอนเนื่องจากคุณได้รับคะแนนตามความยาวส่วนต่าง ๆ ของโปรแกรมที่ไม่ทำอะไรเลยจะแย่ลงคะแนนดังนั้นการใช้ทั้งสองส่วนของโปรแกรมจึงน่าจะมีประโยชน์หากคุณสามารถจัดการได้ .
- เนื่องจากเกณฑ์ชัยชนะถูกวัดเป็นไบต์คุณจะต้องระบุการเข้ารหัสที่โปรแกรมของคุณเขียนขึ้นเพื่อให้คะแนน (แม้ว่าในหลายกรณีจะเห็นได้ชัดว่าคุณกำลังใช้การเข้ารหัส)
เกณฑ์ชัยชนะ
แม้ว่าโปรแกรมจะต้องเป็นแบบ palindrome ที่ระดับตัวอักษรเราใช้ bytes เพื่อดูว่าใครชนะ ยิ่งโปรแกรมของคุณสั้นลงเท่านั้นหน่วยเป็นไบต์ก็ยิ่งดีเท่านั้น นี่คือความท้าทายของรหัส - กอล์ฟ เพื่อให้สามารถเปรียบเทียบได้ (โดยเฉพาะอย่างยิ่งการส่งในภาษาเดียวกัน) ให้นับจำนวนไบต์สำหรับโปรแกรมของคุณในส่วนหัวของการส่งของคุณ (รวมถึงจำนวนตัวอักษรหากแตกต่างจากจำนวนไบต์)
(
กับa
และกับ)
b
คือabab
palindrome? abba
ไม่มีก็จะต้องมีการ ถ้าอย่างนั้น()()
ก็ไม่ใช่ palindrome; ())(
มันจะต้องมีการ
()() is not a palindrome, but ())( is.
ขอแสดงความยินดีคุณได้ทำลงบน Reddit แล้ว!