Funcitonไม่ใช่การแข่งขัน 29199 ไบต์
ฉันสนุกกับความท้าทายนี้เพราะมันเน้นถึงการขาดฟังก์ชั่นของห้องสมุดที่มีประโยชน์มาก ฉันจะรวมฟังก์ชั่นทั้งหมดเหล่านี้ไว้ที่นี่ (และในจำนวนไบต์) เพราะฉันเขียนพวกเขาหลังจากมีการโพสต์ความท้าทายนี้
แหล่งที่มาแบบเต็มในไฟล์เดียว
คำอธิบาย
เช่นเคยรับการเรนเดอร์ที่ดีขึ้นด้วยการดำเนินการjavascript:(function(){$('pre,code').css({lineHeight:5/4});})()
ในคอนโซลเบราว์เซอร์ของคุณ
① ɹ
⇄
ย้อนกลับ
ดังที่คุณทราบหรือไม่อาจรู้ว่า Funciton มาพร้อมกับไลบรารีที่เต็มไปด้วยฟังก์ชั่นสำหรับรายการซึ่งเป็นค่าที่เข้ารหัสในจำนวนเต็ม humongous เดียวเช่นเดียวกับห้องสมุดแยกต่างหากสำหรับการประเมินที่ขี้เกียจซึ่งใช้นิพจน์แลมบ์ดา เพื่อที่จะขี้เกียจ แน่นอนว่ายังมีห้องสมุดสำหรับฟังก์ชั่นการจัดการสตริง
สำหรับความท้าทายนี้ฉันต้องการฟังก์ชั่นเพื่อย้อนกลับสตริงและฟังก์ชั่นเพื่อย้อนกลับลำดับที่ขี้เกียจประเมิน น่าแปลกที่ฉันมีเพียงรายการเดียวเท่านั้น - รายการที่ฉันไม่ต้องการ ดังนั้นที่นี่มีฟังก์ชั่นย้อนกลับสำหรับลำดับที่ขี้เกียจ ( ɹ
) และสำหรับสตริง ( ⇄
):
╓───╖ ╔════╗ ┌────╖ ╓───╖
║ ɹ ║ ║ 21 ╟─┤ >> ╟──┐ ║ ⇄ ║
╙─┬─╜ ╚════╝ ╘═╤══╝ │ ╙─┬─╜ ┌──┐
┌─────┴─────┐ ┌─┴─╖ ├───────┴────────┤ │
┌─┴─╖ ┌───╖ │ │ ⇄ ║ │ ╔════╗ ┌───╖ │ │
┌─┤ ╟─┤ ɹ ╟─┐ │ ╘═╤═╝ │ ║ −1 ╟─┤ ≠ ╟─┴┐ │
│ └─┬─╜ ╘═══╝ │ │ ┌─┴─╖ ┌─┴─╖ ╚════╝ ╘═╤═╝ │ │
│ │ ┌───╖ │ │ │ ‼ ╟─┤ ? ╟──────────┤ │ │
│ └───┤ ʬ ╟─┘ │ ╘═╤═╝ ╘═╤═╝ ╔═══╗ ┌─┴─╖ │ │
│ ╘═╤═╝ │ ┌─┴─╖ ╔═══╗ ║ 0 ╟─┤ ≠ ╟──┘ │
│ ╔═══╗ ┌─┴─╖ │ ┌─┤ ʃ ╟─╢ 1 ║ ╚═╤═╝ ╘═══╝ │
└─╢ 0 ╟─┤ ? ╟───┘ │ ╘═╤═╝ ╚═══╝ │ │
╚═══╝ ╘═╤═╝ │ └────────────┘ │
│ └─────────────────────────────┘
คนขี้เกียจใช้ดังนี้ʬ
ซึ่งคือ“ ผนวกองค์ประกอบต่อท้ายลำดับขี้เกียจ” สตริงที่หนึ่งใช้ʃ
(สตริงย่อย) และ‼
(สตริงเชื่อมต่อ)
②ช่วงṖ
เวลา
แม้ว่าฉันสามารถแยกตัวประกอบเฉพาะด้วยการพยายามหารnด้วยปัจจัยทั้งหมดตามลำดับ แต่ฉันตัดสินใจว่าฉันต้องการฟังก์ชันไลบรารีที่สร้างหมายเลขเฉพาะ ฟังก์ชั่นต่อไปนี้จะใช้เวลาเป็นจำนวนเต็มnและดำเนินตะแกรงของ Eratosthenesเพื่อสร้างตัวเลขที่สำคัญทั้งหมดขึ้นอยู่กับn มันทำสิ่งนี้เป็นลำดับที่ขี้เกียจดังนั้นมันจะสร้างเฉพาะช่วงเวลาที่คุณประเมินเท่านั้น
╓───╖
║ Ṗ ║
╔═══╗ ╙─┬─╜
║ 0 ║ ┌─┴─╖
╚═╤═╝ │ ♭ ║
╔═══╗ ┌──┴─╖ ╘═╤═╝
║ 2 ╟─┤ Ṗp ╟───┘
╚═══╝ ╘══╤═╝
┌──────────────┐ │
│ ├─────────────────────────────────────────┐
│ ┌─┴─╖ │
│ ┌─┤ · ╟────────────────────────────┐ ╓┬───╖ │
│ │ ╘═╤═╝ ├───╫┘Ṗp ╟─┤
│ │ │ ╔═══╗ ┌────╖ ┌─┴─╖ ╙─┬──╜ │
│ │ │ ║ 1 ╟─┤ >> ╟─────┤ · ╟───┴─┐ │
│ │ │ ┌───╖ ╚═══╝ ╘══╤═╝ ╘═╤═╝ │ │
│ │ ┌─┴──┤ ♯ ╟─────┐ ┌──┴─╖ ┌───╖ │ │ │
│ │ │ ╘═══╝ ┌─┐ │ ┌──┤ Ṗp ╟─┤ ♭ ╟─┴─┐ │ │
│ │ │ ├─┘ └─┤ ╘══╤═╝ ╘═══╝ ┌─┘ │ │
│ │ │ ╔═╧═╕ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ │ │
│ │ └────────╢ ├─┤ · ╟─┤ ? ╟─────┤ · ╟─┐ │ │
│ │ ┌───╖ ╚═╤═╛ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ │ │ │
│ ┌─┴─┤ ♭ ╟─┐ ┌──┴─╖ │ ┌─┴─╖ │ │ │ │
│ │ ╘═══╝ └─┤ Ṗp ╟───┘ ┌─┤ ? ╟───────┘ │ │ │
│ ┌───╖ │ ╔════╗ ╘══╤═╝ │ ╘═╤═╝ │ │ │
┌─┴─┤ ÷ ╟──┘ ║ −1 ║ ┌──┴─╖ ╔═╧═╗ │ ┌┴┐ │ │
│ ╘═╤═╝ ╚══╤═╝ ┌─┤ >> ╟─┐ ║ 0 ║ └┬┘ │ │
│ ┌─┴─╖ ┌────╖ │ │ ╘════╝ │ ╚═══╝ │ │ │
│ │ × ╟─┤ << ╟─┘ ┌─┴─┐ ╔═╧═╗ │ │ │
│ ╘═╤═╝ ╘══╤═╝ ┌┴┐ ┌┴┐ ║ 1 ╟───────────────────┴─┐ │ │
└─────┘ ┌┴┐ └┬┘ └┬┘ ╚═══╝ ├─┘ │
└┬┘ │ └──────────────────────────────┘ │
┌─┴─╖ ┌─┴──╖ │
│ ÷ ╟─┤ << ╟─┐ │
╘═╤═╝ ╘════╝ ├──────────────────────────────────┘
┌┴┐ │
└┬┘ │
╔════╗ ┌─┴──╖ │
║ −1 ╟─┤ << ╟───────┘
╚════╝ ╘════╝
ฟังก์ชั่นตัวช่วยṖp
,, ใช้เวลา:
ตัวนับที่ทำงานอยู่ซึ่งจะลดระดับลงเรื่อย ๆ จนกว่าจะถึง 0
ตะแกรงซึ่งมีการตั้งค่าเล็กน้อยสำหรับแต่ละหมายเลขที่ทราบกันแล้วว่าไม่สำคัญ เริ่มแรกบิตที่มีนัยสำคัญน้อยที่สุดแสดงถึงหมายเลข 2 แต่เราเลื่อนสิทธิ์นี้ไปกับการวนซ้ำแต่ละครั้ง
หมายเลขnซึ่งระบุว่าหมายเลขใดถูกแทนด้วยบิตต่ำสุดของตะแกรง นี่จะเพิ่มขึ้นทุกการวนซ้ำ
ในแต่ละซ้ำถ้าบิตต่ำสุดของตะแกรงเป็น 0 เราพบนายกn จากนั้นเราใช้สูตรที่ฉันได้อธิบายไปแล้วในการเติมแถวคอลัมน์และเส้นทแยงมุมของตาราง NxNเพื่อกำหนดทุกบิตn -th ในตะแกรงก่อนที่จะย้ายไปทำซ้ำครั้งถัดไป
③ Ḟ
นายกตีนเป็ด
╓───╖
║ Ḟ ║
╙─┬─╜
┌───────┴──────┐
│ ┌───╖ ┌────╖ │
└─┤ Ṗ ╟─┤ Ḟp ╟─┘
╘═══╝ ╘═╤══╝
│
┌────────────────────────────────────────────┐
│ ╓┬───╖ │
┌───────┴─┐ ┌───────────────────────┐ ┌─╫┘Ḟp ╟─┘
│ ╔═══╗ ┌─┴─╖ ┌─┴─╖ ┌───┐ ┌────╖ ┌─┴─╖ │ ╙────╜
│ ║ 0 ╟─┤ ╟─┤ · ╟─┘┌┐ └─┤ Ḟp ╟──┐ ┌─┤ · ╟─┴──┐
│ ╚═══╝ └─┬─╜ ╘═╤═╝ └┤ ╘═╤══╝ ├─┘ ╘═╤═╝ │
│ ┌─┴─┐ ┌─┴─╖ ╔═╧═╕ ┌─┴─╖ ┌─┴─╖ ┌─┴──╖ ┌─┴─╖
│ │ └─┤ · ╟─╢ ├─┤ ? ╟─┤ · ╟─┤ ÷% ╟─┤ · ╟─┐
│ │ ╘═╤═╝ ╚═╤═╛ ╘═╤═╝ ╘═╤═╝ ╘═╤══╝ ╘═╤═╝ │
│ │ ┌──┴─╖ │ ┌─┴─╖ ┌─┴─╖ └──────┘ │
│ │ │ Ḟp ╟───┘ ┌─┤ ? ╟─┤ ≤ ║ │
│ ┌─┴─╖ ╘══╤═╝ │ ╘═╤═╝ ╘═╤═╝ │
└─────┤ · ╟─────┘ ╔═╧═╗ │ ╔═╧═╗ │
╘═╤═╝ ║ 0 ║ ║ 2 ║ │
│ ╚═══╝ ╚═══╝ │
└──────────────────────────────────────────┘
นี่ค่อนข้างตรงไปตรงมา เพียงย้ำผ่านช่วงเวลาที่ขึ้นไปnและดูว่าคนที่แบ่งn ถ้าเราแบ่งnให้จำไว้ว่าให้ดำเนินการกับนายกคนเดียวกันเพื่อให้เราคืนค่ามันหลายครั้งถ้ามันหารnหลาย ๆ ครั้ง นี่จะส่งคืนลำดับว่างสำหรับจำนวนใด ๆ ที่น้อยกว่า 2
④ ◇
◆
สร้างเพชร
ฟังก์ชั่นนี้สร้างเพชรเดี่ยวที่กำหนดตัวละครและรัศมี มันใช้ตัวละครเพื่อวางไว้ตรงกลางของเพชรเท่านั้น
┌───╖
┌─────────────────────┤ ♯ ╟───────────┬─────────┐
│ ┌───╖ ╔═══╗ ┌───┐ ╘═══╝ │ │
└─┤ ♫ ╟─╢ 0 ║ │ ┌─┴─╖ │ │
╘═╤═╝ ╚═══╝ │ │ ʭ ╟───┐ │ │
┌─┴─╖ ┌─────┘ ╘═╤═╝ │ │ │
│ ɱ ╟───┤ ┌───╖ ┌─┴─╖ ╔═══╗ ╓───╖ │ │
╘═╤═╝ └─┤ ɹ ╟─┤ ʓ ╟─╢ 1 ║ ┌─╢ ◇ ╟─┤ │
│ ╔═══╗ ╘═══╝ ╘═══╝ ╚═══╝ │ ╙───╜ │ │
│ ║ 0 ║ │ ┌─┴─╖ │
│ ╚═╤═╝ │ │ ♭ ║ │
╔═╧═╕ │ ╔════╗ │ ╘═╤═╝ │
┌───╢ ├─┘ ┌─╢ 21 ║ ┌─┴─╖ ┌─┴─╖ ┌─┴─┐
│ ╚═╤═╛ │ ╚════╝ ┌────────┤ · ╟───┤ · ╟─┐ ┌─┴─╖ │
│ ┌─┴─╖ ┌─┴──╖ ┌───┘ ╘═╤═╝ ╘═╤═╝ ├─┤ = ║ │
│ ┌─┤ ‼ ╟─┤ >> ║ │ │ ┌─┴─╖ │ ╘═╤═╝ │
│ │ ╘═══╝ ╘═╤══╝ │ │ ┌─┤ ? ╟─┘ │ │
│ │ ┌───╖ │ ┌──┘ │ │ ╘═╤═╝ │ │
│ └─┬─┤ ⇄ ╟─┘ │ ┌─────┐ │ │ ┌─┴─╖ │ │
│ │ ╘═══╝ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ └─┤ · ╟──┬──┘ │
│ └───────┤ · ╟─┤ ? ╟─┤ · ╟─┤ ‼ ║ ╘═╤═╝ │ │
│ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ ┌─┴─╖ │ │
│ └─────┘ └─┬───┘ ┌───┤ … ║ │ │
│ ┌─────┐ │ │ ╘═╤═╝ │ │
│ ╔══╧═╗ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ╔═╧══╗ │ │
│ ║ 32 ║ │ … ╟─┤ ‼ ╟─┤ ‼ ║ ║ 32 ║ │ │
│ ╚════╝ ╘═╤═╝ ╘═══╝ ╘═╤═╝ ╚════╝ │ │
│ ┌─┴─╖ ╔═╧══╗ │ │
│ ┌───┤ − ╟───┬─┐ ║ 46 ║ │ │
│ ┌─┴─╖ ╘═══╝ │ │ ╚════╝ │ │
└─────────────┤ · ╟─────────┘ └──────────────┘ │
╘═╤═╝ │
└───────────────────────────────────┘
สิ่งนี้ทำให้การใช้งานลำดับวนขี้เกียจอย่างหนัก นี่คือวิธีการทำงาน:
สร้างลำดับของจำนวนเต็มตั้งแต่ 0 ถึงr (รวมแล้ว)
สำหรับแต่ละจำนวนเต็มαนั้นให้สร้างสตริงที่ประกอบด้วยช่องว่าง( r - α ) ( …
) ตามด้วยจุดตามด้วยช่องว่างα - ยกเว้นα = rซึ่งในกรณีนี้จะสร้างช่องว่างที่น้อยลงและผนวกตัวอักษร ตอนนี้เรามีส่วนบนซ้ายของเพชร
ในแต่ละสตริงเหล่านี้ให้ผนวกสำเนาอีกชุดของสตริงเดียวกัน แต่ด้วยอักขระที่ตรงกันข้าม ( ⇄
) และจากนั้นอักขระตัวแรกจะถูกลบออก ( >> 21
) ตอนนี้เรามีครึ่งบนของเพชร
ใช้ลำดับนี้และผนวกเข้ากับลำดับเดียวกัน แต่กลับด้าน ( ɹ
) และลบองค์ประกอบแรก ( ʓ
) ตอนนี้เรามีเพชรทั้งหมด
ตอนนี้เรามีสายที่ทำขึ้นเพชร แต่เราต้องการข้อมูลเพิ่มเติมเล็กน้อย เราจำเป็นต้องรู้ว่าจุดศูนย์กลางแนวตั้งของเพชรอยู่ตรงไหน เริ่มแรกนี้แน่นอนrแต่เมื่อเราต่อท้ายเพชรอื่น ๆ ไปที่ด้านบนและด้านล่างของนี้เราจะต้องติดตามตำแหน่งของ "กลาง" เพชรเพื่อให้เราสามารถจัดเรียงแนวตั้งของเพชรอื่นได้อย่างถูกต้อง . เช่นเดียวกันสำหรับขอบเขตแนวนอนของเพชร (ต้องการเมื่อผนวกเพชรกับด้านบนและด้านล่าง) ฉันตัดสินใจติดตามจดหมายด้วย ฉันต้องการสิ่งนั้นเพราะมิฉะนั้นฟังก์ชั่น⬗
(ที่เราไปถึงในส่วนถัดไป) จะต้องมีสี่พารามิเตอร์ แต่ Funciton อนุญาตเพียงสามเท่านั้น
┌─────────────────┐
│ ╓───╖ │
├──╢ ◆ ╟──┐ │
│ ╙───╜ │ │
│ ┌─────┴───┐ │
┌─┴─╖ │ ┌───╖ ┌─┴─╖ │
┌─┤ · ╟─┴─┤ › ╟─┤ › ║ │
│ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ │
│ ┌─┴─╖ │ ┌─┴─╖ │
│ │ ◇ ╟─────────┤ › ╟─┘
│ ╘═╤═╝ ╘═══╝
└───┘
เราใช้ list API ( ›
เพิ่มองค์ประกอบที่ด้านหน้าของรายการ) เพื่อสร้างโครงสร้างที่มี [ x , y , c , q ], โดยที่xคือพิกัด x ของพิกัดแนวนอนตรงกลางของเพชร, yคือ y- พิกัดของ baseline, cคือตัวอักษรและqคือลำดับของสตริงที่ขี้เกียจ โครงสร้างนี้จะถูกใช้เพื่อบรรจุสเตจกลางทั้งหมดนับจากนี้เป็นต้นไป
⑤ ⬗
เพชรผนวกแนวตั้ง
ฟังก์ชันนี้ใช้สแต็กเพชรที่มีอยู่รัศมีและบูลีนที่ระบุว่าจะเพิ่มเพชรใหม่ไปยังด้านบน (จริง) หรือด้านล่าง (เท็จ)
┌─────────────────────────────────────────────────┐
┌─┴─╖ ┌───────────────────────────┐ ┌───╖ ┌─┴─╖
┌───┤ · ╟─────────┘ ╔═══╗ ┌───────────────┐ ├─┤ ‹ ╟─┤ ‹ ║
│ ╘═╤═╝ ║ 1 ║ │ ╓───╖ │ │ ╘═╤═╝ ╘═╤═╝
│ │ ╚═╤═╝ └─╢ ⬗ ╟─┐ │ ┌─┴─╖ │ ┌─┴─╖
│ │ ┌───╖ ┌───╖ ┌─┴──╖ ╙─┬─╜ │ └─┤ · ╟─┘ ┌─┤ ‹ ╟─┐
│ ┌─┴─┤ + ╟─┤ ♯ ╟─┤ << ║ │ │ ╘═╤═╝ │ ╘═══╝ │
│ │ ╘═╤═╝ ╘═══╝ ╘═╤══╝ │ ┌─┴─╖ │ │ │
│ │ ┌─┴─╖ └───────┴─┤ · ╟───┐ ┌─┴─╖ │ │
│ └───┤ ? ╟─┐ ╘═╤═╝ ┌─┴───┤ · ╟─┐ │ │
│ ╘═╤═╝ ├───────────────────┘ │ ╘═╤═╝ │ │ │
│ ┌───╖ ┌─┴─╖ │ ┌─────┐ │ ┌───╖ │ │ │ │
└─┤ › ╟─┤ › ║ │ ┌───╖ ┌─┴─╖ │ └─┤ − ╟─┘ │ │ │
╘═╤═╝ ╘═╤═╝ │ ┌─┤ ‼ ╟─┤ ‼ ║ │ ╘═╤═╝ │ │ │
│ ┌─┴─╖ │ │ ╘═╤═╝ ╘═╤═╝ ┌─┴─╖ ┌─┴─╖ │ │ │
┌───┤ · ╟─┘ │ ┌─┴─╖ ├───┤ · ╟─┤ … ║ │ │ │
┌───┐ │ ╘═╤═╝ └─┤ · ╟───┘ ╘═╤═╝ ╘═╤═╝ │ │ │
│ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ╘═╤═╝ │ ╔══╧═╗ │ │ │
│ │ ʭ ╟─┤ ? ╟─┤ › ╟─┐ ╔═══╗ ╔═╧═╕ │ ║ 32 ║ │ │ │
│ ╘═╤═╝ ╘═╤═╝ ╘═══╝ │ ║ 0 ╟─╢ ├─────────┘ ╚════╝ │ │ │
│ ┌─┘ ┌─┴─╖ │ ╚═══╝ ╚═╤═╛ │ │ │
│ └─┬───┤ ʭ ╟─┐ ┌─┴─╖ ┌─┴─╖ │ │ │
│ ┌─┴─╖ ╘═══╝ ├───┤ · ╟─────┤ ɱ ║ │ │ │
└─┤ · ╟───────┘ ╘═╤═╝ ╘═╤═╝ │ │ │
╘═╤═╝ │ ┌─┴─╖ │ │ │
│ └─────┬─┤ ◇ ╟───────────────────────┘ │ │
│ │ ╘═══╝ ┌─┴─╖ │
│ └─────────────────────────────┤ · ╟─────┘
│ ╘═╤═╝
└─────────────────────────────────────────────────────┘
สิ่งนี้ค่อนข้างตรงไปตรงมาเช่นกัน ใช้‹
สำหรับแกะโครงสร้าง ใช้◇
เพื่อสร้างเพชรใหม่ ใช้ɱ
(map) เพื่อเพิ่มช่องว่างไปยังจุดเริ่มต้นและจุดสิ้นสุดของแต่ละสตริงในเพชรใหม่เพื่อให้มันมีความกว้างเท่ากัน ผนวก ( ʭ
) สตริงใหม่ลงบนเก่า (ถ้าด้านล่าง) หรือเก่าไปยังใหม่ (ถ้าด้านบน); และสุดท้ายใช้›
สร้างโครงสร้างที่มีค่าใหม่ทั้งหมด โดยเฉพาะอย่างยิ่งถ้าเราต่อท้ายที่ด้านล่างyจะไม่เปลี่ยนแปลง แต่ถ้าเราต่อท้ายไปด้านบนyจะต้องเพิ่มขึ้น♯(r << 1)
( rคือรัศมีของเพชรใหม่)
⑥ ❖
เชื่อมต่อสแต็คในแนวนอน
นี่คือฟังก์ชั่นที่ใหญ่ที่สุดของพวกเขาทั้งหมด ฉันจะไม่ปฏิเสธว่ามันเป็นเรื่องตลกที่จะได้รับสิทธินี้ มันใช้เวลาสองกองซ้อนกันและเรียงต่อกันในแนวนอนในขณะที่เคารพแนวตั้งที่ถูกต้อง
┌──────────────────────────────────┬───────────────────────┐
│ ┌──────────────────┐ ┌─┴─╖ ┌─┴─╖
│ │ ┌───────────┐ └───────┤ · ╟───┬───────────────┤ · ╟─────────────┐
│ │ ┌─┴─╖ │ ╘═╤═╝ │ ╘═╤═╝ │
│ │ │ ‹ ╟───┐ │ ┌─┴─╖ ┌─┴─╖ │ │
│ │ ╘═╤═╝ ┌─┴─╖ └─────────┤ · ╟─┤ · ╟─────────┐ │ │
│ │ ├─┐ │ ‹ ╟───┐ ╘═╤═╝ ╘═╤═╝ │ │ │
│ │ └─┘ ╘═╤═╝ ┌─┴─╖ ╓───╖ ┌─┴─╖ │ │ │ │
│ │ │ │ ‹ ╟─╢ ❖ ╟─┤ ‹ ║ │ │ │ │
│ │ │ ╘═╤═╝ ╙───╜ ╘═╤═╝ ┌─┴─╖ ┌─┐ │ │ │
│ │ │ │ └───┤ ‹ ║ └─┤ │ │ │
│ │ │ │ ╘═╤═╝ ┌─┴─╖ │ │ │
│ │ │ │ └───┤ ‹ ║ │ │ │
│ │ │ └─────────────────┐ ╘═╤═╝ │ │ │
│ │ │ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ │
│ │ │ ┌──────────────┤ · ╟─┤ · ╟─┤ · ╟─┤ · ╟──────┐ │
│ │ └──────┤ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ │ │
│ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ │ │ │ │ │
│ ┌─┤ · ╟─────────────┤ · ╟────────────┤ · ╟───┘ │ │ │ │
│ │ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ │ │ │ │
│ │ │ │ ┌────╖ │ ┌─┴─╖ │ │ │
╔═══╗ ┌────╖ │ │ │ │ ┌─┤ << ╟─┴─────────┤ · ╟─┐ │ │ │
║ 1 ╟─┤ << ╟────────┘ │ │ │ │ ╘═╤══╝ ╘═╤═╝ │ │ │ │
╚═══╝ ╘═╤══╝ ╔════╗ │ │ ┌─┴─╖ │ ┌─┴─╖ │ │ │ ┌──┴──┐ │
┌─┴─╖ ║ 32 ╟─┐ │ │ ┌─────────────┤ · ╟───┐ │ │ ♯ ║ │ │ │ ┌─┴─╖ ┌─┴─╖ │
│ ♯ ║ ╚════╝ │ │ └─┤ ┌───╖ ╘═╤═╝ │ │ ╘═╤═╝ ┌───╖ ╔════╗ │ │ │ ┌─┤ ? ╟─┤ < ║ │
╘═╤═╝ ┌───╖ │ │ └─┤ − ╟─────────┴─┐ │ │ └───┤ … ╟─╢ 32 ║ │ │ │ │ ╘═╤═╝ ╘═╤═╝ │
└─────┤ … ╟─┘ │ ╘═╤═╝ ┌─┴─╖ │ └───┐ ╘═╤═╝ ╚════╝ │ │ │ │ ┌─┴─╖ ├───┘
╘═╤═╝ │ ┌───╖ ┌─┴─╖ ┌───────┤ · ╟─┴─┐ ╔═╧═╗ ┌─┴─╖ ┌──────┘ │ │ └─┤ · ╟───┘
│ ┌─┴─┤ ʭ ╟─┤ ȶ ║ │ ┌───╖ ╘═╤═╝ │ ║ 1 ║ │ ⁞ ║ │ ┌────────┘ │ ╘═╤═╝
┌─┴─╖ │ ╘═╤═╝ ╘═╤═╝ └─┤ > ╟───┴─┐ │ ╚═══╝ ╘═╤═╝ │ │ ┌──────┘ └────┐
│ ⁞ ║ │ ┌─┴─╖ ┌─┴─╖ ╘═╤═╝ │ ┌─┴─╖ ┌───╖ │ │ │ ┌─┴─╖ ┌───╖ ┌───╖ ┌─┴─╖
╘═╤═╝ └───┤ ? ╟─┤ · ╟─────┴─┐ │ │ − ╟─┤ ȶ ╟─┴─┐ │ │ │ + ╟─┤ ♯ ╟─┤ › ╟─┤ › ║
┌─┴─╖ ╘═╤═╝ ╘═╤═╝ │ │ ╘═╤═╝ ╘═╤═╝ │ │ │ ╘═╤═╝ ╘═══╝ ╘═╤═╝ ╘═╤═╝
┌────────────────────┤ · ╟───────┴───┐ └─┐ ┌─┴─╖ └───┘ ┌─┴─╖ │ │ └───┘ │ │
│ ╘═╤═╝ ┌─┴─╖ │ ┌─┤ · ╟───────────┤ · ╟───┘ │ │
│ ┌────────────────┐ │ ┌───────┤ · ╟─┘ │ ╘═╤═╝ ╘═╤═╝ │ │
│ │ ╔════╗ ┌───╖ ┌─┴─╖ └───┤ ┌───╖ ╘═╤═╝ │ │ │ ┌─┴───┐ │
│ │ ║ 32 ╟─┤ ‼ ╟─┤ · ╟───┐ └─┤ ʭ ╟───┘ │ │ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ │
│ │ ╚════╝ ╘═╤═╝ ╘═╤═╝ │ ╘═╤═╝ ┌─────┘ │ │ ʭ ╟─┤ · ╟─┤ ? ╟─┐ │
│ │ ┌─┴─╖ ╔═╧═╕ ╔═╧═╕ ┌─┴─╖ ┌─┴─╖ │ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ │ │
│ │ │ ‼ ╟─╢ ├─╢ ├─┤ ʑ ╟───┤ ʭ ║ ┌─┴─╖ └─────┘ │ │ │
│ │ ╘═╤═╝ ╚═╤═╛ ╚═╤═╛ ╘═╤═╝ ╘═╤═╝ ┌───┤ · ╟─────────────────────────┘ │ │
│ └──────────┘ │ ╔═╧═╗ │ ├───┘ ╘═╤═╝ │ │
│ └───╢ 0 ║ ┌─┴─╖ ┌─┴─╖ └───────────────────────────────┘ ┌─┴─╖ ╔═══╗
│ ╚═══╝ │ ȶ ╟───┤ · ╟─────────────────────────────────────────────────────┤ › ╟─╢ 0 ║
│ ╘═╤═╝ ╘═╤═╝ ╘═══╝ ╚═══╝
│ ┌─┴─╖ ┌─┴─╖
│ ┌─────┤ ? ╟─┐ │ ɕ ║
│ ┌─┴─╖ ╘═╤═╝ │ ╘═╤═╝
│ ┌───╖ ┌─┤ < ╟───┬─┘ │ │
└────────────┤ ɕ ╟─┤ ╘═══╝ ┌─┴─╖ │ │
╘═══╝ └───────┤ · ╟───┘ │
╘═╤═╝ │
└─────────┘
นี่คือวิธีการทำงาน
ขั้นแรกสำหรับแต่ละสแต็กสร้างลำดับที่ไม่สิ้นสุด ( ⁞
) ของสตริงแต่ละอันมีช่องว่าง ( …
) ตามความกว้างของสแต็กนั้น
Yค่าของกองบอกเราว่าหนึ่งในความต้องการที่จะ“ย้ายลง” และเท่าใด เพิ่มลำดับพื้นที่ที่เหมาะสมให้ถูกตัดทอน ( ȶ
) เป็นความยาวที่เหมาะสม ( y1 - y2หรือy2 - y1ตามความเหมาะสม)
ตอนนี้กำหนดความยาวของลำดับสตริง ( ɕ
) ซึ่งบอกความสูงของเรา ค้นหาว่าอันไหนที่สูงกว่า
ผนวกลำดับพื้นที่ไม่มีที่สิ้นสุดกับทั้งสองกอง
ใช้ zip ( ʑ
) เพื่อรวมเข้าด้วยกัน สำหรับสตริงแต่ละคู่ให้เชื่อมต่อ ( ‼
) พร้อมกับช่องว่างพิเศษระหว่างกัน
จากนั้นใช้ȶ
ตัดทอนผลลัพธ์ของความสูงนั้นให้สูงที่สุด ด้วยการทำสิ่งนี้สายเราไม่จำเป็นต้องสนใจว่าหนึ่งในนั้นต้องการช่องว่างภายใน
ในที่สุดสร้างโครงสร้างอีกครั้ง ณ จุดนี้เราไม่ต้องการตัวละครในเพชรอีกต่อไปดังนั้นเราจึงตั้งค่าเป็น 0 ค่าxจะถูกรวมและเพิ่มขึ้น (เพื่อให้สามารถคำนวณความกว้างของสแต็กได้♯(x << 1)
) Yค่าถูกกำหนดให้เป็นหนึ่งในที่สูงขึ้นของทั้งสอง
⑦วน↯
ซ้ำอักขระในสตริง
นี่เป็นอีกฟังก์ชั่นที่มีประโยชน์ที่ฉันจะเพิ่มเข้าไปในห้องสมุด รับสายมันทำให้คุณมีลำดับขี้เกียจที่มีรหัสตัวละครแต่ละตัว
╓───╖
║ ↯ ║
╙─┬─╜
┌──────────────┴────────────────┐
│ ┌─┐ ╔═══╗ ┌───╖ │
│ └─┤ ┌────╢ 0 ╟─┤ ≠ ╟─┴─┐
┌──────┴─┐ ┌┐ ╔═╧═╕ ┌─┴─╖ ╚═══╝ ╘═╤═╝ │
│ ├─┤├─╢ ├─┤ ? ╟──────────┤ │
│ │ └┘ ╚═╤═╛ ╘═╤═╝ ╔════╗ ┌─┴─╖ │
│ ╔══════╧══╗ ┌─┴─╖ │ ║ −1 ╟─┤ ≠ ╟───┘
│ ║ 2097151 ║ │ ↯ ║ ╚════╝ ╘═══╝
│ ╚═════════╝ ╘═╤═╝
│ ┌─┴──╖ ╔════╗
└─────────────┤ >> ╟─╢ 21 ║
╘════╝ ╚════╝
and
ไอเอ็นจีสตริงกับ 2097151 ส่งกลับตัวอักษรตัวแรก >>
ing โดย 21 ลบออก เราตรวจสอบเหตุผลทั้ง 0 และ −1 ตามที่อธิบายไว้ในหน้า esolangs ; สิ่งนี้ไม่เกี่ยวข้องกับความท้าทายนี้ แต่ฉันต้องการให้ฟังก์ชันไลบรารีถูกต้อง
⑧ ⬖
แปลงตัวอักษรเป็นสแต็กเพชร
ฟังก์ชันนี้ใช้อักขระตัวเดียวและส่งกลับโครงสร้างสำหรับสแต็กแนวตั้งที่แสดงถึงอักขระหนึ่งตัว
╔════╗
║ 96 ║ ╓───╖
╚══╤═╝ ║ ⬖ ║
┌───╖ ┌───╖ ┌─┴─╖ ╙─┬─╜
┌───┤ ɗ ╟─┤ Ḟ ╟─┤ − ║ │
│ ╘═╤═╝ ╘═══╝ ╘═╤═╝ │
│ ┌─┴─╖ ├──────┘ ┌──┐
│ │ ɹ ║ │ ┌───┤ │
│ ╘═╤═╝ ┌─────┘ │ │ │
╔═╧═╗ ┌─┴─╖ ┌─┴─╖ │ ┌┴┐ │
║ 1 ╟─┤ ╟─┤ · ╟─────┐ ╔═╧═╕└┬┘ │
╚═══╝ └─┬─╜ ╘═╤═╝ ┌─┴─╢ ├─┘ ┌┴┐
┌───────────┐ │ └─┐ │ ╚═╤═╛ └┬┘
┌─┴─╖ │ │ ┌───╖ │ └─┐ ╔═╧═╕ ┌──┴─╖ ╔═══╗
┌─────┤ · ╟───┐ │ └─┤ ◆ ╟─┘ ┌─┴─╢ ├─┤ << ╟─╢ 1 ║
┌──┴─┐ ╘═╤═╝ │ │ ╘═╤═╝ │ ╚═╤═╛ ╘════╝ ╚═╤═╝
│ ┌──┴─╖ ┌─┴─╖ ╔═╧═╕ ╔═╧═╕ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖
│ │ >> ╟─┤ ⬗ ╟─╢ ├─╢ ├─┤ ʩ ╟───┤ · ╟─┤ ʑ ╟────────┤ ⸗ ║
│ ╘══╤═╝ ╘═╤═╝ ╚═╤═╛ ╚═╤═╛ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝
│ ╔═╧═╗ ┌┴┐ │ ╔═╧═╗ │ └─────┘ ╔═╧═╗
│ ║ 1 ╟─┐└┬┘ └───╢ 0 ║ ║ 0 ║
│ ╚═══╝ ├─┘ ╚═══╝ ╚═══╝
└────────┘
ฟังก์ชั่นนี้น่าสนใจเพราะเราต้องการให้เพชรถูกต่อท้ายสลับกับด้านล่างและด้านบน นี่คือวิธีที่ฉันทำ:
ก่อนอื่นลบ 96 ( 'a'
กลายเป็น 1) รับปัจจัยสำคัญ ( Ḟ
ด้านบน) ใช้ɗ
เพื่อเพิ่มองค์ประกอบ 1 หากลำดับว่างเปล่าแล้วย้อนกลับ ( ɹ
) คำสั่ง
ถอดองค์ประกอบแรกออกและโทร◆
เพื่อเริ่มการทำงานของสแต็ก
ตอนนี้ใช้⸗
เพื่อสร้างลำดับขี้เกียจที่เพียงแค่สลับตัวเลข 0 และ 1 ไปเรื่อย ๆ
ใช้ʑ
(zip) กับสิ่งนั้นและปัจจัยหลักที่เหลืออยู่ สำหรับแต่ละปัจจัยหลักให้เลื่อนไปทางซ้าย 1 และor
0/1 ลงบน ตอนนี้เรามีลำดับที่เข้ารหัสหมายเลขเฉพาะและข้อมูลด้านบน / ล่าง
สุดท้ายใช้ʩ
(พับซ้าย / รวม) ค่าเริ่มต้นคือสแต็กที่เราสร้างขึ้นจากองค์ประกอบแรกข้างต้น สำหรับแต่ละค่าνการโทร⬗
(ต่อท้ายเพชรใหม่) พร้อมกับสแต็กก่อนหน้าไพรม์ ( ν >> 1
) และไม่ว่าจะเป็นด้านบนหรือล่าง ( ν & 1
)
⑨โปรแกรมหลัก
ที่นี่เราทำงานหลัก
┌─────┐
│ ┌─┴─╖
│ │ ⬖ ║
╔═══╗ ╔═╧═╕ ╘═╤═╝
║ 0 ╟─╢ ├───┘
╚═╤═╝ ╚═╤═╛ ┌───╖ ┌───╖ ╔═══╗
└─┐ └───┤ ɱ ╟─┤ ↯ ╟─╢ ║
┌─────────┐ └─────┐ ╘═╤═╝ ╘═══╝ ╚═══╝
│ ┌─┴─╖ │ ┌─┴─╖
│ ┌───┤ · ╟───┐ └─┤ ╟─┐
│ │ ╘═╤═╝ │ └─┬─╜ │
│ ┌─┴─╖ ╔═╧═╕ ╔═╧═╕ ┌─┴─╖ │
│ │ ❖ ╟─╢ ├─╢ ├─┤ ʩ ╟─┘
│ ╘═╤═╝ ╚═╤═╛ ╚═╤═╛ ╘═╤═╝
└───┘ ╔═╧═╗ │ ┌─┴─╖ ┌─┐
║ 0 ╟───┘ ┌─┤ ‹ ╟─┴─┘
╚═══╝ │ ╘═══╝
┌─┴─╖ ┌─┐
┌─┤ ‹ ╟─┴─┘
│ ╘═══╝
╔════╗ ┌───╖ ┌─┴─╖ ┌─┐
║ 10 ╟─┤ ʝ ╟─┤ ‹ ╟─┴─┘
╚════╝ ╘═╤═╝ ╘═══╝
│
ครั้งแรก map ( ɱ
) มากกว่าตัวละครในสายป้อน (คน↯
) ⬖
และเปิดในแต่ละกองเพชรใช้ ถอดองค์ประกอบแรกออกแล้วพับ ( ʩ
) ส่วนที่เหลือเพื่อต่อส่วนทั้งหมด ( ❖
) สุดท้ายให้แกะโครงสร้างที่ใช้‹
เพื่อไปยังลำดับของสตริงและรวมทั้งหมด ( ʝ
) โดยใช้ 10 (ขึ้นบรรทัดใหม่) เป็นตัวคั่น
ตัวอย่างผลลัพธ์
การป้อนข้อมูล:
crusaders
ผลลัพธ์ (ใช้เวลาในการคำนวณ 9 วินาทีไม่สามารถโพสต์ที่นี่ได้เนื่องจากขนาด จำกัด )