เกมผจญภัยข้อความมีสูตรที่ค่อนข้างจะสวยงาม มีโลกที่ประกอบไปด้วยห้อง / พื้นที่หลายชุดผู้เล่นสามารถเดินไปรอบ ๆ ห้องเหล่านี้และมีบางรายการในห้อง ผู้เล่นสามารถหยิบไอเท็มวางลงใช้เพื่อเข้าห้องอื่น (เช่นกุญแจ) และรวมกับไอเท็มอื่น ๆ เพื่อสร้างไอเท็มใหม่
ท้าทาย
ความท้าทายของคุณคือการเขียนรันไทม์การผจญภัยข้อความในไบต์ที่น้อยที่สุด (รหัสกอล์ฟ) เพื่อให้ทุกอย่างง่ายขึ้นสิ่งที่คุณต้องทำก็คือเอาท์พุทค่าความจริงหรือความเท็จขึ้นอยู่กับว่าชุดคำสั่งที่กำหนดจะชนะเกมที่กำหนดหรือไม่ (ไม่มีการโต้ตอบไม่มีเอาต์พุตที่เป็นมิตรต่อมนุษย์ ฯลฯ )
กฎของเกม
- โลกนี้ประกอบด้วยทางเดินที่เชื่อมต่อกัน 10 ห้อง แต่ละห้องต้องใช้กุญแจเพื่อป้อน แต่สามารถออกได้ตลอดเวลาโดยไม่ต้องใช้กุญแจ (ดังนั้นมันจึงเป็นกลอนที่ฉันเดา)
- ผู้เล่นเริ่มต้นในห้อง 0 และชนะถ้าพวกเขาเข้าห้อง 9 (เมื่อพวกเขามาถึงห้องที่ 9 พวกเขาสามารถทำสิ่งที่พวกเขาต้องการรวมถึงไปที่ห้องอื่นและพวกเขาจะยังคงชนะ);
- แต่ละห้องสามารถมีจำนวนรายการ
- มีมากถึง 26 รายการชื่อ AZ และไม่มีรายการใดปรากฏในโลกมากกว่าหนึ่งครั้ง
- ผู้เล่นสามารถเลือกรายการจากห้องปัจจุบันและวางไว้ในสินค้าคงคลัง (พวกเขายังสามารถวางรายการจากสินค้าคงคลังของพวกเขาเข้าไปในห้องปัจจุบัน);
- ขนาดสินค้าคงคลังสูงสุดของผู้เล่นมี จำกัด และจะได้รับพร้อมรายละเอียดระดับ
- ในตอนต้นของเกมคลังของผู้เล่นจะว่างเสมอ
- ไม่มีการ จำกัด จำนวนรายการสูงสุดในห้อง (แม้ว่าข้อ จำกัด โดยนัยจะเป็น 26 เนื่องจากเป็นจำนวนรายการทั้งหมด)
- รายการ AJ คือกุญแจที่สามารถใช้เพื่อเข้าสู่ห้อง 0-9 (เช่นผู้เล่นสามารถย้ายไปที่ห้อง 0 หากพวกเขามีรายการ A, ไปที่ห้อง 1 หากพวกเขามี B เป็นต้น) โปรดทราบว่าไม่ต้องใช้กุญแจในการออกจากห้อง และผู้เล่นเริ่มต้นในห้อง 0 ดังนั้นคีย์ "A" จำเป็นเฉพาะเมื่อผู้เล่นต้องการกลับไปที่ห้อง 0);
- รายการในสินค้าคงคลังของผู้เล่นสามารถรวมกันเพื่อสร้างรายการใหม่ (ซึ่งจะถูกสร้างขึ้นในสินค้าคงคลังของผู้เล่น) - ชุดค่าผสมที่อนุญาตจะได้รับพร้อมกับรายละเอียดระดับ
- การรวมไอเท็มจะใช้ไอเท็มดั้งเดิม (เช่นถ้าหนึ่งในไอเท็มเป็นคีย์จะไม่สามารถใช้คีย์นั้นได้อีกต่อไป)
- หากผู้เล่นพยายามที่จะทำสิ่งที่เป็นไปไม่ได้ (เช่นหยิบรายการที่ไม่ได้อยู่ในห้องปัจจุบัน / วางรายการพวกเขาไม่มี / รวมรายการพวกเขาไม่ได้ / ไปที่ห้องพวกเขาไม่มีกุญแจ สำหรับ) ไม่มีอะไรเกิดขึ้นและพวกเขาสามารถดำเนินการต่อไป;
- ผู้เล่นจะไม่ให้คำสั่งเรื่องไร้สาระ (เช่นไปที่ห้อง 11)
ดังนั้นเกมง่ายๆอาจมีลักษณะเช่นนี้:
v
+---+---+---+---+---+---+---+---+---+---+
| C | | J | | | | | | | |
+---+---+---+---+---+---+---+---+---+---+
| CORRIDOR |
+---------------------------------------+
Inventory capacity: 99
ห้อง 0 มีรายการ "C" (ซึ่งเป็นกุญแจสู่ห้องที่ 2) ห้องที่ 2 มีรายการ "J" (ซึ่งเป็นกุญแจสู่ห้องที่ 9) ผู้เล่นสามารถชนะเกมได้โดยยกขึ้น C ย้ายไปที่ห้อง 2 ยกขึ้น J จากนั้นย้ายไปที่ห้อง 9
เกมที่ซับซ้อนมากขึ้นอาจเป็น:
v
+---+---+---+---+---+---+---+---+---+---+
| C | | X |YZ | | | | | | |
+---+---+---+---+---+---+---+---+---+---+
| CORRIDOR |
+---------------------------------------+
Inventory capacity: 10
C+X => D
Y+Z => J
ตอนนี้ผู้เล่นสามารถชนะได้โดยยกขึ้น C ย้ายไปที่ห้อง 2 ยกขึ้น X รวม C กับ X เพื่อสร้าง D จากนั้นย้ายไปที่ห้อง 3 ตอนนี้พวกเขาสามารถรับและรวม Y และ Z เพื่อรับ J ช่วยให้พวกเขา ไปที่ห้อง 9
รูปแบบอินพุต
มีการป้อนข้อมูลที่ค่อนข้างยุติธรรมในการจัดการและเป็นงานที่ค่อนข้างน่าเบื่อดังนั้นรูปแบบการป้อนข้อมูลจึงมีความยืดหยุ่นมาก คุณจะได้รับข้อมูลต่อไปนี้และวิธีการส่งไปยังโปรแกรมของคุณนั้นขึ้นอยู่กับคุณเป็นส่วนใหญ่:
- เนื้อหาเริ่มต้นของแต่ละห้อง (รายการ 0 หรือมากกว่ารายการสำหรับแต่ละห้อง);
- คอลเลกชันของการรวมกันของรายการที่ได้รับอนุญาต (แต่ละคนมี 2 รายการที่เข้าและรายการออกของพวกเขา - โปรดทราบว่ารายการที่ไม่ได้เรียงลำดับ)
- ขนาดสินค้าคงคลังสูงสุด (จำนวนเต็ม, 0 <= size <= 26);
- รายการคำสั่งที่ผู้เล่นพยายาม
คำสั่งของผู้เล่นสามารถ:
[P]ick up <item>
- หยิบไอเท็มจากห้องและวางลงในสินค้าคงคลังของผู้เล่น (ถ้ามีที่ว่าง)[D]rop <item>
- วางรายการจากคลังของผู้เล่นลงในห้องปัจจุบัน[C]ombine <item1> <item2>
- รวม 2 รายการในสินค้าคงคลังของผู้เล่นเพื่อสร้างรายการใหม่[G]o to <room>
- เดินทางไปยังห้องที่เลือกหากผู้เล่นมีรหัสที่จำเป็น
ตัวอย่างเช่นรูปแบบอินพุตที่ฉันใช้สำหรับการทดสอบเป็นข้อโต้แย้งของโปรแกรมอย่างง่าย:
./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)
แต่ถ้ารูปแบบอื่นทำให้ง่ายขึ้นนั่นก็ใช้ได้ (เช่นอักขระตัวคั่นพิเศษ / หลายบรรทัด / การเรียงลำดับที่แตกต่างกัน / เรียงลำดับเป็น JSON / เป็นต้น)
รูปแบบผลลัพธ์
โปรแกรมของคุณควรคืนค่าเอาต์พุตที่เป็นจริงหากคำสั่งของผู้เล่นทำให้พวกเขาชนะเกมและเอาท์พุทที่ผิดพลาดบางอย่าง นี่อาจเป็นข้อความที่รู้จักได้สำหรับ stdout, โค้ดส่งคืนของโปรแกรมหรือภาษาที่คุณเลือกให้ เอาต์พุตอื่นทั้งหมดจะถูกละเว้น
กรณีทดสอบ
สคริปต์ทุบตีต่อไปนี้มีสายรัดทดสอบซึ่งจะตรวจสอบสถานการณ์ส่วนใหญ่ มันถูกเขียนขึ้นเพื่อใช้รูปแบบที่อธิบายไว้ข้างต้น แต่การแก้ไขเพื่อใช้รูปแบบที่แตกต่างกันเป็นเพียงกรณีของการเพิ่มการแปลงในinvoke
ฟังก์ชั่น
#!/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;
การชนะ
รหัสกอล์ฟมาตรฐาน: รหัสที่สั้นที่สุด (เป็นไบต์) ชนะ ผลงานต้องเป็นไปตามกฎของเกมซึ่งในทางปฏิบัติหมายความว่าพวกเขาจะต้องผ่านทุกกรณีทดสอบ (อาจมีการทดสอบเพิ่มเติมหากจำเป็น)