एक छोटा सा रोमांच


14

टेक्स्ट एडवेंचर गेम्स में एक सुंदर सेट फॉर्मूला है; कमरों / स्थानों की एक श्रृंखला से बना एक दुनिया है, खिलाड़ी इन कमरों के चारों ओर घूम सकता है, और कमरों में कुछ आइटम हैं। आइटम खिलाड़ी द्वारा उठाए जा सकते हैं, नीचे रख सकते हैं, अन्य कमरों (जैसे चाबियाँ) का उपयोग करने के लिए उपयोग किया जाता है, और नई वस्तुओं को बनाने के लिए अन्य मदों के साथ संयुक्त किया जाता है।

चुनौती

आपकी चुनौती सबसे कम बाइट्स (कोड गोल्फ) में एक टेक्स्ट एडवेंचर रनटाइम लिखना है। चीजों को सरल रखने के लिए, आपको बस इतना करने की ज़रूरत है कि आउटपुट एक सत्य या गलत मूल्य है, इस पर निर्भर करता है कि दिए गए आदेशों की श्रृंखला किसी दिए गए गेम को जीतेगी या नहीं (कोई अन्तरक्रियाशीलता, कोई मानव अनुकूल आउटपुट, आदि)

खेल के नियमों

  • दुनिया हमेशा एक कॉरिडोर से बनी है जिसमें 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;

जीतना

मानक कोड गोल्फ: सबसे छोटा कोड (बाइट्स में) जीतता है। प्रविष्टियों को खेल के नियमों का पालन करना चाहिए, जिसका अर्थ है कि उन्हें सभी परीक्षण मामलों को पास करना होगा (यदि आवश्यक हो तो अधिक परीक्षण जोड़े जा सकते हैं)।


आप मुझ पर विश्वास नहीं कर सकते हैं, लेकिन मैंने एक चुनौती के बारे में सोचा, जो कुछ दिन पहले की ही बात है ...
Acrolith

मुझे यह चुनौती पसंद है। हालाँकि, मैं निश्चित रूप से आपके परीक्षण स्क्रिप्ट के बाहर परीक्षण मामलों को शामिल करूंगा ।
नाथन मेरिल

@NathanMerrill कर सकते हैं, आप किस प्रारूप को पसंद करेंगे? (स्क्रिप्ट के अंदर परीक्षण के मामले पहले से ही पार्स करने के लिए काफी आसान हैं, इसलिए मुझे यकीन नहीं था कि एक ही लाइन को दोहराए बिना टेस्ट टेबल बनाने के लिए क्या करना है!)
डेव

@daHugLenny मुझे कुछ दिन पहले भी यह विचार आया था। मुझे लगता है कि यह संभव है कि हम दोनों पिछले हफ्ते पोस्ट की गई कुछ चुनौती से प्रेरित थे, या नेटवर्क पर एक और सवाल था। मुझे याद नहीं है कि मुझे यह विचार कहां से मिला है।
डेव

एक आइटम को छोड़ना उपयोगकर्ता के पास नहीं है। क्या यह असंभव है (कोई सेशन नहीं) या बकवास (नहीं होगा)। और नहीं एक मौजूदा आइटम छोड़ने?
edc65

जवाबों:


5

जावास्क्रिप्ट (ईएस 6), 244 249 267 280

संपादित सहेजा हुआ 18 (!) बाइट्स @ xeil

इनपुट के साथ एक फ़ंक्शन:

  • आर = कमरे की सामग्री (10 तार की सरणी)
  • k = संयोजन (3 वर्णों के स्ट्रिंग का स्रोत - source1, source2, परिणाम)
  • s = इन्वेंट्री अधिकतम आकार (संख्या)
  • c = कमांड (स्ट्रिंग्स की सरणी)

सच्चा या झूठा लौटाता है

(r,k,s,c,p=0,j={})=>c.some(([c,a,b])=>c<'D'?j[a]>0&j[b]>0&&!k.map(([t,u,v])=>u+t==a+b|u+t==b+a?j[j[a]=j[b]=v]=++s:0):c<'G'?j[a]>0&&!(j[++s,a]=~p):c>'G'?s&&j[a]==~p&&!(j[a]=s--):j['ABCDEFGHIJ'[a]]>0&&(p=a)>8,r.map((o,n)=>[...o].map(c=>j[c]=~n)))

