टेक्स्ट एडवेंचर गेम्स में एक सुंदर सेट फॉर्मूला है; कमरों / स्थानों की एक श्रृंखला से बना एक दुनिया है, खिलाड़ी इन कमरों के चारों ओर घूम सकता है, और कमरों में कुछ आइटम हैं। आइटम खिलाड़ी द्वारा उठाए जा सकते हैं, नीचे रख सकते हैं, अन्य कमरों (जैसे चाबियाँ) का उपयोग करने के लिए उपयोग किया जाता है, और नई वस्तुओं को बनाने के लिए अन्य मदों के साथ संयुक्त किया जाता है।
चुनौती
आपकी चुनौती सबसे कम बाइट्स (कोड गोल्फ) में एक टेक्स्ट एडवेंचर रनटाइम लिखना है। चीजों को सरल रखने के लिए, आपको बस इतना करने की ज़रूरत है कि आउटपुट एक सत्य या गलत मूल्य है, इस पर निर्भर करता है कि दिए गए आदेशों की श्रृंखला किसी दिए गए गेम को जीतेगी या नहीं (कोई अन्तरक्रियाशीलता, कोई मानव अनुकूल आउटपुट, आदि)
खेल के नियमों
- दुनिया हमेशा एक कॉरिडोर से बनी है जिसमें 10 जुड़े हुए कमरे हैं। प्रत्येक कमरे में प्रवेश करने के लिए एक कुंजी की आवश्यकता होती है, लेकिन बिना चाबी के किसी भी समय बाहर निकाला जा सकता है (इसलिए यह किसी प्रकार का कुंडी ताला है जिसका मुझे अनुमान है);
- खिलाड़ी कमरा 0 में शुरू होता है, और जीतता है यदि वे कभी भी कक्ष 9 में प्रवेश करते हैं (एक बार जब वे कमरे 9 पर पहुंचते हैं तो वे जो चाहें वे कर सकते हैं, जिसमें दूसरे कमरे में जाते हैं, और वे अभी भी जीते होंगे);
- प्रत्येक कमरे में किसी भी संख्या में आइटम हो सकते हैं;
- AZ तक 26 आइटम हैं, और कोई भी आइटम दुनिया में एक से अधिक बार दिखाई नहीं देगा;
- खिलाड़ी वर्तमान कमरे से आइटम उठा सकता है और उन्हें अपनी सूची में रख सकता है (वे अपनी सूची से आइटम को वर्तमान कमरे में भी छोड़ सकते हैं);
- खिलाड़ी का अधिकतम इन्वेंट्री आकार परिमित है, और स्तर के विवरण के साथ प्रदान किया जाएगा;
- खेल की शुरुआत में, खिलाड़ी की इन्वेंट्री हमेशा खाली होती है;
- एक कमरे में वस्तुओं की अधिकतम संख्या की कोई सीमा नहीं है (हालांकि निहित सीमा 26 होगी, क्योंकि यह आइटम की कुल संख्या है);
- आइटम एजे ऐसी चाबियां हैं जिनका उपयोग कमरे में प्रवेश करने के लिए किया जा सकता है 0-9 (यानी खिलाड़ी कमरे में स्थानांतरित हो सकता है यदि उनके पास आइटम ए है, तो कमरे 1 में अगर उनके पास बी है, आदि ध्यान दें कि कमरे को छोड़ने के लिए चाबियों की आवश्यकता नहीं है , आदि) और खिलाड़ी कमरे 0 में शुरू होता है, इसलिए कुंजी "ए" केवल तभी आवश्यक है जब खिलाड़ी कमरे में वापस लौटना चाहता है );
- खिलाड़ी की इन्वेंट्री में आइटमों को नए आइटम बनाने के लिए जोड़ा जा सकता है (जो खिलाड़ी की इन्वेंट्री में बनाया जाएगा) - अनुमत संयोजनों को स्तर के विवरण के साथ प्रदान किया जाएगा;
- वस्तुओं के संयोजन से मूल वस्तुओं की खपत होती है (अर्थात यदि कोई वस्तु एक कुंजी थी, तो उस कुंजी का उपयोग करना संभव नहीं होगा);
- यदि खिलाड़ी कुछ असंभव करने की कोशिश करता है (उदाहरण के लिए एक आइटम उठाता है जो वर्तमान कमरे में नहीं है / ऐसा आइटम नहीं है जो उनके पास नहीं है / उन आइटमों को मिलाएं जो उनके पास नहीं हैं / एक कमरे में जाएं जहां उनके पास कुंजी नहीं है के लिए), कुछ भी नहीं होता है और वे जारी रख सकते हैं;
- खिलाड़ी कभी भी एक बकवास आदेश नहीं देगा (उदाहरण के लिए कमरे 11 पर जाएं)।
तो एक साधारण खेल इस तरह लग सकता है:
v
+---+---+---+---+---+---+---+---+---+---+
| C | | J | | | | | | | |
+---+---+---+---+---+---+---+---+---+---+
| CORRIDOR |
+---------------------------------------+
Inventory capacity: 99
कक्ष 0 में आइटम "C" है (जो कि कक्ष 2 की कुंजी है)। कक्ष 2 में आइटम "जे" (जो कमरे 9 की कुंजी है) शामिल है। खिलाड़ी सी उठाकर, कमरा 2 में जाकर, जे उठाकर, फिर कमरे 9 में जाकर खेल जीत सकता है।
एक अधिक जटिल खेल हो सकता है:
v
+---+---+---+---+---+---+---+---+---+---+
| C | | X |YZ | | | | | | |
+---+---+---+---+---+---+---+---+---+---+
| CORRIDOR |
+---------------------------------------+
Inventory capacity: 10
C+X => D
Y+Z => J
अब खिलाड़ी C उठाकर, कमरे 2 में जा सकता है, X उठा सकता है, X उठा सकता है, C को X के साथ जोड़कर D बना सकता है, फिर कमरे 3 में जा सकता है। अब वे J को पाने के लिए Y और Z को जोड़ सकते हैं, जिससे उन्हें अनुमति मिलती है। कमरे में जाओ ९।
इनपुट प्रारूप
संभाल करने के लिए इनपुट का एक उचित बिट है, और यह एक बहुत उबाऊ काम है, इसलिए इनपुट प्रारूप बहुत लचीला है। आपको निम्न डेटा मिलेगा, और इसे आपके कार्यक्रम में कैसे भेजा जाना चाहिए, यह काफी हद तक आपके लिए है:
- प्रत्येक कमरे की प्रारंभिक सामग्री (प्रत्येक कमरे के लिए 0 या अधिक वस्तुओं की सूची);
- अनुमत आइटम संयोजनों का संग्रह (प्रत्येक में 2 इनपुट आइटम और उनके आउटपुट आइटम शामिल हैं - ध्यान दें कि इनपुट आइटम अनियंत्रित हैं);
- अधिकतम इन्वेंट्री आकार (पूर्णांक, 0 <= आकार <= 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)
लेकिन अगर कुछ अन्य प्रारूप इसे आसान बनाते हैं, तो यह ठीक है (उदाहरण के लिए विशेष सीमांकक वर्ण / कई पंक्तियाँ / अलग-अलग क्रमबद्धता / JK / आदि के लिए क्रमबद्ध)।
आउटपुट स्वरूप
यदि खिलाड़ी के आदेशों से उन्हें गेम जीतने में कठिनाई होती है, और कुछ लड़खड़ाता है, तो आपके प्रोग्राम को कुछ सच्चा आउटपुट वापस करना चाहिए। यह स्टैडआउट, प्रोग्राम रिटर्न कोड, या आपकी पसंद की भाषा जो भी प्रदान करता है, एक पहचानने योग्य संदेश हो सकता है। अन्य सभी आउटपुट को नजरअंदाज कर दिया जाएगा।
परीक्षण के मामलों
निम्नलिखित बैश स्क्रिप्ट एक परीक्षण हार्नेस प्रदान करता है जो अधिकांश स्थितियों की जांच करेगा। यह ऊपर वर्णित प्रारूप का उपयोग करने के लिए लिखा गया है, लेकिन एक अलग प्रारूप का उपयोग करने के लिए इसे संशोधित करना 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;
जीतना
मानक कोड गोल्फ: सबसे छोटा कोड (बाइट्स में) जीतता है। प्रविष्टियों को खेल के नियमों का पालन करना चाहिए, जिसका अर्थ है कि उन्हें सभी परीक्षण मामलों को पास करना होगा (यदि आवश्यक हो तो अधिक परीक्षण जोड़े जा सकते हैं)।