Trình điều khiển thử nghiệm • Thảo luận về thử thách • Gửi nhà thám hiểm
( Nguồn hình ảnh )
Một số nhà thám hiểm đối thủ đang đột kích vào đống đổ nát để tìm kho báu, nhưng họ chỉ có thể mang theo rất nhiều tại một thời điểm và có giới hạn chịu đựng. Họ muốn có được kho báu quý giá nhất và thoát ra trước khi họ quá mệt mỏi để tiếp tục. Họ đang cố gắng trở nên giàu có nhất có thể từ các shenanigans cướp bóc của họ.
Trò chơi
Mỗi nhà thám hiểm bắt đầu trong căn phòng đầu tiên của ngục tối với 1000 điểm sức chịu đựng và 50kg không gian trong ba lô của họ.
Trò chơi vận hành theo kiểu lần lượt, với tất cả người chơi giải quyết lần lượt đồng thời. Mỗi lượt, bạn có thể thực hiện một trong các hành động sau:
- Chuyển đến phòng tiếp theo.
- Di chuyển đến phòng trước.
- Trả giá để có một kho báu.
- Thả một kho báu.
Di chuyển giữa các phòng cần 10 sức chịu đựng, cộng thêm 1 cho mỗi 5kg hiện tại trong ba lô của bạn, làm tròn lên. Chẳng hạn, một nhà thám hiểm mang 3kg kho báu cần 11 sức chịu đựng để di chuyển và một người mang 47kg cần 20 sức chịu đựng để di chuyển.
Đánh rơi kho báu cần 1 sức chịu đựng bất kể kho báu bị rơi.
Khi thoát khỏi đống đổ nát, người chơi sẽ không quay đầu nữa.
Nếu người chơi không thể thực hiện bất kỳ hành động nào trong số này (do thiếu sức chịu đựng hoặc không có kho báu), nhà thám hiểm của họ chết vì kiệt sức, làm đổ kho báu bị giữ của họ vào căn phòng hiện đang bị chiếm đóng. Tương tự, nếu người chơi cố gắng thực hiện một hành động không hợp lệ, nhà thám hiểm của họ sẽ bị giết bởi một cái bẫy thay vào đó, dẫn đến sự cố tràn kho báu tương tự.
Đấu thầu
Giá thầu tối thiểu cho một kho báu là 1 sức chịu đựng trên 1kg mà kho báu nặng. Bạn cũng có thể trả giá các điểm sức chịu đựng bổ sung để có nhiều khả năng có được kho báu hơn. Sức chịu đựng được trả giá được tiêu thụ bất kể kết quả là gì.
Trong trường hợp nhiều người chơi trả giá để nhận cùng một kho báu, người chơi trả giá cao nhất sẽ nhận được kho báu. Nếu có nhiều hơn một người chơi thực hiện giá thầu cao nhất, không ai trong số họ sẽ nhận được kho báu.
Điều kiện thắng
Người chơi có tổng giá trị kho báu lớn nhất là người chiến thắng. Trong trường hợp không thể có của một chiếc cà vạt, cà vạt sẽ có tổng trọng lượng nhỏ nhất, sau đó là số lượng báu vật nhỏ nhất, sau đó là giá trị của kho báu quý giá nhất, thứ hai có giá trị nhất, thứ ba ... cho đến khi chiếc cà vạt bị phá vỡ. Trong trường hợp gần như không thể có sự ràng buộc tại thời điểm này, người lái xe kiểm tra nói "vặn nó" và do đó người chiến thắng được xác định tùy ý.
Trong bối cảnh của giải đấu, người chơi sẽ được xếp hạng với vị trí thứ nhất nhận được 10 điểm, vị trí thứ hai với 9 điểm, vị trí thứ ba với 8 điểm, v.v ..., với những người chơi và nhà thám hiểm đã chết không có kho báu ghi 0 điểm.
Về di tích
- Mỗi phòng ban đầu chứa từ vàbáu vật. (Trong đólà số phòng)
- Có rất nhiều phòng tùy ý, chỉ giới hạn bởi sức chịu đựng của các nhà thám hiểm và sẵn sàng khám phá.
- Mỗi kho báu sẽ có một giá trị tiền tệ (tính bằng $) và trọng lượng (tính theo kg).
- Kho báu có xu hướng có giá trị và phong phú hơn khi bạn đi sâu hơn vào đống đổ nát.
- Các công thức cụ thể để tạo kho báu như sau: (sử dụng ký hiệu cho cuộn súc sắc)
- Trọng lượng được tạo ra đầu tiên bằng cách sử dụng công thức (tối thiểu là 1)
- Giá trị kho báu sau đó được tạo thông qua (trong đó là số phòng và là trọng lượng)
Thông tin hiển thị cho người chơi
Ở mỗi lượt, người chơi nhận được thông tin sau:
- Số lượng phòng họ hiện đang ở. Đây là 1 chỉ mục, vì vậy về mặt khái niệm lối ra là "phòng 0"
- Một danh sách các kho báu hiện đang ở trong phòng
- Một danh sách những người chơi khác hiện đang ở trong phòng.
- Kho báu vật hiện tại của bạn
- Mức độ sức chịu đựng hiện tại của bạn
Mã hóa
Trình điều khiển thử nghiệm có thể được tìm thấy ở đây .
Bạn nên triển khai một lớp con của Adventurer
lớp này :
class Adventurer:
def __init__(self, name, random):
self.name = name
self.random = random
def get_action(self, state):
raise NotImplementedError()
def enter_ruins(self):
pass
Bạn chỉ cần ghi đè get_action
phương thức. enter_ruins
được chạy trước khi trò chơi bắt đầu và là cơ hội để bạn chuẩn bị bất cứ điều gì bạn muốn để sẵn sàng cho trò chơi. Bạn không cần ghi đè __init__
, và bạn thực sự không nên . Nếu bạn __init__
gặp sự cố, bạn sẽ bị loại.
get_action
nhận được một đối số duy nhất là namedtuple
với các trường sau (theo thứ tự này, nếu bạn muốn hủy bỏ):
room
: số phòng bạn hiện đang ởtreasures
: danh sách các báu vật trong phòngplayers
: danh sách những người chơi khác trong phòng. Bạn chỉ nhận được tên người chơi theo cách này, vì vậy bạn không biết bot nào đang kiểm soát họ hoặc kho / sức chịu đựng của họ.inventory
: danh sách các báu vật trong ba lô của bạnstamina
: mức độ sức chịu đựng hiện tại của bạn
Đối tượng này cũng cung cấp hai thuộc tính tiện ích:
carry_weight
: tổng trọng lượng của tất cả các báu vật bạn đang mangtotal_value
: tổng giá trị của tất cả các báu vật bạn đang mang
Các danh sách treasures
và inventory
chứa namedtuple
s với các thuộc tính sau:
name
: tên của kho báu (cho mục đích thẩm mỹ)value
: giá trị tiền tệ của kho báu tính bằng $.weight
: trọng lượng của kho báu tính bằng kg
get_action
sẽ trả về một trong các giá trị / mẫu sau:
'next'
hoặc'previous'
để chuyển đến phòng tiếp theo / trước'take', <treasure index>, <bid>
(vâng, như một tuple, mặc dù bất kỳ chuỗi nào cũng sẽ hoạt động về mặt kỹ thuật) để đấu giá kho báu theo chỉ số đã cho trong danh sách kho báu của phòng. Cả hai đối số nên là số nguyên. Phao sẽ được làm tròn xuống.'drop', <inventory index>
để thả kho báu mang theo được tìm thấy ở chỉ số nhất định. Chỉ số nên (tự nhiên) là một số nguyên.
Những hạn chế khác
- Bạn chỉ có thể sử dụng ví dụ ngẫu nhiên được cung cấp cho bạn trong quá trình khởi tạo cho giả danh.
- Bất cứ điều gì khác có thể giới thiệu chủ nghĩa không điều kiện hành vi đều không được phép. Mục đích ở đây là làm cho các bot hoạt động giống hệt nhau khi được cung cấp cùng một hạt giống để hỗ trợ kiểm tra các bot mới (và có khả năng xảy ra lỗi trong trình điều khiển thử nghiệm). Chỉ bức xạ vũ trụ nên gây ra bất kỳ sai lệch / không phá hủy.
- Hãy nhớ rằng mã băm được chọn ngẫu nhiên trong Python 3, vì vậy
hash
không được phép sử dụng cho mọi quyết định.dict
s vẫn ổn ngay cả khi sử dụng thứ tự lặp cho các quyết định vì đơn hàng đã được đảm bảo nhất quán kể từ Python 3.6.
- Bạn không được phá vỡ trình điều khiển kiểm tra bằng cách sử dụng
ctypes
hack hoặcinspect
stack voodoo (hoặc bất kỳ phương pháp nào khác). Có một số điều đáng sợ ấn tượng bạn có thể làm với các mô-đun. Xin đừng.- Mỗi bot được đóng hộp hợp lý thông qua các bản sao phòng thủ và tính bất biến tự nhiên của
namedtuple
s, nhưng có một số lỗ hổng / khai thác không thể so sánh được. - Các chức năng khác từ
inspect
vàctypes
có thể được sử dụng miễn là không được sử dụng để phá vỡ chức năng của bộ điều khiển. - Bất kỳ phương pháp lấy các phiên bản của các bot khác trong trò chơi hiện tại của bạn đều không được phép.
- Mỗi bot được đóng hộp hợp lý thông qua các bản sao phòng thủ và tính bất biến tự nhiên của
- Bots nên hoạt động một mình và không được phối hợp với bất kỳ bot nào khác cho bất kỳ mục đích nào. Điều này bao gồm việc tạo ra hai bot với các mục tiêu khác nhau sao cho một người hy sinh bản thân vì thành công của người kia. Khi có hơn 10 đối thủ cạnh tranh, bạn thực sự sẽ không được đảm bảo có hai bot trong cùng một trò chơi và tên nhà thám hiểm không đưa ra bất kỳ dấu hiệu nào của lớp bot, vì vậy dù sao các loại chiến lược này cũng bị hạn chế.
- Hiện tại không có hạn chế cứng về thời gian thực hiện, tuy nhiên tôi bảo lưu quyền hạn chế cứng trong tương lai nếu các giải đấu bắt đầu mất quá nhiều thời gian. Hãy hợp lý và cố gắng tiếp tục xử lý lần lượt dưới 100ms , vì tôi không lường trước được việc cần phải hạn chế dưới ngưỡng đó. (Các giải đấu sẽ diễn ra trong khoảng 2 giờ nếu tất cả các bot mất khoảng 100ms mỗi lượt.)
- Lớp bot của bạn phải được đặt tên duy nhất trong số tất cả các bài nộp.
- Bạn có thể không nhớ bất cứ điều gì giữa các trò chơi. (Tuy nhiên, bạn có thể nhớ mọi thứ giữa các lượt )
- Đừng chỉnh sửa sys.modules. Bất cứ điều gì bên ngoài các biến thể hiện nên được coi là một hằng số.
- Bạn không thể sửa đổi bất kỳ mã bot nào theo chương trình, bao gồm cả mã của bạn.
- Điều này bao gồm xóa và khôi phục mã của bạn. Điều này là để làm cho việc gỡ lỗi và các giải đấu được sắp xếp hợp lý hơn.
- Bất kỳ mã nào khiến bộ điều khiển gặp sự cố sẽ bị loại ngay lập tức. Trong khi hầu hết các trường hợp ngoại lệ sẽ bị bắt, một số có thể trượt qua và segfaults là không thể so sánh được. (Có, bạn có thể segfault trong Python nhờ
ctypes
)
Đệ trình
Để hỗ trợ trả lời cào, hãy cho biết tên bot của bạn ở đầu câu trả lời bằng một #Header1
và đảm bảo câu trả lời của bạn bao gồm ít nhất một khối mã (chỉ câu đầu tiên trong câu trả lời của bạn sẽ được sử dụng). Bạn không cần bao gồm bất kỳ nhập khẩu hoặc tài liệu nào, vì chúng sẽ được thêm vào tự động bởi bộ cạp.
Tôi sẽ nghiêng về các câu trả lời hơn với các giải thích chi tiết và dễ hiểu. Những người khác có khả năng cư xử như vậy.
Nói một cách đơn giản, câu trả lời của bạn nên được định dạng như thế này:
# Name of Bot
Optional blurb
#imports go here
class BotName(Adventurer):
#implementation
Explanation of bot algorithm, credits, etc...
(hiển thị dưới dạng)
Tên của Bot
Tùy chọn blurb
#imports go here class BotName(Adventurer): #implementation
Giải thích về thuật toán bot, tín dụng, v.v ...
Chạy trình điều khiển thử nghiệm cục bộ
Bạn sẽ cần Python 3.7+ và tôi khuyên bạn cũng nên cài đặt tabulate
qua pip. Quét trang này để gửi thêm yêu cầu lxml
và requests
. Bạn cũng nên sử dụng một thiết bị đầu cuối có hỗ trợ thoát màu ANSI để có kết quả tốt nhất. Thông tin về cách thiết lập tính năng này trong Windows 10 có thể được tìm thấy ở đây .
Thêm bot của bạn vào một tệp trong thư mục con trong cùng thư mục với ruins.py
( ruins_bots
theo mặc định) và chắc chắn để thêm from __main__ import Adventurer
vào đầu mô-đun. Điều này được thêm vào các mô-đun khi trình cạp tải xuống trình của bạn và trong khi nó chắc chắn là hack, đây là cách đơn giản nhất để đảm bảo bot của bạn có quyền truy cập đúng Adventurer
.
Tất cả các bot trong thư mục đó sẽ được tải động khi chạy, do đó không cần thay đổi gì thêm.
Giải đấu
Người chiến thắng cuối cùng sẽ được xác định trong một loạt các trò chơi với tối đa 10 bot trong mỗi trò chơi. Nếu có hơn 10 tổng số lần gửi, 10 bot hàng đầu sẽ được xác định bằng cách phân chia chúng một cách có hệ thống thành các nhóm 10 cho đến khi mỗi bot đã chơi (chính xác) 20 trò chơi. 10 bot hàng đầu sẽ được chọn từ nhóm này với điểm đặt lại và sẽ chơi trò chơi cho đến khi bot đầu tiên đạt được 50 điểm so với bot thứ hai hoặc cho đến khi 500 trò chơi được chơi.
Cho đến khi có ít nhất 10 lần gửi, các ô trống sẽ được lấp đầy bằng "Người say rượu", đi lang thang ngẫu nhiên qua đống đổ nát và lấy (và đôi khi thả) kho báu ngẫu nhiên cho đến khi hết sức chịu đựng và phải đi ra khỏi lối thoát.
Các giải đấu sẽ được tổ chức lại hàng tuần nếu có bài nộp mới. Đây là một thử thách KOTH mở không có ngày kết thúc.
Bảng xếp hạng
Từ chạy vào ngày 4 tháng 5 năm 2019 lúc 4:25 PM MDT: (2019-05-04 4:25 -6: 00)
Seed: K48XMESC
Bot Class | Score | Mean Score
--------------+---------+--------------
BountyHunter | 898 | 7.301
Scoundrel | 847 | 6.886
Accountant | 773 | 6.285
Ponderer | 730 | 5.935
Artyventurer | 707 | 5.748
PlanAhead | 698 | 5.675
Sprinter | 683 | 5.553
Accomodator | 661 | 5.374
Memorizer | 459 | 3.732
Backwards | 296 | 2.407
Cập nhật - 15 tháng 4: một vài cập nhật / làm rõ quy tắc
Cập nhật - 17 tháng 4: cấm một vài trường hợp đáng chú ý về các hành động bất chính như sửa đổi mã của các bot khác.
Cập nhật - 4 tháng 5: Bounty trao cho Sleafar vì đã tiêu diệt hoàn toàn Backwards. Xin chúc mừng!
pip
cài đặt và bật PATH
(mặc định cho các cài đặt mới hơn AFAIK) thì từ các cửa sổ, bạn có thể chạy pip install modulename
trong dấu nhắc lệnh. Đối với các trường hợp khác (mà tôi không biết), hãy truy cập pip , tìm kiếm mô-đun cần thiết và chọn một tùy chọn.