एक अलग पंक्तिबद्ध संस्करण के लिए नीचे दिए गए परीक्षण स्निपेट को देखें

परीक्षा

Exec=
(r,k,s,c,p=0,j={})=>
c.some(
  ([c,a,b])=>
   c<'D'?j[a]>0&j[b]>0&&!k.map(([t,u,v])=>u+t==a+b|u+t==b+a?j[j[a]=j[b]=v]=++s:0)
   :c<'G'?j[a]>0&&!(j[++s,a]=~p)
   :c>'G'?s&&j[a]==~p&&!(j[a]=s--)
   :j['ABCDEFGHIJ'[a]]>0&&(p=a)>8
  ,r.map((o,n)=>[...o].map(c=>j[c]=~n))
)

console.log = (...x) => O.textContent += x + '\n';

;`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`
.split(/;*\n/).map((srow,i)=>{
  var row=srow.split(/\s+/),
  rooms=row.slice(1,11).map(x=>x=="''"?"":x),
  ncomb=+row[11],
  comb=row.slice(12,12+ncomb),
  isize=+row[12+ncomb],
  commands=row.slice(13+ncomb),
  start='['+rooms+'] ['+comb+'] '+isize+' ['+commands+']';
  var result=Exec(rooms,comb,isize,commands),
     ok = row[0] == ['fail','pass'][~~result]
  console.log(i, ok ? 'ok':'ko', start, row[0], result)
})
<pre id=O></pre>


अच्छा (अब) का उपयोग करें .map!
डेव

एस के a>8अंदर क्यों है ()? j[--s,a]=1बन सकता है j[a]=s--? इसके अलावा, String.fromCharCodeअभी तक बहुत लंबा है, सिर्फ सूचकांक में क्यों नहीं "ABCDEFGHIJ"?
नील

@ संकेत के लिए धन्यवाद, मैं उन सब की जाँच करूँगा। स्पष्ट रूप से यह परिवर्तनों की एक श्रृंखला का परिणाम है (कुछ बिंदु पर मुझे j [] बिल्कुल 1 होने की आवश्यकता है, लेकिन अब शायद वे कोई सकारात्मक मूल्य हो सकते हैं)
edc65

3

सी, 338 बाइट्स

मैं अपने स्वयं के परीक्षण कार्यक्रम को छोटा कर रहा था। मुझे लगता है कि यह काफी अच्छी तरह से चला गया, भले ही यह अब तक का सबसे लंबा जवाब हो!

#define P c[(i<j?i:j)*25+i+j]
#define F for(q=atoi(*++v);r
#define X c[r*91+i]
r,i,j,c[2405];main(q,v)char**v;{for(r=10;--r;)for(++v;i=**v;++*v)++X;++v;F<q;++r)i=**++v,j=1[*v],P=2[*v];r=9;F&&*++v;c[i=1[*v]]&&j==68?c[i]=!++X,++q:j>79&&q*X?c[i]=!--X,--q:j==71&&c[i+17]?r=57-i:j<68&&c[i]*c[j=2[*v]]&&P?c[i]=c[j]=0,c[P]=++q:0)j=**v;return r;}

यह अंतरिक्ष को बचाने के लिए कुछ तरकीबों का उपयोग करता है:

  • कमरे रिवर्स में लोड किए जाते हैं ताकि कमरे 9 के लिए जाँच कमरे 0 के लिए जाँच हो जाए, जो सस्ता है
  • कक्ष 9 की सामग्री कभी मायने नहीं रखती है, इसलिए इनपुट पढ़ते समय इसे छोड़ दिया जाता है और इसके बजाय इन्वेंट्री को संग्रहीत करने के लिए उपयोग किया जाता है
  • कमरे की सामग्री और आइटम संयोजन समान सरणी में संग्रहीत किए जाते हैं। क्योंकि आइटम उनके एससीआई मूल्यों पर संग्रहीत होते हैं, वे कभी भी ओवरलैप नहीं होते हैं।

टूट - फूट:

