Một cuộc phiêu lưu nhỏ


14

Trò chơi phiêu lưu văn bản có một công thức thiết lập khá; có một thế giới bao gồm một loạt các phòng / không gian, người chơi có thể di chuyển xung quanh các phòng này và có một số vật phẩm trong phòng. Người chơi có thể nhặt các vật phẩm, đặt xuống, sử dụng để truy cập các phòng khác (ví dụ: chìa khóa) và kết hợp với các vật phẩm khác để tạo vật phẩm mới.

Thử thách

Thách thức của bạn là viết một thời gian chạy phiêu lưu văn bản trong vài byte (mã golf). Để đơn giản, tất cả những gì bạn cần làm là đưa ra một giá trị trung thực hoặc falsey tùy thuộc vào việc một chuỗi lệnh nhất định có chiến thắng một trò chơi nhất định hay không (không tương tác, không có đầu ra thân thiện với con người, v.v.)

Luật chơi

  • Thế giới luôn bao gồm một hành lang với 10 phòng được kết nối. Mỗi phòng yêu cầu một chìa khóa để vào, nhưng có thể thoát ra bất cứ lúc nào mà không cần chìa khóa (vì vậy đó là một loại khóa chốt tôi đoán);
  • Người chơi bắt đầu ở phòng 0 và chiến thắng nếu họ vào phòng 9 (một khi họ tới phòng 9, họ có thể làm bất cứ điều gì họ thích, kể cả đi đến phòng khác, và họ vẫn sẽ thắng);
  • Mỗi phòng có thể chứa bất kỳ số lượng các mặt hàng;
  • Có tới 26 mặt hàng, được đặt tên là AZ và sẽ không có mặt hàng nào xuất hiện nhiều hơn một lần trên thế giới;
  • Người chơi có thể lấy vật phẩm từ phòng hiện tại và đặt chúng vào kho của họ (họ cũng có thể thả vật phẩm từ kho của họ vào phòng hiện tại);
  • Kích thước kho tối đa của người chơi là hữu hạn và sẽ được cung cấp các chi tiết về cấp độ;
  • Khi bắt đầu trò chơi, kho đồ của người chơi luôn trống;
  • Không có giới hạn đối với số lượng vật phẩm tối đa trong một phòng (mặc dù giới hạn ngầm sẽ là 26, vì đó là tổng số vật phẩm);
  • Vật phẩm AJ là chìa khóa có thể được sử dụng để vào phòng 0-9 (tức là người chơi có thể chuyển sang phòng 0 nếu họ có vật phẩm A, đến phòng 1 nếu có B, v.v. lưu ý rằng không bắt buộc phải rời khỏi phòng, và người chơi bắt đầu ở phòng 0, do đó, phím "A" chỉ được yêu cầu nếu người chơi muốn trở về phòng 0);
  • Các vật phẩm trong kho của người chơi có thể được kết hợp để tạo vật phẩm mới (sẽ được tạo trong kho của người chơi) - các kết hợp được phép sẽ được cung cấp với các chi tiết cấp độ;
  • Việc kết hợp các vật phẩm sẽ tiêu thụ các vật phẩm ban đầu (nghĩa là nếu một trong các vật phẩm đó là một khóa, thì nó sẽ không còn có thể sử dụng khóa đó nữa);
  • Nếu người chơi cố gắng làm điều gì đó không thể (ví dụ: nhặt một vật phẩm không có trong phòng hiện tại / bỏ một vật phẩm họ không có / kết hợp các vật phẩm họ không có / đi đến một phòng họ không có chìa khóa cho), không có gì xảy ra và họ có thể tiếp tục;
  • Người chơi sẽ không bao giờ đưa ra một lệnh vô nghĩa (ví dụ: đi đến phòng 11).

Vì vậy, một trò chơi đơn giản có thể trông như thế này:

  v
+---+---+---+---+---+---+---+---+---+---+
| C |   | J |   |   |   |   |   |   |   |
+---+---+---+---+---+---+---+---+---+---+
|               CORRIDOR                |
+---------------------------------------+
Inventory capacity: 99

Phòng 0 chứa mục "C" (là chìa khóa của phòng 2). Phòng 2 chứa mục "J" (là chìa khóa của phòng 9). Người chơi có thể giành chiến thắng trong trò chơi bằng cách chọn C, di chuyển đến phòng 2, chọn J, sau đó chuyển sang phòng 9.

Một trò chơi phức tạp hơn có thể là:

  v
+---+---+---+---+---+---+---+---+---+---+
| C |   | X |YZ |   |   |   |   |   |   |
+---+---+---+---+---+---+---+---+---+---+
|               CORRIDOR                |
+---------------------------------------+
Inventory capacity: 10
C+X => D
Y+Z => J

