Trong thử thách này, bạn phải thiết kế một loài sinh vật đơn bào để chiến đấu đến chết trong đấu trường đĩa petri. Đấu trường được biểu diễn dưới dạng lưới hình chữ nhật, trong đó mỗi ô chiếm một khoảng trống:
.....x....
...x...o..
...x.c..o.
.......o..
Thuộc tính
Mỗi ô có ba thuộc tính. Khi chỉ định loài tế bào của bạn khi bắt đầu trò chơi, bạn phân bổ 12 điểm trong số các thuộc tính này.
- Điểm nhấn (HP): Nếu HP của tế bào rơi về 0, nó sẽ chết. Các tế bào mới có HP đầy đủ.
- Khi một tế bào chết, nó để lại một xác chết có thể bị các tế bào khác ăn để lấy năng lượng.
- Một ô không thể lấy lại được lượng HP đã mất, nhưng nó có thể tạo ra một ô mới với toàn bộ HP bằng cách chia.
- Năng lượng : Hầu hết các hành động mà một tế bào có thể cần đến năng lượng. Bằng cách tích cực nghỉ ngơi, một tế bào có thể lấy lại năng lượng đã mất đến mức tối đa của loài đó.
- Một loài tế bào có ít hơn 5 năng lượng có khả năng thất bại, vì nó không thể phân chia để tạo ra các tế bào mới.
- Một tế bào không thể lấy lại năng lượng vượt quá giá trị tối đa của loài.
- Một ô mới được tạo có giá trị năng lượng ban đầu được sao chép từ cha mẹ của nó (và giá trị tối đa được quy định bởi đặc tả loài của nó).
- Độ axit : Nếu một tế bào chọn phát nổ, mức độ axit của tế bào được sử dụng để tính toán thiệt hại cho các tế bào lân cận.
Hành động
Mỗi lượt, mỗi ô có thể thực hiện một hành động:
Di chuyển: Tế bào di chuyển một không gian theo bất kỳ hướng nào (N / S / E / W / NE / NW / SE / SW) với chi phí 1 năng lượng.
- Một tế bào không thể di chuyển lên một không gian bị chiếm bởi một tế bào sống khác.
- Một tế bào không thể di chuyển ra khỏi lưới điện.
- Di chuyển lên một xác chết tế bào phá hủy xác chết.
Tấn công: Một tế bào tấn công một tế bào liền kề, gây sát thương từ 1 đến 3, bằng cách tăng 1 đến 3 điểm năng lượng.
- Một tế bào có thể tấn công theo bất kỳ hướng nào (N / S / E / W / NE / NW / SE / SW).
- Nó là hợp pháp để tấn công các tế bào thân thiện.
Phân chia: Tế bào phân chia và tạo ra một tế bào mới trên một không gian liền kề, với chi phí là 5 năng lượng.
- Một ô có thể phân chia theo bất kỳ hướng nào (N / S / E / W / NE / NW / SE / SW).
- Các tế bào mới có đầy đủ HP theo đặc điểm kỹ thuật ban đầu của bạn.
- Tế bào mới có nhiều năng lượng như tế bào mẹ của nó sau khi trừ chi phí phân chia. (Ví dụ, một tế bào cha mẹ có 8 điểm năng lượng ban đầu sẽ bị giảm xuống còn 3 năng lượng và tạo ra một tế bào con có 3 năng lượng).
- Một tế bào mới không thể hoạt động cho đến lượt tiếp theo của bạn.
- Một tế bào không thể phân chia thành một không gian bị chiếm giữ bởi một tế bào sống, nhưng nó có thể phân chia thành một không gian bị chiếm giữ bởi một xác chết tế bào (điều này phá hủy xác chết).
Ăn: Một tế bào ăn một xác chết tế bào liền kề, thu được 4 năng lượng.
- Một tế bào có thể ăn theo bất kỳ hướng nào (N / S / E / W / NE / NW / SE / SW).
Nghỉ ngơi: Một tế bào không làm gì trong một lượt, lấy lại 2 năng lượng.
Phát nổ: Khi một ô có 3 hoặc ít HP hơn và nhiều năng lượng hơn HP, nó có thể chọn phát nổ, gây sát thương cho cả tám ô liền kề.
- Thiệt hại cho mỗi ô liền kề là
(exploding cell HP) + (explodng cell acidity)
- Một tế bào phát nổ sẽ chết và để lại một xác chết, cũng như bất kỳ tế bào nào bị giết trong vụ nổ.
- Thiệt hại cho mỗi ô liền kề là
Giao thức
Thiết lập
Chương trình của bạn sẽ chạy với chuỗi BEGIN
được cung cấp trên stdin. Chương trình của bạn phải viết ra một danh sách gồm 3 số nguyên không âm, đại diện cho HP, năng lượng và tính axit cho các loại tế bào của bạn: ví dụ : 5 6 1
. Các số phải tổng bằng 12. Tính axit có thể 0
, nếu bạn muốn. (Các thuộc tính khác cũng có thể bằng 0, nhưng làm như vậy có chức năng làm mất trò chơi!)
Bạn bắt đầu với một ô, ở góc tây bắc hoặc đông nam, một khoảng cách từ hai cạnh. Các tế bào bắt đầu có đầy đủ HP và năng lượng.
Mọi tế bào hoạt động
Mỗi lượt, chương trình của bạn sẽ được gọi một lần cho mỗi ô còn sống trong nhóm của bạn (ngoại trừ các ô vừa tạo lần lượt này) để ô có thể hoạt động. Chương trình của bạn được cung cấp dữ liệu về stdin bao gồm trạng thái đĩa petri và thông tin về ô cụ thể này:
10 4
..........
..xx.c....
...c...o..
......o...
6 3 5 7
Hai số đầu tiên cho biết chiều rộng và chiều cao của đấu trường: ở đây, có một đấu trường 10 nhân 4.
- Các
o
tế bào là của bạn; cácx
tế bào là kẻ thù của bạn. (Điều này luôn đúng; mỗi người chơi luôn nhìn thấy các ô của riêng mìnho
.) - Các
.
không gian trống rỗng. - Các
c
không gian đại diện cho xác chết tế bào ăn được.
Các số sau dòng trống biểu thị thông tin về ô này:
- Hai số đầu tiên là
x,y
tọa độ, được lập chỉ mục từ0,0
phía trên bên trái (vì vậy6 3
ở đây đề cập đến ô phía nam nhấto
). - Số thứ ba là HP của tế bào; số thứ tư là năng lượng của tế bào.
Chương trình của bạn sẽ xuất ra (để xuất chuẩn) một hành động. Trong các ví dụ dưới đây, chúng tôi sẽ sử dụng N
làm hướng dẫn ví dụ, nhưng nó có thể là bất kỳ hướng hợp pháp nào cho hành động đó ( N
/ S
/ E
/ W
/ NE
/ NW
/ SE
/ SW
). Tất cả đầu ra chương trình không phân biệt chữ hoa chữ thường, nhưng các ví dụ sẽ sử dụng chữ hoa. Bất kỳ hành động đầu ra nào không hợp lệ (vì nó có cú pháp không hợp lệ hoặc cố gắng thực hiện một hành động bất hợp pháp) sẽ bị bỏ qua và dẫn đến việc nhập tế bào REST
(và do đó thu được 2 năng lượng).
MOVE N
DIVIDE N
EAT N
ATTACK N 2
- con số thể hiện sức mạnh của cuộc tấn công (1 - 3)REST
EXPLODE
Lượt của nhóm của bạn bao gồm tất cả các tế bào của bạn sẽ có cơ hội hành động, từng cái một. Tất cả các tế bào của bạn hoạt động trước khi bất kỳ tế bào của đối thủ hành động. Khi tất cả các tế bào của bạn hoạt động, lượt của bạn kết thúc và lượt của đối thủ bắt đầu. Khi tất cả các tế bào của đối thủ hành động, lượt của bạn bắt đầu lại. Trong lượt của bạn, mỗi ô được ưu tiên hành động dựa trên tuổi của nó: các ô cũ nhất trong nhóm của bạn hoạt động trước tiên trước các ô trẻ hơn.
Thí dụ
Đây là cách một chương trình có thể hoạt động. Đầu vào từ stdin được ký hiệu ở đây với các >
mũi tên hàng đầu (được phân tách khỏi đầu vào thực tế bằng một khoảng trắng làm rõ) và đầu ra trên thiết bị xuất chuẩn có <
mũi tên.
> BEGIN
< 5 6 1
Sau đó, chương trình được gọi lại:
> 10 4
> ..........
> .o........
> ........x.
> ..........
>
> 1 1 5 6
< DIVIDE SE
Sau lượt của đối thủ (người quyết định DIVIDE W
với một ô bắt đầu), chương trình của bạn được gọi hai lần, một lần cho mỗi ô:
> 10 4
> ..........
> .o........
> ..o....xx.
> ..........
>
> 1 1 5 1
< MOVE E
Đối với lời mời thứ hai trong lượt của bạn:
> 10 4
> ..........
> ..o.......
> ..o....xx.
> ..........
>
> 2 2 5 1
< MOVE SE
Lưu ý ô thứ hai này sẽ thấy trạng thái bảng cập nhật dựa trên chuyển động của ô khác trước đó trong lượt của bạn. Cũng lưu ý rằng tế bào này đã được tạo ra với 1 năng lượng, bởi vì tế bào mẹ có 6 năng lượng khi nó thực hiện phân chia lần cuối (vì vậy, 6 gốc, trừ chi phí phân chia 5 năng lượng, tạo ra một tế bào con có 1 năng lượng).
Bây giờ lượt của bạn đã kết thúc và lượt của đối thủ của bạn bắt đầu. Hai ô đối diện sẽ có cơ hội hành động, và sau đó lượt tiếp theo của bạn bắt đầu.
Chiến thắng
Bạn có thể giành chiến thắng bằng một trong hai cách:
- Phá hủy tất cả các tế bào đối lập, hoặc
- Có nhiều ô hơn đối thủ của bạn sau mỗi người chơi đã hoàn thành 150 lượt
Ghi điểm sẽ dựa trên số trận thắng trong 100 trận đấu với nhau. Trong một nửa số mô phỏng, chương trình của bạn sẽ được phép đi trước.
Các trò chơi tie (nghĩa là chính xác cùng số lượng ô sau 150 lượt hoặc các ô duy nhất còn lại bị giết trong một vụ nổ) không được tính vào tổng số chiến thắng của một trong hai người chơi.
Thông tin khác
- Chương trình của bạn không nên cố gắng duy trì trạng thái (ngoài việc sử dụng trạng thái của đĩa Petri): các sinh vật đơn bào không có bộ nhớ rất tốt và phản ứng với thế giới từng khoảnh khắc. Cụ thể, ghi vào một tệp (hoặc lưu trữ dữ liệu khác), giao tiếp với máy chủ từ xa hoặc cài đặt các biến môi trường không được phép rõ ràng.
- Đệ trình sẽ được chạy / biên dịch trên Ubuntu 12.04.4.
- Các chi tiết cụ thể của 100 trò chơi ghi điểm chưa được xác nhận, nhưng chúng có thể sẽ liên quan đến nhiều kích cỡ đấu trường (ví dụ: 50 chạy trên một đấu trường nhỏ và 50 chạy trên một đấu trường lớn hơn). Đối với một đấu trường lớn hơn, tôi có thể tăng số lượt quay tối đa để đảm bảo rằng một trận chiến thích hợp có thể diễn ra.
Tài nguyên
Đây là mã trình điều khiển chạy mô phỏng, được viết cho Node.js, được gọi bởi node petri.js 'first program' 'second program'
. Ví dụ, việc đặt một ô được viết bằng Python lên một ô được viết bằng Java có thể trông như thế node petri.js 'python some_cell.py' 'java SomeCellClass'
.
Ngoài ra, tôi hiểu rằng đọc và phân tích nhiều dòng trên stdin có thể là một nỗi đau rất lớn, vì vậy tôi đã phác thảo một vài ô mẫu hoàn chỉnh bằng các ngôn ngữ khác nhau mà bạn có thể tự do xây dựng, đại tu hoàn toàn hoặc bỏ qua hoàn toàn.
- Tế bào Java
- Tế bào Python
- Ô JavaScript (để sử dụng với Node.js)
Tất nhiên bạn có thể tự do viết một tế bào bằng một ngôn ngữ khác; đây chỉ đơn giản là ba ngôn ngữ tôi quyết định viết mã soạn sẵn để hỗ trợ tiết kiệm thời gian.
Nếu bạn có bất kỳ vấn đề nào khi chạy trình điều khiển, vui lòng ping tôi trong phòng trò chuyện tôi đã tạo cho thử thách này . Nếu bạn không có đủ danh tiếng để trò chuyện, thì hãy để lại nhận xét.
'node c:/cell/cell_template.js'
đối với từng đối số, giống như bạn cần chỉ định'java CellTemplate'
cho mã Java. Tôi sẽ làm cho nó rõ ràng hơn trong văn bản thách thức. Nếu bạn vẫn gặp sự cố, chúng tôi (và bất kỳ ai khác có vấn đề về kỹ thuật) có thể tiếp tục cuộc thảo luận này trong phòng trò chuyện tôi vừa thực hiện .