I giochi di avventura testuali hanno una formula piuttosto definita; c'è un mondo composto da una serie di stanze / spazi, il giocatore può muoversi in queste stanze e ci sono alcuni oggetti nelle stanze. Gli oggetti possono essere raccolti dal giocatore, messi giù, usati per accedere ad altre stanze (es. Chiavi) e combinati con altri oggetti per creare nuovi oggetti.
Sfida
La tua sfida è scrivere un runtime di avventura testuale nel minor numero di byte (codice golf). Per semplificare le cose, tutto ciò che devi fare è generare un valore di verità o falsità a seconda che una determinata serie di comandi vincerebbe o meno un determinato gioco (nessuna interattività, nessun risultato amico dell'uomo, ecc.)
Regole del gioco
- Il mondo è sempre composto da un corridoio con 10 stanze collegate. Ogni stanza richiede una chiave per entrare, ma può essere chiusa in qualsiasi momento senza una chiave (quindi è una specie di serratura a chiave, immagino);
- Il giocatore inizia nella stanza 0 e vince se entra nella stanza 9 (una volta raggiunta la stanza 9 può fare quello che vuole, incluso andare in un'altra stanza e avrà comunque vinto);
- Ogni stanza può contenere qualsiasi numero di elementi;
- Ci sono fino a 26 oggetti, chiamati AZ, e nessun oggetto apparirà più di una volta al mondo;
- Il giocatore può raccogliere oggetti dalla stanza attuale e metterli nel loro inventario (possono anche rilasciare oggetti dal loro inventario nella stanza corrente);
- Le dimensioni massime dell'inventario del giocatore sono limitate e saranno fornite con i dettagli del livello;
- All'inizio del gioco, l'inventario del giocatore è sempre vuoto;
- Non vi è alcun limite al numero massimo di oggetti in una stanza (sebbene il limite implicito sarebbe 26, poiché questo è il numero totale di oggetti);
- Gli oggetti AJ sono chiavi che possono essere usate per entrare nelle stanze 0-9 (cioè il giocatore può spostarsi nella stanza 0 se ha l'oggetto A, nella stanza 1 se ha B, ecc. Nota che le chiavi non sono necessarie per lasciare una stanza, e il giocatore inizia nella stanza 0, quindi il tasto "A" è richiesto solo se il giocatore vuole tornare nella stanza 0);
- Gli oggetti nell'inventario del giocatore possono essere combinati per creare nuovi oggetti (che verranno creati nell'inventario del giocatore) - le combinazioni consentite saranno fornite con i dettagli del livello;
- La combinazione di oggetti consuma gli oggetti originali (cioè se uno degli oggetti era una chiave, non sarà più possibile usare quella chiave);
- Se il giocatore cerca di fare qualcosa di impossibile (es. Raccogliere un oggetto che non si trova nella stanza corrente / rilasciare un oggetto che non ha / combinare oggetti che non ha / andare in una stanza che non ha la chiave per), non succede nulla e possono continuare;
- Il giocatore non darà mai un comando senza senso (es. Vai alla stanza 11).
Quindi un semplice gioco potrebbe apparire così:
v
+---+---+---+---+---+---+---+---+---+---+
| C | | J | | | | | | | |
+---+---+---+---+---+---+---+---+---+---+
| CORRIDOR |
+---------------------------------------+
Inventory capacity: 99
La stanza 0 contiene l'elemento "C" (che è la chiave della stanza 2). La stanza 2 contiene l'elemento "J" (che è la chiave della stanza 9). Il giocatore può vincere la partita raccogliendo C, spostandosi nella stanza 2, raccogliendo J, quindi spostandosi nella stanza 9.
Un gioco più complesso potrebbe essere:
v
+---+---+---+---+---+---+---+---+---+---+
| C | | X |YZ | | | | | | |
+---+---+---+---+---+---+---+---+---+---+
| CORRIDOR |
+---------------------------------------+
Inventory capacity: 10
C+X => D
Y+Z => J
Ora il giocatore può vincere raccogliendo C, spostandosi nella stanza 2, raccogliendo X, combinando C con X per creare D, quindi spostandosi nella stanza 3. Ora possono raccogliere e combinare Y e Z per ottenere J, permettendo loro di vai nella stanza 9.
Formato di input
C'è un bel po 'di input da gestire, ed è un'attività piuttosto noiosa, quindi il formato di input è molto flessibile. Otterrai i seguenti dati e il modo in cui dovrebbero essere inviati al tuo programma dipende in gran parte da te:
- Il contenuto iniziale di ogni stanza (elenco di 0 o più elementi per ogni stanza);
- Una raccolta di combinazioni di elementi consentite (ognuna contiene 2 voci di input e la loro voce di output - si noti che le voci di input non sono ordinate);
- La dimensione massima dell'inventario (numero intero, 0 <= dimensione <= 26);
- L'elenco dei comandi che il giocatore ha tentato.
I comandi del giocatore possono essere:
[P]ick up <item>
- raccoglie un oggetto dalla stanza e lo mette nell'inventario del giocatore (se c'è spazio)[D]rop <item>
- rilascia un oggetto dall'inventario del giocatore nella stanza corrente[C]ombine <item1> <item2>
- combina 2 oggetti nell'inventario del giocatore per produrre un nuovo oggetto[G]o to <room>
- viaggia nella stanza scelta se il giocatore ha la chiave richiesta
Ad esempio, il formato di input che ho usato per i test era semplici argomenti del programma:
./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)
Ma se qualche altro formato lo rende più semplice, va bene (ad es. Caratteri delimitatori speciali / righe multiple / ordini diversi / serializzati su JSON / ecc.)
Formato di output
Il tuo programma dovrebbe restituire un output veritiero se i comandi del giocatore inducono a vincere il gioco, e in caso contrario un output falso. Questo potrebbe essere un messaggio riconoscibile a stdout, un codice di ritorno del programma o qualunque sia la tua lingua preferita. Tutti gli altri output verranno ignorati.
Casi test
Il seguente script bash fornisce un cablaggio di prova che controllerà la maggior parte delle situazioni. È stato scritto per utilizzare il formato sopra descritto, ma modificarlo per utilizzare un formato diverso è solo un caso di aggiunta di una conversione nella invoke
funzione.
#!/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;
vincente
Golf codice standard: vince il codice più breve (in byte). Le iscrizioni devono seguire le regole del gioco, il che in pratica significa che devono superare tutti i casi di test (se necessario possono essere aggiunti più test).