Người dùng RugPython đã đăng một bài mới về vấn đề này, điều này tập trung nhiều hơn vào các giải pháp heuristic, do không gian tìm kiếm tăng lên. Cá nhân tôi nghĩ rằng thử thách đó đẹp hơn tôi rất nhiều, vì vậy hãy cân nhắc thử thách đó!
Vector racing là một trò chơi gây nghiện có thể được chơi bằng bút và một tờ giấy vuông. Bạn vẽ một đường đua tùy ý trên tờ giấy, xác định điểm bắt đầu và kết thúc và sau đó bạn điều khiển chiếc xe có kích thước điểm của mình theo cách rẽ. Đi đến cuối cùng nhanh nhất có thể, nhưng hãy cẩn thận để không kết thúc trong một bức tường!
Lần vết
- Bản đồ là một lưới hai chiều, trong đó mỗi ô có tọa độ nguyên.
- Bạn di chuyển trên các ô lưới.
- Mỗi ô lưới là một phần của đường đua hoặc là một bức tường.
- Chính xác một ô theo dõi là tọa độ bắt đầu.
- Ít nhất một ô theo dõi được chỉ định là mục tiêu. Hạ cánh trên bất kỳ trong số này hoàn thành cuộc đua. Nhiều ô mục tiêu không nhất thiết phải được kết nối.
Chỉ đạo xe
Xe của bạn bắt đầu tại một tọa độ nhất định và với véc tơ vận tốc (0, 0)
. Trong mỗi lượt, bạn có thể điều chỉnh từng thành phần của vận tốc bằng ±1
hoặc để nguyên như vậy. Sau đó, vectơ vận tốc kết quả được thêm vào vị trí xe của bạn.
Một hình ảnh có thể giúp! Vòng tròn màu đỏ là vị trí cuối cùng của bạn. Vòng tròn màu xanh là vị trí hiện tại của bạn. Vận tốc của bạn là vectơ từ vòng tròn màu đỏ sang màu xanh. Trong lượt này, tùy thuộc vào cách bạn điều chỉnh vận tốc của mình, bạn có thể di chuyển đến bất kỳ vòng tròn màu xanh lá cây nào.
Nếu bạn hạ cánh trong một bức tường, bạn mất ngay lập tức.
Nhiệm vụ của bạn
Bạn đoán nó: viết một chương trình , đưa ra một đường đua làm đầu vào, điều khiển chiếc xe đến một trong những ô mục tiêu trong càng ít lượt càng tốt. Giải pháp của bạn sẽ có thể xử lý hợp lý tốt với các rãnh tùy ý và không được tối ưu hóa cụ thể đối với các trường hợp thử nghiệm được cung cấp.
Đầu vào
Khi chương trình của bạn được gọi, hãy đọc từ stdin :
target
n m
[ASCII representation of an n x m racetrack]
time
target
là số lượt tối đa bạn có thể thực hiện để hoàn thành bản nhạc và time
là tổng ngân sách thời gian của bạn cho bản nhạc, tính bằng giây (không nhất thiết là số nguyên). Xem bên dưới để biết chi tiết về thời gian.
Đối với bản nhạc được phân tách bằng dòng mới, các ký tự sau được sử dụng:
#
- TườngS
- sự khởi đầu*
- một mục tiêu.
- tất cả các ô theo dõi khác (tức là đường)
Tất cả các ô bên ngoài n x m
lưới được cung cấp được ngụ ý là các bức tường.
Nguồn gốc tọa độ nằm ở góc trên cùng bên trái.
Đây là một ví dụ đơn giản:
8
4.0
9 6
###...***
###...***
###...***
......###
S.....###
......###
Sử dụng lập chỉ mục dựa trên 0, tọa độ bắt đầu sẽ là (0,4)
.
Sau mỗi lần di chuyển, bạn sẽ nhận được thêm thông tin đầu vào:
x y
u v
time
Trong trường hợp x
, y
, u
, v
là tất cả các số nguyên 0-based. (x,y)
là vị trí hiện tại của bạn và (u,v)
là vận tốc hiện tại của bạn. Lưu ý rằng x+u
và / hoặc y+v
có thể nằm ngoài giới hạn.
time
là bất cứ điều gì còn lại của ngân sách thời gian của bạn, tính bằng giây. Hãy bỏ qua điều này. Điều này chỉ dành cho những người tham gia thực sự muốn đưa việc thực hiện của họ đến thời gian giới hạn.
Khi trò chơi kết thúc (vì bạn đã rơi vào một bức tường, vượt ra khỏi giới hạn, vượt quá target
lượt, hết thời gian hoặc đạt được mục tiêu), bạn sẽ nhận được một dòng trống.
Đầu ra
Đối với mỗi lượt, viết vào thiết bị xuất chuẩn :
Δu Δv
nơi Δu
và Δv
từng là một trong những -1
, 0
, 1
. Điều này sẽ được thêm vào (u,v)
để xác định vị trí mới của bạn. Chỉ cần làm rõ, các hướng dẫn như sau
(-1,-1) ( 0,-1) ( 1,-1)
(-1, 0) ( 0, 0) ( 1, 0)
(-1, 1) ( 0, 1) ( 1, 1)
Một giải pháp tối ưu cho ví dụ trên sẽ là
1 0
1 -1
1 0
Lưu ý rằng bộ điều khiển không tự gắn vào stderr , vì vậy bạn có thể sử dụng nó cho bất kỳ loại đầu ra gỡ lỗi nào bạn có thể cần trong khi phát triển bot của mình. Vui lòng xóa / nhận xét bất kỳ đầu ra như vậy trong mã gửi của bạn, mặc dù.
Bot của bạn có thể mất nửa giây để phản hồi trong mỗi lượt. Đối với các lượt chơi mất nhiều thời gian hơn, bạn sẽ có ngân sách thời gian (mỗi lần theo dõi) target/2
giây. Mỗi khi một lượt chơi mất hơn nửa giây, thời gian bổ sung sẽ được trừ vào ngân sách thời gian của bạn. Khi ngân sách thời gian của bạn bằng không, cuộc đua hiện tại sẽ bị hủy bỏ.
Mới: Vì lý do thực tế, tôi phải đặt giới hạn bộ nhớ (vì bộ nhớ dường như hạn chế hơn thời gian cho kích thước theo dõi hợp lý). Do đó, tôi sẽ phải hủy bỏ mọi lần chạy thử trong đó tay đua sử dụng hơn 1GB bộ nhớ được đo bởi Process Explorer là Private Byte .
Chấm điểm
Có một điểm chuẩn của 20 bài hát. Đối với mỗi bản nhạc:
- Nếu bạn hoàn thành bản nhạc, điểm của bạn là số lần bạn cần để đạt được một ô mục tiêu chia cho
target
. - Nếu bạn hết thời gian / bộ nhớ hoặc không đạt được mục tiêu trước khi
target
lượt chơi trôi qua hoặc bạn rơi vào tường / ngoài giới hạn bất cứ lúc nào, điểm số của bạn là2
. - Nếu chương trình của bạn không mang tính quyết định, điểm của bạn là trung bình trên 10 lần chạy trên bản nhạc đó (vui lòng nêu điều này trong câu trả lời của bạn).
Điểm tổng thể của bạn là tổng của điểm số theo dõi cá nhân. Điểm số thấp nhất chiến thắng!
Hơn nữa, mọi người tham gia có thể (và được khuyến khích mạnh mẽ) cung cấp một bản nhạc chuẩn bổ sung , sẽ được thêm vào danh sách chính thức. Các câu trả lời trước sẽ được đánh giá lại bao gồm cả bài hát mới này. Điều này là để đảm bảo rằng không có giải pháp nào được điều chỉnh quá sát với các trường hợp thử nghiệm hiện có và để giải thích cho các trường hợp cạnh thú vị mà tôi có thể đã bỏ lỡ (nhưng bạn có thể phát hiện ra).
Cà vạt
Bây giờ đã có một giải pháp tối ưu, đây có thể sẽ là yếu tố chính cho điểm số của người tham gia.
Nếu có một cà vạt (do một số câu trả lời giải quyết tối ưu tất cả các bản nhạc hoặc cách khác), tôi sẽ thêm các trường hợp kiểm tra bổ sung (lớn hơn) để phá vỡ cà vạt. Để tránh bất kỳ sự thiên vị nào của con người khi tạo ra các bộ ngắt kết nối này, chúng sẽ được tạo theo cách cố định:
- Tôi sẽ làm tăng chiều dài mặt
n
bằng10
so với các ca khúc cuối cùng được tạo theo cách này. (Tôi có thể bỏ qua các kích cỡ nếu chúng không phá vỡ cà vạt.) - Cơ sở là đồ họa vector này
- Điều này sẽ được rasterized ở độ phân giải mong muốn bằng cách sử dụng đoạn Mathicala này .
- Bắt đầu là ở góc trên cùng bên trái. Cụ thể, nó sẽ là ô ngoài cùng bên trái của hàng trên cùng của phần cuối của bản nhạc.
- Mục tiêu là ở góc dưới bên phải. Cụ thể, nó sẽ là ô bên phải nhất của hàng dưới cùng của phần cuối của bản nhạc.
- Ý
target
chí4*n
.
Bản nhạc cuối cùng của điểm chuẩn ban đầu đã được tạo như thế này, với n = 50
.
Bộ điều khiển
Chương trình kiểm tra các bài nộp được viết bằng Ruby và có thể được tìm thấy trên GitHub cùng với tệp điểm chuẩn tôi sẽ sử dụng. Ngoài ra còn có một bot ví dụ được gọi randomracer.rb
trong đó, chỉ đơn giản là chọn các bước di chuyển ngẫu nhiên. Bạn có thể sử dụng cấu trúc cơ bản của nó làm điểm khởi đầu cho bot của bạn để xem cách thức hoạt động của giao tiếp.
Bạn có thể chạy bot của riêng bạn dựa vào tệp theo dõi bạn chọn như sau:
ruby controller.rb track_file_name command to run your racer
ví dụ
ruby controller.rb benchmark.txt ruby randomracer.rb
Kho lưu trữ cũng chứa hai lớp Point2D
và Track
. Nếu bài nộp của bạn được viết bằng Ruby, vui lòng sử dụng lại chúng để thuận tiện cho bạn.
Công tắc dòng lệnh
Bạn có thể thêm dòng lệnh chuyển đổi -v
, -s
, -t
trước tên file của chuẩn mực. Nếu bạn muốn sử dụng nhiều thiết bị chuyển mạch, bạn cũng có thể làm, ví dụ , -vs
. Đây là những gì họ làm:
-v
(verbose): Sử dụng điều này để tạo ra một chút đầu ra gỡ lỗi từ bộ điều khiển.
-s
(im lặng): Nếu bạn muốn theo dõi vị trí và vận tốc của mình và không quan tâm đến ngân sách thời gian, bạn có thể tắt ba dòng đầu ra đó mỗi lượt (gửi đến bài nộp của bạn) bằng cờ này.
-t
(bản nhạc): Cho phép bạn chọn từng bản nhạc để kiểm tra. Ví dụ: -t "1,2,5..8,15"
chỉ kiểm tra các bài hát 1, 2, 5, 6, 7, 8 và 15. Cảm ơn rất nhiều cho Ventero về tính năng này và trình phân tích cú pháp tùy chọn.
Bài nộp của bạn
Tóm lại, vui lòng bao gồm những điều sau đây trong câu trả lời của bạn:
- Điểm số của bạn.
- Nếu bạn đang sử dụng tính ngẫu nhiên, vui lòng nêu rõ điều này để tôi có thể tính điểm trung bình của bạn qua nhiều lần chạy.
- Mã cho trình của bạn.
- Vị trí của trình biên dịch hoặc trình thông dịch miễn phí cho ngôn ngữ bạn chọn chạy trên máy Windows 8.
- Hướng dẫn biên soạn nếu cần thiết.
- Một chuỗi dòng lệnh Windows để chạy trình của bạn.
- Cho dù trình của bạn yêu cầu
-s
cờ hay không. - (tùy chọn) Một bản nhạc mới, có thể giải được sẽ được thêm vào điểm chuẩn. Tôi sẽ xác định hợp lý
target
cho theo dõi của bạn bằng tay. Khi bản nhạc được thêm vào điểm chuẩn, tôi sẽ chỉnh sửa nó khỏi câu trả lời của bạn. Tôi bảo lưu quyền yêu cầu bạn theo dõi một bản nhạc khác (chỉ trong trường hợp bạn thêm một bản nhạc lớn không cân xứng, bao gồm nghệ thuật ASCII tục tĩu trong bản nhạc, v.v.). Khi tôi thêm trường hợp kiểm tra vào tập hợp điểm chuẩn, tôi sẽ thay thế bài hát trong câu trả lời của bạn bằng một liên kết đến bài hát trong tệp điểm chuẩn để giảm sự lộn xộn trong bài đăng này.
Như bạn có thể thấy, tôi sẽ kiểm tra tất cả các lần gửi trên máy Windows 8. Nếu hoàn toàn không có cách nào để trình của bạn chạy trên Windows, tôi cũng có thể thử trên máy ảo Ubuntu. Điều này sẽ chậm hơn đáng kể, vì vậy nếu bạn muốn tối đa hóa giới hạn thời gian, hãy đảm bảo chương trình của bạn chạy trên Windows.
Có thể trình điều khiển tốt nhất xuất hiện véc tơ!
Nhưng tôi muốn chơi!
Nếu bạn muốn tự mình thử trò chơi để cảm nhận rõ hơn về nó, thì đây là cách thực hiện . Các quy tắc được sử dụng ở đó hơi phức tạp hơn một chút, nhưng nó tương tự đủ để hữu ích, tôi nghĩ vậy.
Bảng xếp hạng
Cập nhật lần cuối: 01/09/2014, 21:29
Các bản nhạc UTC trong điểm chuẩn: 25
Kích cỡ bộ ngắt: 290, 440
- 6.86688 - Kuroi Neko
- 8.73108 - user2357112 - đệ trình lần 2
- 9.86627 - nneonneo
- 10.66109 - user2357112 - đệ trình đầu tiên
- 12.49643 - Tia
- 40.0759 - bút danh 117 (xác suất)
Kết quả kiểm tra chi tiết . (Điểm cho bài nộp xác suất đã được xác định riêng.)