#define P c[(i<j?i:j)*25+i+j]       // item combination lookup (input: i,j)
#define X c[r*91+i]                 // room item lookup (input: r,i)
r,i,j,c[2405];                      // globals default to 0
main(q,v)char**v;{                  // K&R syntax to save bytes
    for(r=10;--r;)                  // Load rooms 0-8, store as 9-1
        for(++v;i=**v;++*v)
            ++X;
    ++v;                            // Skip room 9
    for(q=atoi(*++v);r<q;++r)       // For each combination
        i=**++v,
        j=1[*v],                    // Use index[array] syntax to avoid (brackets)
        P=2[*v];                    // Record combination
    r=9;                            // Begin in room 0 (9 in memory)
    for(q=atoi(*++v);               // Load inventory size
                     r              // While not in room 9 (0 in memory)...
                      &&*++v;       // ...and still have user commands
                                    // (ISO C promises a NULL at the end of argv)
        c[i=1[*v]]&&j==68?          // If 'D'rop, and we have the item:
            c[i]=!++X,              //  Drop it
            ++q:                    //  Increase our inventory capacity
        j>79&&                      // If 'P'ick up, and...
              q                     // ...we have capacity in our inventory and...
               *X?                  // ...the item is in the room:
            c[i]=!--X,              //  Pick it up
            --q:                    //  Decrease our inventory capacity
        j==71&&c[i+17]?             // If 'G'o to room, and we have the key:
            r=57-i:                 //  Go to the room
        j<68&&                      // If 'C'ombine, and...
              c[i]*c[j=2[*v]]       // ...we have the items and...
                             &&P?   // ...they can be combined
            c[i]=c[j]=0,            //  Remove the items
            c[P]=++q:               //  Add the combined item and increase capacity
        0                           // Unrecognised or invalid command
    )
        j=**v;                      // 'j' is the command letter (happens first)
    return r;                       // Return the final room (0 = truthy in shell)
}

आंशिक रूप से @ edc65 के उत्तर से प्रेरित है।