Bây giờ người chơi có thể giành chiến thắng bằng cách chọn C, chuyển sang phòng 2, chọn X, kết hợp C với X để tạo D, sau đó chuyển sang phòng 3. Bây giờ họ có thể nhặt và kết hợp Y và Z để lấy J, cho phép họ về phòng 9


Định dạng đầu vào

Có một chút đầu vào để xử lý và đó là một nhiệm vụ khá nhàm chán, vì vậy định dạng đầu vào rất linh hoạt. Bạn sẽ nhận được dữ liệu sau đây và cách gửi dữ liệu đến chương trình của bạn phần lớn tùy thuộc vào bạn:

  • Nội dung ban đầu của mỗi phòng (danh sách từ 0 món trở lên cho mỗi phòng);
  • Một tập hợp các kết hợp mục được phép (mỗi mục chứa 2 mục đầu vào và mục đầu ra của chúng - lưu ý rằng các mục đầu vào không được sắp xếp);
  • Kích thước khoảng không quảng cáo tối đa (số nguyên, 0 <= size <= 26);
  • Danh sách các lệnh người chơi đã cố gắng.

Các lệnh của người chơi có thể là:

  • [P]ick up <item> - nhặt một vật phẩm từ phòng và đặt nó vào kho của người chơi (nếu có không gian)
  • [D]rop <item> - thả một vật phẩm từ kho đồ của người chơi vào phòng hiện tại
  • [C]ombine <item1> <item2> - kết hợp 2 vật phẩm trong kho của người chơi để tạo ra vật phẩm mới
  • [G]o to <room> - đi đến phòng đã chọn nếu người chơi có chìa khóa cần thiết

Ví dụ, định dạng đầu vào tôi sử dụng để kiểm tra là các đối số chương trình đơn giản:

./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)

Nhưng nếu một số định dạng khác làm cho nó dễ dàng hơn, thì tốt thôi (ví dụ: các ký tự phân cách đặc biệt / nhiều dòng / thứ tự khác nhau / được tuần tự hóa thành JSON / v.v.)

Định dạng đầu ra

Chương trình của bạn sẽ trả về một số đầu ra trung thực nếu các lệnh của người chơi khiến họ thắng trò chơi và một số đầu ra falsey khác. Đây có thể là một thông điệp dễ nhận biết đến thiết bị xuất chuẩn, mã trả về chương trình hoặc bất cứ ngôn ngữ nào bạn chọn cung cấp. Tất cả đầu ra khác sẽ bị bỏ qua.

Các trường hợp thử nghiệm

Kịch bản bash sau đây cung cấp một khai thác thử nghiệm sẽ kiểm tra hầu hết các tình huống. Nó đã được viết để sử dụng định dạng được mô tả ở trên, nhưng sửa đổi nó để sử dụng một định dạng khác chỉ là một trường hợp thêm một chuyển đổi trong invokehàm.

#!/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;

Chiến thắng

Golf mã tiêu chuẩn: mã ngắn nhất (tính bằng byte) thắng. Bài dự thi phải tuân theo các quy tắc trò chơi, trong thực tế có nghĩa là chúng phải vượt qua tất cả các trường hợp kiểm tra (có thể thêm nhiều bài kiểm tra nếu cần thiết).


Bạn có thể không tin tôi nhưng tôi đã nghĩ đến một thử thách khá giống với thử thách này vài ngày trước ...
acrolith

Tôi thích thử thách này. Tuy nhiên, tôi chắc chắn bao gồm các trường hợp thử nghiệm bên ngoài tập lệnh thử nghiệm của bạn.
Nathan Merrill

@NathanMerrill có thể làm, bạn thích định dạng nào? (các trường hợp thử nghiệm bên trong tập lệnh đã khá dễ phân tích, vì vậy tôi không biết phải làm gì để tạo một bảng thử nghiệm mà không cần lặp lại cùng một dòng!)
Dave

@daHugLenny Tôi cũng có ý tưởng vài ngày trước. Tôi đoán có thể cả hai chúng tôi đều được truyền cảm hứng bởi một số thách thức được đăng vào tuần trước, hoặc một câu hỏi khác trên mạng. Tôi không thể nhớ tôi đã lấy ý tưởng từ đâu.
Dave

Đánh rơi một món đồ mà người dùng không có. Là nó không thể (không op) hoặc vô nghĩa (sẽ không xảy ra). Và thả một mặt hàng không tồn tại?
edc65

Câu trả lời:


5

JavaScript (ES6), 244 249 267 280

Chỉnh sửa đã lưu 18 (!) Byte @Neil

Một chức năng với đầu vào:

  • r = nội dung phòng (mảng 10 chuỗi)
  • k = kết hợp (mảng chuỗi 3 ký tự - source1, source2, result)
  • s = kích thước tối đa của hàng tồn kho (số)
  • c = lệnh (mảng chuỗi)

Trả về đúng hay sai

(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)))

