ผู้ใช้ 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นี้
- จุดเริ่มต้นอยู่ที่มุมซ้ายบน โดยเฉพาะอย่างยิ่งมันจะเป็นเซลล์ด้านซ้ายสุดของแถวบนสุดของจุดสิ้นสุดของแทร็กนั้น
- เป้าหมายอยู่ที่มุมขวาล่าง โดยเฉพาะอย่างยิ่งมันจะเป็นเซลล์ที่ถูกต้องที่สุดของแถวล่างสุดของแทร็กนั้น
- ประสงค์
target4*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 (ความน่าจะเป็น)
ผลการทดสอบโดยละเอียด (คะแนนสำหรับการส่งความน่าจะเป็นได้รับการพิจารณาแยกต่างหาก)