การผจญภัยเล็ก ๆ


14

เกมผจญภัยข้อความมีสูตรที่ค่อนข้างจะสวยงาม มีโลกที่ประกอบไปด้วยห้อง / พื้นที่หลายชุดผู้เล่นสามารถเดินไปรอบ ๆ ห้องเหล่านี้และมีบางรายการในห้อง ผู้เล่นสามารถหยิบไอเท็มวางลงใช้เพื่อเข้าห้องอื่น (เช่นกุญแจ) และรวมกับไอเท็มอื่น ๆ เพื่อสร้างไอเท็มใหม่

ท้าทาย

ความท้าทายของคุณคือการเขียนรันไทม์การผจญภัยข้อความในไบต์ที่น้อยที่สุด (รหัสกอล์ฟ) เพื่อให้ทุกอย่างง่ายขึ้นสิ่งที่คุณต้องทำก็คือเอาท์พุทค่าความจริงหรือความเท็จขึ้นอยู่กับว่าชุดคำสั่งที่กำหนดจะชนะเกมที่กำหนดหรือไม่ (ไม่มีการโต้ตอบไม่มีเอาต์พุตที่เป็นมิตรต่อมนุษย์ ฯลฯ )

กฎของเกม

  • โลกนี้ประกอบด้วยทางเดินที่เชื่อมต่อกัน 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;

การชนะ

รหัสกอล์ฟมาตรฐาน: รหัสที่สั้นที่สุด (เป็นไบต์) ชนะ ผลงานต้องเป็นไปตามกฎของเกมซึ่งในทางปฏิบัติหมายความว่าพวกเขาจะต้องผ่านทุกกรณีทดสอบ (อาจมีการทดสอบเพิ่มเติมหากจำเป็น)


คุณอาจไม่เชื่อฉัน แต่ฉันคิดว่าความท้าทายที่สวยมากสิ่งเดียวกันเช่นนี้หนึ่งในไม่กี่วันที่ผ่านมา ...
acrolith

ฉันชอบความท้าทายนี้ แต่ผมต้องการแน่นอนรวมถึงกรณีการทดสอบนอกสคริปต์การทดสอบของคุณ
Nathan Merrill

@NathanMerrill สามารถทำได้คุณต้องการรูปแบบใด (กรณีทดสอบภายในสคริปต์ค่อนข้างง่ายต่อการแยกวิเคราะห์ดังนั้นฉันไม่แน่ใจว่าจะทำอย่างไรเพื่อสร้างตารางทดสอบโดยไม่ต้องทำซ้ำในบรรทัดเดียวกัน!)
เดฟ

@daHugLenny ฉันมีความคิดเมื่อสองสามวันที่แล้วเช่นกัน ฉันเดาว่าเป็นไปได้ว่าเราทั้งคู่ได้รับแรงบันดาลใจจากความท้าทายที่โพสต์เมื่อสัปดาห์ที่แล้วหรือคำถามอื่นในเครือข่าย ฉันจำไม่ได้ว่าฉันได้รับความคิดจากที่ใด
เดฟ

วางรายการที่ผู้ใช้ไม่มี มันเป็นไปไม่ได้ (ไม่มี op) หรือไร้สาระ (จะไม่เกิดขึ้น) และวางรายการที่ไม่มีอยู่หรือไม่
edc65

คำตอบ:


5

JavaScript (ES6), 244 249 267 280

แก้ไขบันทึกแล้ว 18 (!) ไบต์ thx @Neil

