Game petualangan teks memiliki formula yang sangat bagus; ada dunia yang terdiri dari serangkaian kamar / ruang, pemain dapat bergerak di sekitar kamar-kamar ini, dan ada beberapa item di kamar. Item dapat diambil oleh pemain, diletakkan, digunakan untuk mengakses kamar lain (misalnya kunci), dan dikombinasikan dengan item lain untuk membuat item baru.
Tantangan
Tantangan Anda adalah menulis runtime petualangan teks dalam byte paling sedikit (golf code). Untuk menjaga hal-hal sederhana, yang perlu Anda lakukan adalah menampilkan nilai yang benar atau salah tergantung pada apakah serangkaian perintah tertentu akan memenangkan pertandingan atau tidak (tidak ada interaktivitas, tidak ada output yang ramah manusia, dll.)
Aturan Game
- Dunia selalu terdiri dari koridor dengan 10 kamar yang terhubung. Setiap kamar membutuhkan kunci untuk masuk, tetapi dapat keluar kapan saja tanpa kunci (jadi saya kira semacam kunci kait);
- Pemain mulai di kamar 0, dan menang jika mereka pernah memasuki kamar 9 (begitu mereka mencapai kamar 9 mereka dapat melakukan apapun yang mereka suka, termasuk pergi ke ruangan lain, dan mereka masih akan menang);
- Setiap kamar dapat berisi sejumlah item;
- Ada hingga 26 item, bernama AZ, dan tidak ada item yang akan muncul lebih dari satu kali di dunia;
- Pemain dapat mengambil item dari ruang saat ini dan menempatkannya di inventaris mereka (mereka juga dapat menjatuhkan item dari inventaris mereka ke ruang saat ini);
- Ukuran inventaris maksimum pemain adalah terbatas, dan akan diberikan rincian level;
- Di awal permainan, inventaris pemain selalu kosong;
- Tidak ada batasan untuk jumlah maksimum item dalam ruangan (meskipun batas implisit adalah 26, karena itu adalah jumlah total item);
- Item AJ adalah kunci yang dapat digunakan untuk memasuki ruangan 0-9 (yaitu pemain dapat pindah ke kamar 0 jika mereka memiliki item A, ke kamar 1 jika mereka memiliki B, dll. Perhatikan bahwa kunci tidak diperlukan untuk meninggalkan ruangan, dan pemain mulai di kamar 0, jadi kunci "A" hanya diperlukan jika pemain ingin kembali ke kamar 0);
- Item dalam inventaris pemain dapat digabungkan untuk membuat item baru (yang akan dibuat dalam inventaris pemain) - kombinasi yang diizinkan akan diberikan dengan rincian level;
- Menggabungkan item mengkonsumsi item asli (yaitu jika salah satu item adalah kunci, itu tidak akan lagi mungkin untuk menggunakan kunci itu);
- Jika pemain mencoba melakukan sesuatu yang mustahil (mis. Mengambil barang yang tidak ada di kamar saat ini / menjatuhkan barang yang tidak mereka miliki / menggabungkan barang yang tidak mereka miliki / pergi ke kamar mereka tidak memiliki kunci untuk), tidak ada yang terjadi dan mereka dapat melanjutkan;
- Pemain tidak akan pernah memberikan perintah omong kosong (misalnya pergi ke kamar 11).
Jadi game sederhana mungkin terlihat seperti ini:
v
+---+---+---+---+---+---+---+---+---+---+
| C | | J | | | | | | | |
+---+---+---+---+---+---+---+---+---+---+
| CORRIDOR |
+---------------------------------------+
Inventory capacity: 99
Kamar 0 berisi item "C" (yang merupakan kunci untuk kamar 2). Kamar 2 berisi item "J" (yang merupakan kunci untuk kamar 9). Pemain dapat memenangkan permainan dengan mengambil C, pindah ke kamar 2, mengambil J, lalu pindah ke kamar 9.
Gim yang lebih kompleks mungkin:
v
+---+---+---+---+---+---+---+---+---+---+
| C | | X |YZ | | | | | | |
+---+---+---+---+---+---+---+---+---+---+
| CORRIDOR |
+---------------------------------------+
Inventory capacity: 10
C+X => D
Y+Z => J
Sekarang pemain dapat menang dengan mengambil C, pindah ke kamar 2, mengambil X, menggabungkan C dengan X untuk membuat D, lalu pindah ke kamar 3. Mereka sekarang dapat mengambil dan menggabungkan Y dan Z untuk mendapatkan J, memungkinkan mereka untuk pergi ke kamar 9.
Masukkan format
Ada sedikit input yang harus ditangani, dan itu tugas yang cukup membosankan, sehingga format input sangat fleksibel. Anda akan mendapatkan data berikut, dan bagaimana data itu harus dikirim ke program Anda sebagian besar terserah Anda:
- Isi awal setiap kamar (daftar 0 atau lebih item untuk setiap kamar);
- Kumpulan kombinasi item yang diizinkan (masing-masing berisi 2 item input dan item outputnya - perhatikan bahwa item input tidak diurutkan);
- Ukuran inventaris maksimum (bilangan bulat, 0 <= ukuran <= 26);
- Daftar perintah yang dicoba pemain.
Perintah pemain bisa:
[P]ick up <item>
- mengambil item dari ruangan dan memasukkannya ke dalam inventaris pemain (jika ada ruang)[D]rop <item>
- menjatuhkan item dari inventaris pemain ke ruang saat ini[C]ombine <item1> <item2>
- Menggabungkan 2 item dalam inventaris pemain untuk menghasilkan item baru[G]o to <room>
- Melakukan perjalanan ke ruang yang dipilih jika pemain memiliki kunci yang diperlukan
Misalnya, format input yang saya gunakan untuk pengujian adalah argumen program sederhana:
./adventure YZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PY PZ CYZ G9
# r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 combinations inv. size commands...
# means:
# room 0 starts with items Y & Z, all other rooms start empty
# 1 combination is possible: Y+Z => J
# max inventory size is 2
# player commands are [P]ick up Y, [P]ick up Z, [C]ombine Y and Z, [G]o to room 9
# (in this example, the player wins)
Tetapi jika beberapa format lain membuatnya lebih mudah, itu bagus (misalnya karakter pembatas khusus / banyak baris / urutan berbeda / serial ke JSON / dll.)
Format output
Program Anda harus mengembalikan beberapa output yang benar jika perintah pemain menyebabkan mereka memenangkan permainan, dan beberapa output palsu sebaliknya. Ini bisa berupa pesan yang dikenali ke stdout, kode pengembalian program, atau apa pun bahasa pilihan Anda sediakan. Semua output lainnya akan diabaikan.
Uji Kasus
Script bash berikut memberikan test harness yang akan memeriksa sebagian besar situasi. Itu telah ditulis untuk menggunakan format yang dijelaskan di atas, tetapi memodifikasinya untuk menggunakan format yang berbeda hanyalah kasus menambahkan konversi dalam invoke
fungsi.
#!/bin/sh
PROG="$1";
if [[ -z "$PROG" ]]; then
echo "Usage: $0 <program-to-test>";
exit 1;
fi;
function invoke {
"$PROG" "$@"
}
RED="\033[1;31m";
GREEN="\033[1;32m";
RESET="\033[m";
FAILURES="0";
function pass {
if ! invoke "$@" >/dev/null 2>&1; then
echo "${RED}Expected pass, got fail:${RESET} $*" >&2;
(( FAILURES = "$FAILURES" + 1 ));
invoke "$@" 2>&1;
fi;
}
function fail {
if invoke "$@" >/dev/null 2>&1; then
echo "${RED}Expected fail, got pass:${RESET} $*" >&2;
(( FAILURES = "$FAILURES" + 1 ));
invoke "$@" 2>&1;
fi;
}
echo "Running tests...";
# R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 C I Cmd...
pass J '' '' '' '' '' '' '' '' '' 0 9 PJ G9;
fail '' J '' '' '' '' '' '' '' '' 0 9 PJ G9;
pass J '' '' '' '' '' '' '' '' '' 0 9 PJ PJ G9;
fail J '' '' '' '' '' '' '' '' '' 0 9 PJ;
fail J '' '' '' '' '' '' '' '' '' 0 9 G9;
pass J '' '' '' '' '' '' '' '' '' 0 9 G9 PJ G9;
pass J '' '' '' '' '' '' '' '' '' 0 1 PJ G9;
fail J '' '' '' '' '' '' '' '' '' 0 0 PJ G9;
fail J '' '' '' '' '' '' '' '' '' 0 9 PJ DJ G9;
fail J '' '' '' '' '' '' '' '' '' 0 9 PJ PJ DJ G9;
pass J '' '' '' '' '' '' '' '' '' 0 9 PJ DJ PJ G9;
pass J '' '' '' '' '' '' '' '' '' 0 9 PJ DJ PJ G9;
pass B CJ '' '' '' '' '' '' '' '' 0 2 PB G1 DB PC PJ G9;
fail B CJ '' '' '' '' '' '' '' '' 0 2 PB G1 DB PB PC PJ G9;
pass AJ '' '' '' '' '' '' '' '' '' 0 2 PA PJ G9;
pass B D '' J '' '' '' '' '' '' 0 2 PB G1 PD G3 DB PJ G9;
fail B D '' J '' '' '' '' '' '' 0 2 PB G1 PD G2 DB PJ G9;
fail B D '' J '' '' '' '' '' '' 0 2 PB G1 PD G3 PJ G9;
fail B D J C '' '' '' '' '' '' 0 2 PB G1 PD G3 PJ G9;
pass AJ '' '' '' '' '' '' '' '' '' 0 2 PA PJ G9 G0;
fail ADJ '' '' '' '' '' '' '' '' '' 0 3 PA PD PJ G3 DJ G0 PJ G9;
pass ADJ '' '' '' '' '' '' '' '' '' 0 3 PA PD PJ G3 DJ G0 G3 PJ G9;
fail ADJ '' '' '' '' '' '' '' '' '' 0 3 PA PD PJ G3 DJ G0 DD G3 PJ G9;
pass ADJ '' '' '' '' '' '' '' '' '' 0 3 PA PD PJ DD G3 DJ G0 DD G3 PJ G9;
fail ADJ '' '' '' '' '' '' '' '' '' 0 1 PA DA DA PD PJ G9;
pass ADJ '' '' '' '' '' '' '' '' '' 0 1 PA DA DA PJ G9;
fail ABCDEFGHIKLMNOPQRSTUVWXYZ J '' '' '' '' '' '' '' '' 0 26 PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PT PU PV PW PX PY PZ G9;
pass ABCDEFGHIJKLMNOPQRSTUVWXYZ '' '' '' '' '' '' '' '' '' 0 26 PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PT PU PV PW PX PY PZ G9;
fail YZJ '' '' '' '' '' '' '' '' '' 0 2 PY PZ CYZ PJ G9;
pass YZJ '' '' '' '' '' '' '' '' '' 1 YZW 2 PY PZ CYZ PJ G9;
pass YZJ '' '' '' '' '' '' '' '' '' 1 YZW 2 PY PZ CYZ PJ CWJ G9;
fail XYZJ '' '' '' '' '' '' '' '' '' 1 YZW 2 PY PZ CYZ PX PJ G9;
fail XYZJ '' '' '' '' '' '' '' '' '' 1 YZW 2 PY PZ CYZ PX DY DZ PJ G9;
pass XYZJ '' '' '' '' '' '' '' '' '' 1 YZW 2 PY PZ CYZ PX DW PJ G9;
pass YZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PY PZ CYZ G9;
fail YZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 CYZ G9;
pass YZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PY PZ CYZ CYZ G9;
fail YZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PY PZ CYZ DJ CYZ G9;
fail YZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PY PZ CYZ DJ PY PZ CYZ G9;
fail WZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PW PZ CYZ G9;
fail WZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PY PZ CYZ G9;
pass YZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PY PZ CZY G9;
pass YZ '' '' '' '' '' '' '' '' '' 1 ZYJ 2 PY PZ CYZ G9;
fail YZ '' '' '' '' '' '' '' '' '' 1 YZJ 1 PY PZ CYZ G9;
fail YZ '' '' '' '' '' '' '' '' '' 1 YZJ 1 PY PZ CYZ PY PZ CYZ G9;
fail YZ '' '' '' '' '' '' '' '' '' 1 YZJ 1 PY PZ CYZ PJ G9;
fail YZ '' '' '' '' '' '' '' '' '' 1 YZJ 1 PJ G9;
pass BW UV '' '' '' '' '' '' '' '' 3 BUR WVS RSJ 2 PB PW G1 DW PU CBU DR PW PV CVW PR CRS G9;
fail BW AUV '' '' '' '' '' '' '' '' 3 BUR WVS RSJ 2 PB G1 PU CBU DR PA PB G0 DA PW G1 PV CVW PR CRS G9;
pass BCW AUV '' '' '' '' '' '' '' '' 3 CUR WVS RSJ 2 PB PC G1 DB PU CCU DR PC PA PB G0 DA PW G1 DB PV CVW PR CRS G9;
fail BCW UV '' '' '' '' '' '' '' '' 3 CUR WVS RSJ 2 PB PC G1 DB PU CCU DR PC PA PB G0 DA PW G1 DB PV CVW PR CRS G9;
fail BCW AUV '' '' '' '' '' '' '' '' 3 CUR WVS RSJ 2 PB PC G1 DB PU CCU PA PB G0 DA PW G1 DB PV CVW PR CRS G9;
fail BCW AUV '' '' '' '' '' '' '' '' 3 CUR WVS RSJ 2 PB PC G1 DB PU CCU DR PA G0 DA PW G1 DB PV CVW PR CRS G9;
fail BCW AUV '' '' '' '' '' '' '' '' 3 CUR WVS RSJ 2 PB PC G1 DB PU CCU DR PB G0 DA PW G1 DB PV CVW PR CRS G9;
fail BCW AUV '' '' '' '' '' '' '' '' 3 CUR WVS RSJ 2 PB PC G1 DB PU CCU DR PA PB G0 DA G1 DB PV CVW PR CRS G9;
fail BCW AUV '' '' '' '' '' '' '' '' 3 CUR WVS RSJ 2 PB PC G1 DB PU CCU DR PA PB G0 DA PW G1 DB CVW PR CRS G9;
pass BFK LG M N O CDE PQR U W '' 10 BPT CQS TSH HUI IWV VFA GRX MXZ ANY YZJ 5 \
PB PF PK G1 PL PG G6 DB DK DL G5 PC PD PE G6 DF G2 PM G6 DM DC G3 PN G4 PO G6 DN DO DD DE \
PB PP CBP PC PQ CCQ CTS G7 PU CUH G8 PW CWI G6 PF CVF PR PM PN CGR CMX CAN CYZ G9
fail BFK LG M N O CDE PQR U W '' 10 BPT CQS TSH HUI IWV VFA GRX MXZ ANY YZJ 5 \
PB PF PK G1 PL PG G6 DB DK DL G5 PC PD PE G6 DF G6 DM DC G3 PN G4 PO PM G6 DN DO DD DE \
PB PP CBP PC PQ CCQ CTS G7 PU CUH G8 PW CWI G6 PF CVF PR PM PN CGR CMX CAN CYZ G9
if (( "$FAILURES" == "0" )); then
echo "${GREEN}All tests passed${RESET}";
else
echo "${RED}Total failures: $FAILURES${RESET}";
fi;
Kemenangan
Golf kode standar: kode terpendek (dalam byte) menang. Entri harus mengikuti aturan permainan, yang dalam praktiknya berarti mereka harus lulus semua uji kasus (lebih banyak tes dapat ditambahkan jika perlu).