ผู้ใช้ CarpetPython โพสต์สิ่งใหม่เกี่ยวกับปัญหานี้ซึ่งให้ความสำคัญกับโซลูชั่นฮิวริสติกมากขึ้นเนื่องจากมีพื้นที่การค้นหาเพิ่มขึ้น โดยส่วนตัวฉันคิดว่าความท้าทายนั้นดีกว่าของฉันมากดังนั้นลองพิจารณาดูสิ!
Vector racing เป็นเกมเสพติดที่สามารถเล่นได้ด้วยปากกาและแผ่นกระดาษสี่เหลี่ยมจตุรัส คุณวาดสนามแข่งตามอำเภอใจลงบนกระดาษกำหนดจุดเริ่มต้นและจุดสิ้นสุดจากนั้นให้คุณควบคุมรถขนาดจุดของคุณในลักษณะเลี้ยว ไปให้ถึงจุดสิ้นสุดให้เร็วที่สุดเท่าที่จะทำได้ แต่ระวังอย่าให้ถูกกำแพง!
ติดตาม
- แผนที่เป็นกริดสองมิติโดยที่แต่ละเซลล์มีพิกัดจำนวนเต็ม
- คุณย้ายไปที่เซลล์กริด
- เซลล์กริดแต่ละเซลล์เป็นส่วนหนึ่งของแทร็กหรือเป็นกำแพง
- หนึ่งเซลล์ติดตามคือพิกัดเริ่มต้น
- มีการกำหนดอย่างน้อยหนึ่งเซลล์การติดตามเป็นเป้าหมาย การลงจอดบนสิ่งเหล่านี้เสร็จสิ้นการแข่งขัน เซลล์เป้าหมายหลายเซลล์ไม่จำเป็นต้องเชื่อมต่อ
ขับรถ
(0, 0)
รถของคุณเริ่มต้นที่ได้รับการประสานงานและด้วยความเร็วเวกเตอร์ ในแต่ละเทิร์นคุณสามารถปรับแต่ละส่วนของความเร็ว±1
ได้ จากนั้นเวกเตอร์ความเร็วที่ได้จะถูกเพิ่มไปยังตำแหน่งรถของคุณ
ภาพอาจช่วยได้! วงกลมสีแดงคือตำแหน่งของคุณในที่สุด วงกลมสีน้ำเงินคือตำแหน่งปัจจุบันของคุณ ความเร็วของคุณคือเวกเตอร์จากสีแดงถึงวงกลมสีน้ำเงิน ในเทิร์นนี้ขึ้นอยู่กับวิธีที่คุณปรับความเร็วของคุณคุณอาจย้ายไปยังวงกลมสีเขียวใด ๆ
หากคุณที่ดินในผนังที่คุณสูญเสียทันที
งานของคุณ
คุณเดา: เขียนโปรแกรมที่ให้สนามแข่งเป็นอินพุทนำพารถไปยังเซลล์เป้าหมายหนึ่งในไม่กี่รอบเท่าที่จะทำได้ โซลูชันของคุณควรสามารถจัดการแทร็กตามอำเภอใจได้ดีพอสมควรและไม่ได้รับการปรับให้เหมาะสมกับกรณีทดสอบที่มีให้โดยเฉพาะ
อินพุต
เมื่อโปรแกรมของคุณถูกเรียกใช้อ่านจาก stdin :
target
n m
[ASCII representation of an n x m racetrack]
time
target
คือจำนวนรอบการหมุนสูงสุดที่คุณอาจใช้ในการติดตามและtime
เป็นงบประมาณเวลาทั้งหมดของคุณสำหรับการติดตามเป็นวินาที (ไม่จำเป็นต้องเป็นจำนวนเต็ม) ดูด้านล่างสำหรับรายละเอียดเกี่ยวกับเวลา
สำหรับแทร็กที่คั่นด้วย newline จะใช้อักขระต่อไปนี้:
#
- ผนังS
- เริ่มต้น*
- เป้าหมาย.
- เซลล์ติดตามอื่น ๆ ทั้งหมด (เช่นถนน)
เซลล์ทั้งหมดที่อยู่นอกn x m
ตารางที่ระบุไว้จะเป็นผนัง
จุดกำเนิดพิกัดอยู่ที่มุมซ้ายบน
นี่คือตัวอย่างง่ายๆ:
8
4.0
9 6
###...***
###...***
###...***
......###
S.....###
......###
โดยใช้การจัดทำดัชนี 0-based (0,4)
เริ่มต้นของการประสานงานจะเป็น
หลังจากย้ายทุกครั้งคุณจะได้รับการป้อนข้อมูลเพิ่มเติม:
x y
u v
time
ที่ไหนx
, y
, u
, v
มีทั้งหมดจำนวนเต็ม 0-based (x,y)
คือตำแหน่งปัจจุบันของคุณและ(u,v)
เป็นความเร็วปัจจุบันของคุณ โปรดทราบว่าx+u
และ / หรือy+v
อาจอยู่นอกขอบเขต
time
อะไรก็ตามที่เหลืออยู่ในงบประมาณเวลาของคุณในหน่วยวินาที อย่าลังเลที่จะเพิกเฉยต่อสิ่งนี้ สิ่งนี้มีไว้สำหรับผู้เข้าร่วมที่ต้องการนำไปใช้งานจริงตามเวลาที่กำหนด
เมื่อเกมจบลง (เนื่องจากคุณลงจอดในกำแพง, ย้ายออกนอกสนาม, target
เทิร์นเกิน, หมดเวลาหรือไปถึงเป้าหมาย) คุณจะได้รับบรรทัดว่างเปล่า
เอาท์พุต
สำหรับการเลี้ยวแต่ละครั้งเขียนถึง stdout :
Δu Δv
ที่Δu
และΔv
แต่ละหนึ่ง-1
, ,0
1
สิ่งนี้จะถูกเพิ่มเข้าไป(u,v)
เพื่อกำหนดตำแหน่งใหม่ของคุณ เพียงเพื่อชี้แจงทิศทางมีดังนี้
(-1,-1) ( 0,-1) ( 1,-1)
(-1, 0) ( 0, 0) ( 1, 0)
(-1, 1) ( 0, 1) ( 1, 1)
ทางออกที่ดีที่สุดสำหรับตัวอย่างข้างต้นจะเป็น
1 0
1 -1
1 0
โปรดทราบว่าคอนโทรลเลอร์ไม่ได้แนบตัวเองเข้ากับstderrดังนั้นคุณสามารถใช้งานได้กับเอาต์พุตการดีบักทุกประเภทที่คุณอาจต้องใช้ในขณะพัฒนาบอทของคุณ โปรดลบ / แสดงความคิดเห็นเอาท์พุทใด ๆ ในรหัสที่คุณส่ง
บอทของคุณอาจใช้เวลาครึ่งวินาทีในการตอบสนองในแต่ละเทิร์น สำหรับรอบที่ใช้เวลานานคุณจะมีเวลางบประมาณ (ต่อแทร็ก) เป็นtarget/2
วินาที ทุกครั้งที่การเลี้ยวใช้เวลานานกว่าครึ่งวินาทีเวลาเพิ่มเติมจะถูกหักออกจากงบประมาณเวลาของคุณ เมื่องบประมาณเวลาของคุณถึงศูนย์การแข่งขันปัจจุบันจะถูกยกเลิก
ใหม่:สำหรับเหตุผลในทางปฏิบัติฉันต้องตั้งค่าขีด จำกัด หน่วยความจำ (เนื่องจากหน่วยความจำดูเหมือนว่าจะมีการ จำกัด มากกว่าเวลาสำหรับขนาดแทร็กที่เหมาะสม) ดังนั้นผมจะต้องยกเลิกการทดสอบการทำงานใด ๆ ที่แข่งใช้มากกว่า1GBหน่วยความจำที่วัดโดยProcess Explorerเป็นไบต์ส่วนตัว
เกณฑ์การให้คะแนน
มีเกณฑ์มาตรฐาน 20 เพลง สำหรับแต่ละแทร็ก:
- หากคุณดำเนินการติดตามคะแนนของคุณคือจำนวนของการเคลื่อนไหวที่คุณต้องไปถึงเซลล์เป้าหมายโดยแบ่งออกเป็น
target
- หากคุณหมดเวลา / หน่วยความจำหรือไม่ถึงเป้าหมายก่อนที่
target
จะเปลี่ยนผ่านไปหรือคุณที่ดินในผนัง / ออกจากขอบเขตในเวลาใด ๆ2
คะแนนของคุณคือ - หากโปรแกรมของคุณไม่ได้กำหนดไว้คะแนนของคุณคือค่าเฉลี่ยมากกว่า 10 การรันบนแทร็กนั้น (โปรดระบุสิ่งนี้ในคำตอบของคุณ)
คะแนนโดยรวมของคุณคือผลรวมของคะแนนเพลงแต่ละเพลง คะแนนต่ำสุดชนะ!
นอกจากนี้ผู้เข้าร่วมทุกคนอาจ (และได้รับการสนับสนุนอย่างยิ่งให้) จัดทำข้อมูลมาตรฐานเพิ่มเติมซึ่งจะถูกเพิ่มเข้าไปในรายการอย่างเป็นทางการ คำตอบก่อนหน้านี้จะได้รับการประเมินใหม่รวมถึงแทร็กใหม่นี้ นี่คือเพื่อให้แน่ใจว่าไม่มีวิธีใดที่จะถูกปรับแต่งให้ใกล้เคียงกับกรณีทดสอบที่มีอยู่มากเกินไปและเพื่อพิจารณากรณีขอบที่น่าสนใจที่ฉันอาจพลาดไป (ซึ่งคุณอาจเห็น)
เน็คไททำลาย
ตอนนี้มีทางออกที่ดีที่สุดแล้วนี่อาจเป็นปัจจัยหลักสำหรับคะแนนของผู้เข้าร่วม
หากมีการผูก (เนื่องจากคำตอบหลายคำตอบในการแก้ไขแทร็กทั้งหมดอย่างเหมาะสมหรืออย่างอื่น) ฉันจะเพิ่มกรณีทดสอบเพิ่มเติม (ใหญ่กว่า) เพื่อแยกการผูก เพื่อหลีกเลี่ยงความลำเอียงของมนุษย์เมื่อสร้างตัวแบ่งเบรกเกอร์เหล่านี้จะถูกสร้างขึ้นในลักษณะที่แน่นอน:
- ฉันจะเพิ่มความยาวด้าน
n
โดย10
เปรียบเทียบกับเพลงสุดท้ายที่สร้างด้วยวิธีนี้ (ฉันอาจข้ามขนาดได้หากพวกเขาไม่ได้ผูกไท) - พื้นฐานคือเวกเตอร์กราฟิกนี้
- สิ่งนี้จะได้รับการแรสเตอร์ด้วยความละเอียดที่ต้องการโดยใช้ข้อมูลโค้ด Mathematicaนี้
- จุดเริ่มต้นอยู่ที่มุมซ้ายบน โดยเฉพาะอย่างยิ่งมันจะเป็นเซลล์ด้านซ้ายสุดของแถวบนสุดของจุดสิ้นสุดของแทร็กนั้น
- เป้าหมายอยู่ที่มุมขวาล่าง โดยเฉพาะอย่างยิ่งมันจะเป็นเซลล์ที่ถูกต้องที่สุดของแถวล่างสุดของแทร็กนั้น
- ประสงค์
target
4*n
n = 50
ติดตามสุดท้ายของมาตรฐานเริ่มต้นที่ถูกสร้างขึ้นแล้วเช่นนี้ด้วย
ผู้ควบคุม
โปรแกรมที่ทดสอบการส่งนั้นเขียนด้วย Ruby และสามารถพบได้ใน GitHubพร้อมกับไฟล์มาตรฐานที่ฉันจะใช้ นอกจากนี้ยังมีบอทตัวอย่างที่เรียกว่าrandomracer.rb
ในนั้นซึ่งเพียงแค่เลือกการเคลื่อนไหวแบบสุ่ม คุณสามารถใช้โครงสร้างพื้นฐานเป็นจุดเริ่มต้นสำหรับบอทของคุณเพื่อดูว่าการสื่อสารทำงานอย่างไร
คุณสามารถเรียกใช้บ็อตของคุณเองกับไฟล์แทร็คที่คุณต้องการดังนี้:
ruby controller.rb track_file_name command to run your racer
เช่น
ruby controller.rb benchmark.txt ruby randomracer.rb
พื้นที่เก็บข้อมูลนอกจากนี้ยังมีสองชั้นและPoint2D
Track
หากการส่งของคุณเขียนเป็น Ruby คุณสามารถนำสิ่งเหล่านั้นกลับมาใช้ใหม่ได้เพื่อความสะดวกของคุณ
สวิตช์บรรทัดคำสั่ง
คุณสามารถเพิ่มสวิตช์บรรทัดคำสั่ง-v
, -s
, -t
ก่อนที่ชื่อไฟล์มาตรฐานของ หากคุณต้องการใช้สวิตช์หลายตัวคุณสามารถทำได้เช่น-vs
กัน นี่คือสิ่งที่พวกเขาทำ:
-v
(verbose): ใช้สิ่งนี้เพื่อสร้างผลลัพธ์การดีบักเพิ่มเติมจากคอนโทรลเลอร์
-s
(เงียบ): หากคุณต้องการติดตามตำแหน่งและความเร็วด้วยตัวคุณเองและไม่สนใจงบประมาณเวลาคุณสามารถปิดเอาต์พุตสามบรรทัดเหล่านั้นในแต่ละเทิร์น (ส่งไปยังการส่งของคุณ) ด้วยการตั้งค่าสถานะนี้
-t
(เพลง): ให้คุณเลือกเพลงที่จะทดสอบ เช่น-t "1,2,5..8,15"
จะทดสอบแทร็ก 1, 2, 5, 6, 7, 8 และ 15 เท่านั้น ขอบคุณมากสำหรับVenteroสำหรับคุณลักษณะนี้และตัวแยกวิเคราะห์ตัวเลือก
การส่งของคุณ
โดยสรุปโปรดระบุสิ่งต่อไปนี้ในคำตอบของคุณ:
- คะแนนของคุณ.
- หากคุณกำลังใช้การสุ่มโปรดระบุสิ่งนี้เพื่อที่ฉันจะได้คะแนนเฉลี่ยของคุณมากกว่าการวิ่งหลายครั้ง
- รหัสสำหรับการส่งของคุณ
- ตำแหน่งของคอมไพเลอร์หรือล่ามฟรีสำหรับภาษาที่คุณเลือกซึ่งทำงานบนเครื่อง Windows 8
- คำแนะนำในการรวบรวมหากจำเป็น
- สตริงคำสั่ง Windows เพื่อเรียกใช้การส่งของคุณ
- การส่งของคุณต้องการการ
-s
ตั้งค่าสถานะหรือไม่ - (เป็นทางเลือก)แทร็กใหม่ที่แก้ไขได้ซึ่งจะถูกเพิ่มในเกณฑ์มาตรฐาน ฉันจะกำหนดเหตุผลที่เหมาะสม
target
สำหรับการติดตามของคุณด้วยตนเอง เมื่อเพิ่มแทร็กในเกณฑ์มาตรฐานฉันจะแก้ไขมันออกจากคำตอบของคุณ ฉันขอสงวนสิทธิ์ในการขอแทร็คอื่น (ในกรณีที่คุณเพิ่มแทร็กที่มีขนาดใหญ่อย่างไม่เป็นสัดส่วนรวมถึงศิลปะ ASCII ที่ไม่สุภาพในแทร็ก ฯลฯ ) เมื่อฉันเพิ่มกรณีทดสอบลงในชุดเบนช์มาร์กฉันจะแทนที่แทร็กในคำตอบของคุณด้วยลิงก์ไปยังแทร็กในไฟล์เบนช์มาร์กเพื่อลดความยุ่งเหยิงในโพสต์นี้
อย่างที่คุณเห็นฉันจะทดสอบการส่งทั้งหมดในเครื่อง Windows 8 หากไม่มีวิธีใดที่จะทำให้การส่งของคุณทำงานบน Windows ได้ฉันสามารถลองใช้ Ubuntu VM ได้เช่นกัน สิ่งนี้จะช้ากว่านี้มากดังนั้นหากคุณต้องการ จำกัด เวลาให้มากที่สุดตรวจสอบให้แน่ใจว่าโปรแกรมของคุณทำงานบน Windows
ขอให้คนขับรถที่ดีที่สุดออกมาดุร้าย!
แต่ฉันต้องการเล่น!
หากคุณต้องการที่จะลองออกจากเกมด้วยตัวเองจะได้รับความรู้สึกที่ดีกว่าให้มันมีการดำเนินงานนี้ กฎที่ใช้มีความซับซ้อนขึ้นเล็กน้อย แต่ก็คล้ายกันมากพอที่จะเป็นประโยชน์ฉันคิดว่า
ลีดเดอร์บอร์ด
ปรับปรุงล่าสุด: 01/09/2014, 21:29 UTC
ติดตามมาตรฐาน: 25
ขนาดไทเบรคเกอร์: 290, 440
- 6.86688 - Kuroi Neko
- 8.73108 - user2357112 - การส่งครั้งที่ 2
- 9.86627 - nneonneo
- 10.66109 - user2357112 - การส่งครั้งที่ 1
- 12.49643 - เรย์
- 40.0759 - นามแฝง 117 (ความน่าจะเป็น)
ผลการทดสอบโดยละเอียด (คะแนนสำหรับการส่งความน่าจะเป็นได้รับการพิจารณาแยกต่างหาก)