ฟังก์ชั่นที่มีอินพุต:

  • r = เนื้อหาห้อง (อาร์เรย์ 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>


ใช้งานได้ดี (ab) .map!
เดฟ

ทำไมเป็นa>8ภายใน()หรือไม่? สามารถj[--s,a]=1กลายเป็นj[a]=s--? นอกจากนี้String.fromCharCodeเป็นมานานเกินไปแล้วทำไมไม่เพียงดัชนีลง"ABCDEFGHIJ"?
Neil

@Neil ขอบคุณสำหรับคำแนะนำฉันจะตรวจสอบพวกเขาทั้งหมด เห็นได้ชัดว่านี่เป็นผลมาจากการเปลี่ยนแปลงหลายอย่าง (ในบางจุดฉันต้องการ j [] ให้เท่ากับ 1 แต่ตอนนี้พวกเขาอาจเป็นค่าบวก)
edc65

3

C, 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 ไม่สำคัญดังนั้นจึงถูกข้ามเมื่ออ่านอินพุตและใช้เพื่อเก็บสินค้าคงคลังแทน
  • เนื้อหาห้องและการรวมรายการจะถูกเก็บไว้ในอาร์เรย์เดียวกัน เนื่องจากไอเท็มจะถูกเก็บไว้ที่ค่า ascii พวกมันจึงไม่ทับซ้อนกัน

ชำรุด:

#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

Haskell, 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

กรณีทดสอบทั้งหมด

ไบต์จำนวนมากถูกใช้ในการเล่นเกมรอบ ๆ Haskell ไม่สามารถอัปเดตโครงสร้างข้อมูลอย่างทำลายล้างเช่นห้องและสินค้าคงคลัง

งานจะทำโดยฟังก์ชั่นgซึ่งใช้พารามิเตอร์ 4 ตัวคือสินค้าคงคลัง (String), ห้องปัจจุบัน (จำนวนเต็ม), ห้อง (Assoc-List, พร้อมคีย์: หมายเลขห้องและค่า: รายการ) และคำสั่งทางซ้าย (รายการของสตริง) .

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

บางทีสิ่งต่อไปนี้สามารถบันทึกบางไบต์

  • สถานะ Monad สำหรับสถานะเกม
  • Assoc-List เดียวสำหรับคีย์ (คีย์: จดหมายของคีย์, ค่า: หมายเลขห้องพร้อมกับ-1สินค้าคงคลัง) แทนที่จะเป็นห้อง / สินค้าคงคลังไม่, การสร้างรายการ Assoc-List เริ่มต้นและการตรวจสอบขนาดสินค้าคงคลังสูงสุดจะประหยัดกว่า ด้วยพารามิเตอร์ที่น้อยกว่าหนึ่งรายการ

ดี ฉันไม่รู้จัก Haskell มากพอที่จะตรวจสอบ แต่คุณอาจบันทึกจำนวนไบต์ได้ด้วยการเพิ่ม / ลดขนาดsเนื่องจากการเปลี่ยนแปลงการใช้สินค้าคงคลังของคุณเพื่อหลีกเลี่ยงการตรวจสอบlength i(คุณสามารถตรวจสอบsกับ 0 แทน)
Dave

@ เดฟ: ฉันไม่คิดว่ามันจ่ายเพราะการเปลี่ยนแปลงsจะทำให้มันเป็นพารามิเตอร์ที่ห้าของgและมันจะต้องถูกส่งผ่าน ฉันมีการเรียกซ้ำแบบเรียกซ้ำอีก 5 ครั้งgค่าพารามิเตอร์เพิ่มเติมอย่างน้อย 6 ไบต์
nimi

1

Python 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

ห้อง (r), ชุดค่าผสม (c) และการย้าย (m) เป็นรายการสตริงทั้งหมด สินค้าคงคลังสูงสุด (i) เป็น int

การใช้งานไปข้างหน้าอย่างยุติธรรม ชุดที่ใช้ (s) สำหรับเนื้อหาห้องพักและสินค้าคงคลังเพื่อให้ง่ายต่อการอัพเดท ใช้ frozensets เพื่อคีย์พจนานุกรมของชุดค่าผสมเพื่อให้ลำดับของรายการอินพุต 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 ไบต์โดยการลบมัน!
เดฟ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.