मैं अंतिम भ्रम के लिए कोड प्राप्त करने में ;*++*v;और उसके करीब था c[P][c], लेकिन दुर्भाग्य से अन्य विकल्प छोटे हो गए :(


2

हास्केल, 354 325 323 बाइट्स

(#)=elem
(#)=elem
(%)=filter.(/=)
m!s=g""0.zip[0..]where g _ p _[]=p>8;g i p r(c:d)|p>8=1<2|'P':[k]<-c,k#x,length i<s=g(k:i)p((p,k%x):r)d|'D':[k]<-c,k#i=g(k%i)p((p,k:x):r)d|'C':q@[k,l]<-c,k#i,l#i,[y]<-[f|[d,e,f]<-m,q==[d,e]||q==[e,d]]=g(y:k%(l%i))p r d|'G':n<-c,y<-read n,['A'..]!!y#i=g i y r d|1<2=g i p r d where Just x=lookup p r

एक फ़ंक्शन को परिभाषित करता है !जो क्रम में लेता है

  • 3 अक्षर तार की सूची के रूप में संभव संयोजन
  • इन्वेंट्री का अधिकतम आकार
  • 9 तार की एक सूची के रूप में कमरे
  • खिलाड़ी तार की सूची के रूप में आदेश देता है

लौटाता है Trueया False। उदाहरण कॉल:

*Main> (!) ["YZW"] 2 ["YZJ","","","","","","","","",""] ["PY","PZ","CYZ","PJ","CWJ","G9"]
True

सभी परीक्षण मामले

खेल राज्य को चारों ओर ले जाने में कई बाइट्स खर्च किए जाते हैं। हास्केल विनाशकारी रूप से कमरे और इन्वेंट्री जैसी डेटा संरचनाओं को अपडेट नहीं कर सकता है।

कार्य फ़ंक्शन द्वारा किया जाता है gजो 4 पैरामीटर लेता है: इन्वेंट्री (स्ट्रिंग), वर्तमान कमरा (पूर्णांक), कमरे (Assoc- सूची, कुंजी के साथ: कमरा संख्या और मूल्य: आइटम) और आदेश छोड़ दिया (स्ट्रिंग की सूची) ।

g _ p _[] = p>8                     -- base case. if no commands left, return
                                    -- True if we are in room 9
g i p r(c:d)
  | p>8 =   1<2                     -- reached room 9
  | 'P':[k]<-c,                     -- 'Pickup', if
        k#x,                        --   key is in room and
        length i<s                  --   inventory not full
        = g(k:i)p((p,k%x):r)d       --   adjust inventory and room
  | 'D':[k]<-c,                     -- 'Drop', if
        k#i                         --   key is in inventory
        = g(k%i)p((p,k:x):r)d       --   adjust inventory and room
  | 'C':q@[k,l]<-c,                 -- 'Combine', if
        k#i,l#i,                    --   both keys are in inventory and
        [y]<-[f|[d,e,f]<-m,q==[d,e]||q==[e,d]]
                                    --   combination is possible
        = g(y:k%(l%i))p r d         --   adjust inventory
  | 'G':n<-c, y<-read[n],           -- 'Goto', convert digit to integer  
        ['A'..]!!y#i                --   key for room is in inventory
        = g i y r t                 --   go to room
  | 1<2                             -- impossible command
        = g i p r d                 --   ignore it

हो सकता है कि निम्नलिखित बातें कुछ बाइट्स को बचा सकें

  • खेल राज्य के लिए राज्य मोनाड
  • कुंजियों के लिए एक एकल Assoc- सूची (कुंजी: कुंजी का अक्षर, मूल्य: -1इन्वेंट्री के लिए कमरा नंबर ) के बजाय कमरे / इन्वेंट्री नहीं, इस तरह की एक प्रारंभिक Assoc- सूची का निर्माण करना और अधिकतम इन्वेंट्री के आकार की जांच से अधिक लागत से निपटने से बचाता है एक कम पैरामीटर के साथ।

अच्छा लगा। मैं जाँच करने के लिए पर्याप्त हास्केल नहीं जानता, लेकिन आप sअपनी इन्वेंट्री के उपयोग में परिवर्तन के रूप में जाँच करने से बचने के लिए length i(आप s0 के बजाय जाँच कर सकते हैं ) से बचने के लिए कुछ बाइट्स को बढ़ा / घटाकर बचाने में सक्षम हो सकते हैं
डेव

@ क्या: मुझे नहीं लगता कि यह भुगतान करता है, क्योंकि sइसे बदलने से इसका पांचवां पैरामीटर बन जाएगा gऔर इसे पास करना होगा। मेरे पास 5 पुनरावर्ती कॉल हैं g, एक अतिरिक्त पैरामीटर की लागत कम से कम 6 बाइट्स है।
nimi

1

पायथन 3, 321 311 बाइट्स

-10, धन्यवाद डेव

S,F=set,frozenset
def f(r,c,i,m):
 w,v,r,c=0,S(),list(map(S,r)),{F(k):S(x)for*k,x in c}
 for a,*q in m:
  p=F(q)
  if a<'D'and p in c and p<=v:v-=p;v|=c[p]
  elif a=='D'and p<=v:r[w]|=p;v-=p
  elif a=='G'and F(chr(65+int(q[0])))<=v:w=int(q[0])
  elif a>'G'and p<=r[w]and len(v)<i:r[w]-=p;v|=p
  if w==9:return 1

कमरे (आर), संयोजन (सी) और चाल (एम) तार की सभी सूची हैं। मैक्स इन्वेंट्री (i) एक इंट है।

बहुत सीधे आगे कार्यान्वयन। अद्यतन करने के लिए कमरे की सामग्री और सूची के लिए प्रयुक्त सेट () का उपयोग करें। संयोजन के एक शब्दकोश को कुंजीबद्ध करने के लिए फ़्रोज़ेन्सेट्स का उपयोग किया जाता है, ताकि 2 इनपुट आइटम का क्रम अप्रासंगिक हो।


ठंडा। इस के साथ निर्धारित परीक्षण पर इसे सत्यापित करें: import sys;r=sys.argv[1:11];nc=int(sys.argv[11]);c=sys.argv[12:12+nc];i=int(sys.argv[12+nc]);m=sys.argv[13+nc:];exit(not f(r,c,i,m))(अर्धविराम -> नई सूचियाँ)। वैसे, लगता है कि आप ,dbg=Falseवहां से चले गए हैं; आप इसे हटाकर 10 बाइट्स बचा सकते हैं!
डेव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.