เป้าหมายของการท้าทายนี้คือการผลิตการเคลื่อนไหวของห่วงโซ่ไดรฟ์ระบบประกอบด้วยชุดของเกียร์เฟืองเชื่อมต่อกันด้วยโซ่
ข้อกำหนดทั่วไป
โปรแกรมของคุณจะได้รับรายชื่อเฟืองซึ่งระบุว่าเป็น(x, y, radius)
สามเท่า ระบบห่วงโซ่ไดรฟ์ส่งผลให้ประกอบด้วยเฟืองเหล่านี้เชื่อมต่อกันด้วยโซ่ตึงปิดผ่านแต่ละของพวกเขาในการสั่งซื้อ เป้าหมายของคุณคือสร้างอนิเมชั่นวนลูปไม่ จำกัดแสดงระบบที่กำลังเคลื่อนไหว ตัวอย่างเช่นกำหนดอินพุต
(0, 0, 16), (100, 0, 16), (100, 100, 12), (50, 50, 24), (0, 100, 12)
ผลลัพธ์ควรมีลักษณะดังนี้
.
ระบบพิกัดควรเช่นที่จุดแกน x ขวาและแกน y ชี้ขึ้น คุณอาจจะคิดว่ารัศมีมีแม้ตัวเลขที่มากกว่าหรือเท่ากับ 8 (เราจะเห็นว่าทำไมเรื่องนี้ในภายหลัง.) นอกจากนี้คุณยังอาจคิดว่ามีอย่างน้อยสองเฟืองและที่เฟืองไม่ตัดอีกคนหนึ่ง หน่วยของอินพุตไม่สำคัญเกินไป ตัวอย่างและกรณีทดสอบทั้งหมดในโพสต์นี้ใช้พิกเซลเป็นหน่วยอินพุต (ตัวอย่างเช่นรัศมีของเฟืองกลางในรูปก่อนหน้าคือ 24 พิกเซล;) พยายามอย่าเบี่ยงเบนหน่วยเหล่านี้มากเกินไป ในส่วนที่เหลือของความท้าทายปริมาณเชิงพื้นที่จะถูกเข้าใจในหน่วยเดียวกับอินพุต - ตรวจสอบให้แน่ใจว่าได้สัดส่วนที่ถูกต้อง! มิติของการส่งออกควรจะมีขนาดใหญ่กว่ากรอบของเฟืองทั้งหมดที่มีขนาดใหญ่พอเล็กน้อยเพื่อให้ระบบทั้งหมดจะมองเห็นได้ โดยเฉพาะอย่างยิ่งตำแหน่งที่แน่นอนของเฟืองไม่ควรส่งผลกระทบต่อการส่งออก; เฉพาะตำแหน่งสัมพัทธ์ของพวกเขาควร (เช่นถ้าเราเปลี่ยนเฟืองทั้งหมดในตัวอย่างข้างต้นด้วยจำนวนเดียวกันเอาท์พุทจะยังคงเหมือนเดิม)
โซ่ควรสัมผัสกับเฟืองที่ผ่านไปทุกจุดติดต่อและตรงไปที่อื่น ห่วงโซ่ควรผ่านเฟืองดังกล่าวว่ากลุ่มห่วงโซ่ที่อยู่ติดกัน (นั่นคือส่วนหนึ่งของห่วงโซ่ระหว่างสองเฟืองที่พบกันที่เฟืองเดียวกัน) ไม่ตัดแต่ละอื่น ๆ
.
ตัวอย่างเช่นในขณะที่ระบบด้านซ้ายด้านบนใช้งานได้ แต่ระบบกึ่งกลางไม่ได้อยู่เนื่องจากส่วนของโซ่ทั้งสองที่อยู่ติดกันที่ผ่านทางเฟืองซ้ายล่างด้านล่าง อย่างไรก็ตามโปรดทราบว่าระบบที่ถูกต้องนั้นถูกต้องเนื่องจากเซกเมนต์ลูกโซ่ทั้งสองที่ตัดกันนั้นไม่ได้อยู่ติดกัน (ระบบนี้ผลิตโดยอินพุตที่แตกต่างจากอีกสองเซกเมนต์)
เพื่อให้สิ่งต่าง ๆ เรียบง่าย (r) คุณอาจคิดว่าไม่มีเฟืองเข้ามาขวางลำตัวนูนของเฟืองสองตัวที่อยู่ใกล้เคียงหรือตัวถังนูนของแต่ละเพื่อนบ้านและเพื่อนบ้านอื่น ๆ กล่าวอีกนัยหนึ่งเฟืองบนสุดในแผนภาพด้านล่างอาจไม่สามารถตัดกันบริเวณที่แรเงาได้
ส่วนของโซ่อาจตัดเฟืองอื่นนอกเหนือจากที่ผ่าน (เช่นในกรณีทดสอบครั้งสุดท้าย) ในกรณีนี้โซ่ควรปรากฏต่อหน้าเฟืองเสมอ
ข้อกำหนดด้านภาพ
โซ่ควรประกอบด้วยชุดของลิงก์ของความกว้างสลับ ความกว้างของลิงค์แคบควรมีประมาณ 2 และความกว้างของลิงค์กว้างควรมีประมาณ 5 ความยาวของลิงค์ทั้งสองประเภทควรจะเท่ากัน ระยะเวลาของเชนนั่นคือความยาวทั้งหมดของลิงค์คู่ที่กว้าง / แคบควรเป็นจำนวนที่ใกล้เคียงที่สุดถึง4πที่เหมาะกับจำนวนเต็มจำนวนครั้งในความยาวของโซ่ ตัวอย่างเช่นหากความยาวของโซ่เท่ากับ 1,000 ดังนั้นระยะเวลาของมันควรเป็น 12.5 ซึ่งเป็นจำนวนที่ใกล้เคียงที่สุดกับ4π (12.566 ... ) ที่ตรงกับจำนวนเต็ม (80) ใน 1,000 มันเป็นสิ่งสำคัญสำหรับช่วงเวลาที่พอดีจำนวนจำนวนครั้งในความยาวของห่วงโซ่เพื่อให้มีสิ่งประดิษฐ์ที่จุดที่โซ่ล้อมรอบ
เฟืองของรัศมีRควรประกอบด้วยสามส่วนศูนย์กลาง: เพลากลางซึ่งควรเป็นวงกลมรัศมีประมาณ 3; ร่างกายเฟืองของรอบเพลาซึ่งควรจะวงกลมรัศมีเกี่ยวกับR - 4.5; และขอบของเฟืองรอบตัวซึ่งควรเป็นรัศมีประมาณ
R - 1.5 ขอบควรมีฟันของเฟืองซึ่งควรมีความกว้างประมาณ 4 ขนาดและระยะห่างของฟันควรตรงกับขนาดของลิงค์โซ่
ระยะเวลาของฟันของเฟืองนั่นคือระยะห่างระหว่างฟันสองซี่ติดต่อกันตามแนวเส้นรอบวงของเฟืองควรตรงกับระยะเวลาของโซ่ เนื่องจากระยะเวลาประมาณ4πและเนื่องจากรัศมีของเฟืองถูกรับประกันว่าจะเท่ากันดังนั้นช่วงเวลาจึงควรพอดีกับเส้นรอบวงของเฟืองที่มีจำนวนเกือบเป็นจำนวนเต็มครั้งดังนั้นจึงไม่ควรมีสิ่งประดิษฐ์ที่สังเกตได้ ณ จุดที่ ฟันของเฟืองรอบตัว
คุณอาจจะใช้การรวมกันของสีใด ๆสำหรับห่วงโซ่ที่ส่วนต่างๆของอลูมิเนียมและพื้นหลังตราบใดที่พวกเขาจะมีความแตกต่างได้อย่างง่ายดาย พื้นหลังอาจโปร่งใส ตัวอย่างในโพสต์นี้ใช้ #202020
สำหรับโซ่ #868481
สำหรับเพลาและขอบ #646361
ของเฟืองและสำหรับร่างกายของเฟือง
ความต้องการภาพเคลื่อนไหว
เตอร์เป็นครั้งแรกในรายการการป้อนข้อมูลที่ควรจะหมุนตามเข็มนาฬิกา ; ส่วนที่เหลือของเฟืองควรหมุนตาม โซ่ควรเคลื่อนที่ด้วยความเร็วประมาณ16π (ประมาณ 50) หน่วยต่อวินาที อัตราเฟรมขึ้นอยู่กับคุณ แต่ภาพเคลื่อนไหวควรดูราบรื่นพอ
ภาพเคลื่อนไหวควรห่วงอย่างลงตัว
สอดคล้อง
แอตทริบิวต์และสัดส่วนที่มองเห็นได้บางอย่างมีการระบุอย่างจงใจโดยประมาณเท่านั้น - คุณไม่จำเป็นต้องจับคู่ให้ตรงกันทั้งหมด ผลลัพธ์ของโปรแกรมของคุณไม่จำเป็นต้องเป็นแบบจำลองพิกเซลต่อพิกเซลของตัวอย่างที่ให้ไว้ที่นี่ แต่ควรมีลักษณะคล้ายกัน โดยเฉพาะอย่างยิ่งสัดส่วนที่แน่นอนของโซ่และเฟืองและรูปร่างที่แน่นอนของลิงก์ของโซ่และฟันของเฟืองนั้นมีความยืดหยุ่น
จุดที่สำคัญที่สุดที่ควรติดตามคือ:
- ห่วงโซ่ควรผ่านเฟืองตามลำดับการป้อนข้อมูลจากทิศทางที่ถูกต้อง
- โซ่ควรสัมผัสกับเฟืองที่จุดสัมผัสทุกจุด
- การเชื่อมโยงของโซ่และฟันของเฟืองควร enmesh อย่างเรียบร้อยอย่างน้อยขึ้นไปเพื่อแก้ไขระยะห่างและเฟส
- ระยะห่างระหว่างการเชื่อมโยงของโซ่และฟันของเฟืองควรเป็นสิ่งที่ไม่มีสิ่งประดิษฐ์ที่เห็นได้ชัดเจน ณ จุดที่พวกเขาล้อมรอบ
- เฟืองควรหมุนในทิศทางที่ถูกต้อง
- ภาพเคลื่อนไหวควรวนซ้ำอย่างราบรื่น
ในฐานะที่เป็นโน้ตสุดท้ายในขณะที่ในทางเทคนิคแล้วเป้าหมายของความท้าทายนี้คือการเขียนโค้ดที่สั้นที่สุดหากคุณรู้สึกอยากสร้างสรรค์และสร้างผลงานที่มีความประณีตมากขึ้น
ท้าทาย
เขียนโปรแกรมหรือฟังก์ชั่นรับรายการเฟืองและสร้างภาพเคลื่อนไหวของระบบไดรฟ์ลูกโซ่ที่เกี่ยวข้องดังที่อธิบายไว้ข้างต้น
อินพุตและเอาต์พุต
คุณอาจจะต้องมีการป้อนข้อมูลผ่านบรรทัดคำสั่งผ่านSTDINเป็นอาร์กิวเมนต์ของฟังก์ชันหรือใช้วิธีการเทียบเท่า คุณสามารถใช้รูปแบบที่สะดวกสำหรับอินพุตได้ แต่อย่าลืมระบุไว้ในโพสต์ของคุณ
ขณะที่การส่งออกคุณอาจแสดงภาพเคลื่อนไหวโดยตรง , ผลิตไฟล์ภาพเคลื่อนไหว (เช่นภาพเคลื่อนไหว GIF) หรือผลิตเป็นลำดับของไฟล์กรอบ ( แต่มีโทษขนาดเล็กในกรณีนี้. ดูด้านล่าง) ถ้าคุณใช้การส่งออกไฟล์ ตรวจสอบให้แน่ใจว่าจำนวนเฟรมเหมาะสม (ตัวอย่างในโพสต์นี้ใช้เฟรมน้อยมาก) จำนวนเฟรมไม่จำเป็นต้องน้อยที่สุด แต่คุณไม่ควรสร้างเฟรมที่ฟุ่มเฟือยมากเกินไป หากคุณส่งลำดับของเฟรมให้แน่ใจว่าระบุอัตราเฟรมในโพสต์ของคุณ
คะแนน
นี่คือรหัสกอล์ฟ คำตอบที่สั้นที่สุดในไบต์ชนะ
การลงโทษ + 10% หากโปรแกรมของคุณสร้างเฟรมเป็นเอาท์พุตแทนที่จะแสดงภาพเคลื่อนไหวโดยตรงหรือสร้างไฟล์ภาพเคลื่อนไหวเดียวให้เพิ่ม 10% ในคะแนนของคุณ
กรณีทดสอบ
ทดสอบ 1
(0, 0, 26), (120, 0, 26)
ทดสอบ 2
(100, 100, 60), (220, 100, 14)
ทดสอบ 3
(100, 100, 16), (100, 0, 24), (0, 100, 24), (0, 0, 16)
ทดสอบ 4
(0, 0, 60), (44, 140, 16), (-204, 140, 16), (-160, 0, 60), (-112, 188, 12),
(-190, 300, 30), (30, 300, 30), (-48, 188, 12)
ทดสอบ 5
(0, 128, 14), (46.17, 63.55, 10), (121.74, 39.55, 14), (74.71, -24.28, 10),
(75.24, -103.55, 14), (0, -78.56, 10), (-75.24, -103.55, 14), (-74.71, -24.28, 10),
(-121.74, 39.55, 14), (-46.17, 63.55, 10)
ทดสอบ 6
(367, 151, 12), (210, 75, 36), (57, 286, 38), (14, 181, 32), (91, 124, 18),
(298, 366, 38), (141, 3, 52), (80, 179, 26), (313, 32, 26), (146, 280, 10),
(126, 253, 8), (220, 184, 24), (135, 332, 8), (365, 296, 50), (248, 217, 8),
(218, 392, 30)