เยลลี่ , 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
⁼