Intro
พิจารณากริดของตัวละครf A\/
เช่น
f f f
A
A / \
\ / A
A \/
/
\/
ที่อยู่:
f
หมายถึงก๊อกน้ำที่เทน้ำไหลลงA
แยกสายน้ำด้านบนออกเป็นสองส่วนครึ่งทางซ้ายและครึ่งทางที่ถูกต้อง\
เลื่อนกระแสน้ำเหนือขึ้นไปทางขวาทีละหนึ่งหน่วย/
เลื่อนกระแสน้ำข้างบนไปทางซ้ายทีละหนึ่งหน่วย- การรวมกัน
\/
จะสร้างรางน้ำที่มีความจุไม่สิ้นสุดที่รวบรวมกระแสน้ำข้างบน [space]
เป็นพื้นที่ว่างเปล่ากว่าน้ำที่สามารถเคลื่อนที่ผ่านได้
จากนี้เราสามารถจินตนาการเส้นทางที่น้ำ ( *
) จะใช้เมื่อมันออกมาจากก๊อกน้ำและตกลงไปในรางหรือออกจากพื้นที่กริด:
f f f <-- first second and third faucets
* * *A*
* *A*/ \*
\*/ * *A <-- a '*' is not drawn to the right of this A because it would be out of the 9×7 bounds
* *A*\/ <-- upper trough
**/ *
\/ * <-- lower trough
สมมติว่า 3 faucets ให้ปริมาณน้ำเท่ากันในแต่ละครั้งที่เราเห็น
- น้ำแรกของ faucet ทั้งหมดไหลลงสู่รางล่าง
- น้ำครึ่งหนึ่งของก๊อกน้ำที่สองไปที่รางล่างและอีกครึ่งหนึ่งจะถูกแยกระหว่างรางล่างและตกจากตะแกรง
- หนึ่งในสี่ของก๊อกน้ำที่สามไปที่รางล่างหนึ่งในสี่ตกจากด้านล่างของตารางหนึ่งในสี่เข้าไปในรางบนและหนึ่งในสี่ตกจากตะแกรงไปทางขวา
จากนี้เราสามารถบอกได้ว่า(1 + 3/4 + 1/4 + 1/4) / 3 = 75%
น้ำถูกจับโดยร่องน้ำและ(1/4 + 1/4 + 1/4) / 3 = 25%
ตกจากตะแกรง
ความท้าทาย
คุณอาจดำเนินการท้าทายใด ๆ หรือทั้งหมดที่เกี่ยวข้องกับการตั้งค่าการไหลของน้ำ ASCII นี้ พวกเขาล้วนเป็นโค้ดกอล์ฟคำตอบที่สั้นที่สุดสำหรับแต่ละความท้าทายคือผู้ชนะ คำตอบที่ได้รับการยอมรับจะเป็นคนที่ทำสิ่งที่ท้าทายที่สุดให้ได้โดยมีความยาวรวมของรหัสว่า tie-breaker
ความท้าทาย 1
เขียนโปรแกรมที่ให้ส่วนของน้ำที่ไหลลงสู่รางสำหรับตารางที่กำหนด 0.75
การส่งออกของตัวอย่างข้างต้นก็จะ
ความท้าทายที่ 2
เขียนโปรแกรมที่ให้กริดวาดเส้น*
ในที่ที่น้ำไหลเหมือนที่ฉันได้ทำไปแล้ว คุณไม่ควรเขียนทับสิ่งใดนอกจากตัวอักษรเว้นวรรคและตารางไม่ควรเปลี่ยนขนาด ดังนั้นสำหรับสิ่งที่ชอบ
f
/A
ไม่มีอะไรต้องทำตั้งแต่ถึงแม้ว่าน้ำจะไหลไปทางด้านใดด้านหนึ่งของ A แต่ก็ไม่สามารถลากไปทางซ้ายโดยไม่ต้องถอดออก/
และไม่สามารถดึงไปทางขวาโดยไม่ทำให้ตาราง 2 × 2 ใหญ่ขึ้น
ความท้าทาย 3 (อัปเดต)
เขียนโปรแกรมที่ใช้จำนวนเต็มสองจำนวนที่ไม่เป็นลบจำนวน T ทั้งหมดและจำนวนเงินที่จะเก็บ K (T> = K) สร้างและวาดกริดด้วยหนึ่งอย่างf
เช่นเมื่อก๊อกน้ำนั้นเทน้ำออกไปที T หน่วย K จะไหลลงสู่รางน้ำอย่างแน่นอน หากมันเป็นไปไม่ได้ที่จะทำเช่นนี้ในตาราง จำกัด สำหรับคู่ (T, K) ที่เฉพาะเจาะจงจากนั้นเอาท์พุท 'Impossible'
การชี้แจง (นำไปใช้กับความท้าทายทั้งหมด)
- อินพุตสามารถผ่าน stdin หรือไฟล์หรือแม้แต่การเรียกใช้ฟังก์ชันบนการแทนค่าสตริงของกริด เพียงทำให้มันชัดเจนว่าจะใช้อินพุตที่แตกต่างกันอย่างไร
- เอาต์พุตต้องไปที่ stdout
\A
และA/
และAA
นอกจากนี้ยังมีร่องที่คุณคาดหวัง- กริด w โดย h จะเป็นรูปแบบสี่เหลี่ยมที่ดีเสมอของอักขระ w * h ที่ไม่นับบรรทัดใหม่
*
จะไม่มีการเว้นวรรคต่อท้ายที่หายไปและการเกิดขึ้นของไม่มี - ขนาดกริดสามารถมีขนาดเล็กเท่ากับ 1 × 1 และมีขนาดใหญ่โดยพลการ (เหตุผลใหญ่ภายในเหตุผล int.maxValue หรือชอบเป็นข้อ จำกัด ที่ยอมรับได้เหมือนกันไปสำหรับ T และ K)
- กระแสที่อยู่เหนือ
f
กระแสที่ไหลผ่าน - Faucet สามารถอยู่ได้ทุกที่ไม่ใช่แค่อยู่แถวบนสุด
A
หารปริมาณน้ำที่เทลงบนมันเสมอครึ่ง
หมายเหตุ:สิ่งที่ชอบ/A
และ//
ใช้ได้อย่างสมบูรณ์ น้ำไม่ได้อย่างอิสระไหลระหว่างตัวละคร ( แต่สำหรับความท้าทาย 2 ไม่มีที่ว่างพอที่จะดึงมัน)
ดังนั้นในการตั้งค่า
ff
/A
f
กระแสทางซ้ายเทลงมากระทบ/
และเลื่อนไปทางซ้าย สิทธิf
สตรีมเทลงฮิตA
ครึ่งไปทางขวาและซ้ายไปครึ่งระหว่างและA
/
เช่น
ff
**
*/A*
** *
** *
/A
A
สำหรับความท้าทายทั้งหมดจะเป็นการดีที่จะชี้แจงว่า\A
เป็นรางน้ำหรือไม่ สำหรับความท้าทายที่สามควรมี 3 หน่วยที่ตกอยู่บนข้อA
สันนิษฐานที่จะแยกออก1.5 / 1.5
(ดังนั้นการป้อนข้อมูลจึงเป็นจำนวนตรรกยะเพียงตัวเดียว) หรือเป็นเช่นนั้น2 / 1
ในกรณีใดด้านใดที่ได้รับ2
?
A
ทั้งสองฝ่ายจะได้ 1.5 มันขึ้นอยู่กับ coder เพื่อให้แน่ใจว่าความแม่นยำของการลอยไม่ใช่ปัญหา)
f
s