Xem đoạn kiểm tra bên dưới để biết phiên bản mới được phân tách

Kiểm tra

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>


Đẹp (ab) sử dụng .map!
Dave

Tại sao là a>8bên trong ()s? Có thể j[--s,a]=1trở thành j[a]=s--? Ngoài ra, String.fromCharCodelà quá dài, tại sao không chỉ mục vào "ABCDEFGHIJ"?
Neil

@Neil cảm ơn vì những gợi ý, tôi sẽ kiểm tra tất cả. Rõ ràng đây là kết quả của một loạt các thay đổi (tại một số điểm tôi cần j [] chính xác là 1, nhưng bây giờ có lẽ chúng có thể là bất kỳ giá trị dương nào)
edc65

3

C, 338 byte

Tôi đã đi vào việc giảm thiểu chương trình thử nghiệm của riêng tôi. Tôi nghĩ rằng nó đã đi khá tốt, ngay cả khi đó là câu trả lời dài nhất cho đến nay!

#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;}

Điều này sử dụng một vài thủ thuật để tiết kiệm không gian:

  • Các phòng được tải ngược lại để kiểm tra phòng 9 trở thành kiểm tra cho phòng 0, rẻ hơn
  • Nội dung của phòng 9 không bao giờ quan trọng, vì vậy nó bị bỏ qua khi đọc đầu vào và được sử dụng để lưu trữ hàng tồn kho thay thế
  • Nội dung phòng và kết hợp vật phẩm được lưu trữ trong cùng một mảng. Bởi vì các mục được lưu trữ tại các giá trị ascii của chúng, chúng không bao giờ trùng nhau.

Phá vỡ:

#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)
}

Lấy cảm hứng một phần từ câu trả lời của @ edc65.


Tôi đã rất gần với việc nhận ;*++*v;c[P][c]nhập mã cho sự nhầm lẫn cuối cùng, nhưng thật không may, các tùy chọn khác hóa ra lại ngắn hơn :(


2

Haskell, 354 325 323 byte

(#)=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

Xác định hàm !có thứ tự

  • các kết hợp có thể là một danh sách gồm 3 chuỗi ký tự
  • kích thước tối đa của hàng tồn kho
  • các phòng như một danh sách gồm 9 chuỗi
  • người chơi ra lệnh như một danh sách các chuỗi

Trả về Truehoặc False. Cuộc gọi ví dụ:

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

Tất cả các trường hợp thử nghiệm .

Nhiều byte được dành để mang trạng thái trò chơi xung quanh. Haskell không thể cập nhật triệt để các cấu trúc dữ liệu như phòng và kho.

Công việc được thực hiện bởi hàm gcó 4 tham số: kho (Chuỗi), phòng hiện tại (Số nguyên), các phòng (Danh sách PGS, với khóa: số phòng và giá trị: vật phẩm) và các lệnh còn lại (Danh sách chuỗi) .

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

Có lẽ những điều sau đây có thể lưu một số byte

  • Bang Monad cho trạng thái trò chơi
  • Một danh sách PGS duy nhất cho các khóa (khóa: ký tự khóa, giá trị: số phòng có -1hàng tồn kho) thay vì phòng / hàng tồn kho Không, xây dựng Danh sách PGS ban đầu như vậy và kiểm tra kích thước khoảng không quảng cáo tối đa sẽ tiết kiệm chi phí hơn với một tham số ít hơn.

Đẹp. Tôi không biết đủ Haskell để kiểm tra, nhưng bạn có thể lưu một số byte bằng cách tăng / giảm skhi hàng tồn kho của bạn thay đổi, để tránh phải kiểm tra length i( sthay vào đó bạn có thể kiểm tra 0)
Dave

@Dave: Tôi không nghĩ rằng nó thành công, bởi vì việc thay đổi ssẽ khiến nó trở thành tham số thứ năm gvà nó sẽ phải được thông qua. Tôi có 5 cuộc gọi đệ quy đến g, một tham số bổ sung có chi phí ít nhất là 6 byte.
nimi

1

Python 3, 321 311 byte

-10, cảm ơn Dave

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

Các phòng (r), kết hợp (c) và di chuyển (m) đều là danh sách các chuỗi. Hàng tồn kho tối đa (i) là một int.

Khá thẳng tiến thực hiện. Đã sử dụng set () cho nội dung phòng và kho để giúp cập nhật dễ dàng. Hàng chục được sử dụng để khóa một từ điển của các kết hợp, do đó thứ tự của 2 mục đầu vào là không liên quan.


Mát mẻ. Xác minh nó trên bộ kiểm tra với điều này: 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))(dấu chấm phẩy -> dòng mới). Nhân tiện, có vẻ như bạn còn lại ,dbg=Falsetrong đó; bạn có thể tiết kiệm 10 byte bằng cách loại bỏ nó!
Dave
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.