เยลลี่ , 14 12 ไบต์
J’ƲœṗZ⁻¦µU⁼
ลองออนไลน์!
พื้นหลัง
เราเริ่มต้นด้วยการดูดัชนี 0 ของสตริงอินพุต
H H e H H e l e H H e l l l e H H e l l o l l e H
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
ที่จะได้รับแถวของรูปสามเหลี่ยมที่เราสามารถแยกสตริงก่อนดัชนี1 , 1 + 3 = 4 , 1 + 3 + 5 = 9และ1 + 3 + 5 + 7 = 16 เนื่องจาก(n + 1) ² = n² + (2n + 1)ผลรวมเหล่านี้เป็นผลบวกกำลังสองที่สมบูรณ์แบบในรายการดัชนี หากเราแยกสตริงก่อนหน้า0นี่เป็นเรื่องง่ายเหมือนการแยกหน้าดัชนีทั้งหมด 0 ที่เป็นสี่เหลี่ยมที่สมบูรณ์แบบ
หลังจากแยกเราจะได้รับสตริงต่อไปนี้
""
"H"
"HeH"
"HeleH"
"HellleH"
"HellolleH"
ต่อไปเราจะแทนที่สตริงว่างที่จุดเริ่มต้นด้วยอักขระทั้งหมดในคอลัมน์แรก
"HHHHH"
"H"
"HeH"
"HeleH"
"HellleH"
"HellolleH"
ตอนนี้งานจะลดลงเป็นการตรวจสอบว่าการย้อนกลับสตริงทั้งหมดให้ผลเป็นอาร์เรย์สตริงเดียวกันหรือไม่
มันทำงานอย่างไร
ขั้นแรกJสร้างดัชนีที่อิง 1 ทั้งหมดของสตริงอินพุตJจากนั้นลดลงด้วย’เพื่อให้ได้ดัชนีที่อิง 0 ทั้งหมด Ʋทดสอบดัชนีที่ใช้ 0 ทั้งหมดเพื่อหาค่ากำลังสอง สำหรับตัวอย่างของเราจากด้านบนนี่ให้ผลแบบอาร์เรย์บูลีนต่อไปนี้
1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
ต่อไปเราจะเรียกœṗพาร์ทิชันสตริงการป้อนข้อมูลเช่น
H H e H H e l e H H e l l l e H H e l l o l l e H
ก่อนหน้าทั้งหมด1 (อันที่จริงทุกองค์ประกอบความจริง) ตัวอย่างของเรานี่ให้ผลเป็นอาร์เรย์สตริงต่อไปนี้
['',
'H',
'HeH',
'HeleH',
'HellleH',
'HellolleH'
]
Z⁻¦เป็นส่วนที่น่าสนใจที่สุดของคำตอบนี้ ลองวิเคราะห์สิ่งที่ตรงไปตรงมาZ1¦ก่อน
¦เป็นเบาบางอย่างรวดเร็ว ใช้สองลิงก์จากสแต็กโดยเฉพาะ1และZในกรณีนี้ อันดับแรกZจะนำไปใช้กับอาร์กิวเมนต์: อาร์เรย์ของสตริงจากก่อนหน้า Zคือzip atom และอ่านอาร์เรย์สตริง / อาร์เรย์อักขระ 2D ตามคอลัมน์โดยให้ผลลัพธ์
['HHHHH',
'eeee',
'Hlll',
'ell',
'Hlo',
'el',
'Hl',
'e',
'H'
]
สิ่งที่เคยเป็นทางด้านซ้ายของสายป้อนและคอลัมน์แรกของอาร์เรย์สตริงตอนนี้กลายเป็นคนแรกที่สตริง
ตอนนี้¦แอบที่และพบว่าดัชนีเดียว:1 1 ดังนั้นสตริงแรกในอาร์เรย์สตริงเดิมจะถูกแทนที่ด้วยสตริงแรกในค่าส่งคืนของ; สตริงที่ดัชนีอื่น ๆ ยังคงไม่ได้รับผลกระทบZ
['HHHHH',
'H',
'HeH',
'HeleH',
'HellleH',
'HellolleH'
]
ขอเรียกอาร์เรย์นี้
เราใช้Z⁻¦แทนZ1¦แต่สิ่งนี้ไม่สร้างความแตกต่าง: ⁻เปรียบเทียบอาร์เรย์สตริงกับสตริงอินพุตสำหรับความไม่เท่าเทียมกันโดยให้ผลลัพธ์1เนื่องจากมีค่าไม่เท่ากัน ความแตกต่างระหว่างทั้งสองก็คือว่าZ⁻¦เป็นเพราะ dyadic ⁻คือช่วยให้เราสามารถเขียนแทนœṗZ⁻¦ œṗ¹Z1¦นี่เป็นเพราะ dyad ( œṗ) ตามด้วย monad ( œṗ¹Z1¦) คือfork (monad ถูกนำไปใช้กับอาร์กิวเมนต์ของ chain / สตริงอินพุตและค่าที่ส่งคืนจะถูกส่งผ่านเป็นอาร์กิวเมนต์ที่ถูกต้องไปœṗ) ในขณะที่ dyad ตามด้วย dyad อื่น (หรือที่ส่วนท้ายของห่วงโซ่) คือตะขอคืออาร์กิวเมนต์ที่ถูกต้องคืออาร์กิวเมนต์ของห่วงโซ่
สิ่งที่เหลืออยู่ที่ต้องทำคือการตรวจสอบความรุนแรง µเริ่มต้นใหม่ (เอก) ห่วงโซ่ที่เป็นอาร์กิวเมนต์เป็น คว่ำอะตอมกลับสตริงทั้งหมดใน( แต่ไม่ตัวเอง) แล้วเปรียบเทียบผลที่ได้กับเพื่อความเท่าเทียมกัน บูลีนที่ส่งคืน1ระบุว่าเป็นสามเหลี่ยม Palindromic สายอื่น ๆ จะกลับ0U⁼