Smetti di camminare nei muri!


16

Alcuni rogue-like basati su testo non ti consentono di camminare contro i muri e di tornare indietro se ci provi. Perché farlo quando puoi far muovere il giocatore nella direzione valida più vicina?

La sfida

Scrivi un programma di funzioni che, data una direzione e una griglia di caratteri 3 per 3, emetta la stessa griglia dopo che il giocatore ha fatto un passo.

Per esempio,

9
#..
.@#
#.#

diventa

#.@
..#
#.#

Ingresso

  • La direzione è data da una singola cifra da 1 a 9, ciascuna corrispondente a 8 direzioni cardinali e ferma. Questo deriva dalle posizioni relative dei numeri su una tastiera:

    NO NE NE
    .. \ | /
    ... 7 8 9
    W- 4 5 6 -E
    ... 1 2 3
    ../ | \
    SW S SE
    
    Tuttavia, puoi anche usare i numeri 123, 456, 789 invece di 789, 456, 123. In altre parole, puoi scambiare le 2 righe oi numeri in alto e in basso se lo desideri. Queste sono le uniche 2 combinazioni di indici accettabili.

  • La griglia 3 per 3 sarà composta da 3 caratteri ASCII distinti e stampabili che rappresentano il pavimento percorribile, le pareti e il giocatore. (Nei casi di test, .viene utilizzato per il pavimento, #i muri sono ed @è il giocatore)

  • Puoi scegliere quali caratteri utilizzare il tuo programma, ma devi indicarli nella tua risposta e devono essere coerenti su più prove.
  • Il personaggio che rappresenta il personaggio sarà sempre al centro della griglia 3 per 3 e la direzione sarà sempre tra 1 e 9 (incl.)
  • È possibile accettare input in qualsiasi ordine
  • La griglia 3 per 3 può essere inserita come un array di caratteri, un array di stringhe, una stringa di 9 lunghezze o un'altra alternativa ragionevole.

Produzione

  • Ritorno da una funzione o output su StdOut o alternativa più vicina
  • Sono consentiti spazi finali e newline
  • È necessario utilizzare le stesse rappresentazioni dei caratteri dell'input
  • Gli stessi formati consentiti per gli input sono consentiti per gli output

Come si muove il giocatore

Se la direzione specificata è bloccata da un muro (ad es. Se l'esempio sopra aveva la direzione 6), guarda le 2 direzioni più vicine:

  • Se una (e una sola) direzione è libera, sposta il giocatore in quella direzione.
  • Se nessuna direzione è libera, guarda le 2 direzioni successive più vicine (esclusa la direzione 5). Se hai avvolto tutto intorno e non hai trovato alcuna direzione aperta (giocatore circondato da muri), non muovere il giocatore
  • Se entrambe le direzioni sono aperte, scegline una per spostarti a caso (anche se non necessariamente in modo uniforme).

Se la direzione indicata è un 5, non muovere il giocatore

Casi test

( #= muro, .= piano, @= giocatore)

Ingresso:

9
# ..
. @ #
#. #

Produzione:

#. @
.. #
#. #


Ingresso:

3
# ..
. @ #
#. #

Produzione:

# ..
.. #
# # @


Ingresso:

7
##.
# # @
.. #

Produzione:

## @ ##.
#.# o #.#
.. # @. #


Ingresso:

5
...
. @.
...

Produzione:

...
. @.
...


Ingresso:

2
###
# # @
###

Produzione:

###
# # @
###

punteggio

Questo è , quindi vince la risposta più breve in byte.


Non stai usando yuhjklbn? STRAPPARE.
R

Inoltre, non mi piace molto la parte "scegli una direzione alternativa". È un po 'diverso dall'altra parte della sfida, che è "muovere il giocatore in una direzione e un output specificati". Questa è solo una preferenza personale però.
R

1
Questa parte è confusa: "Se nessuna direzione è libera, guarda le successive 2 direzioni più vicine."
Leaky Nun,

1
Possiamo assegnare un numero anziché un carattere ASCII per ciascun elemento, quindi prendere l'input come un elenco bidimensionale? O devono essere stringhe?
Scott Milner,

2
Posso usare le indicazioni 123;456;789invece di 789;456;123?
Leaky Nun,

Risposte:


2

Pyth - 73 70 byte

Kmsd"78963214"DPGJXXYt@K+xKQG\@4\.R?q/J\#/Y\#Jk=YwV5=GflTmPd(N_N)IGOGB

Provalo

L'input è composto da due righe:

1a riga: direzione dello spostamento

2a riga: il tabellone (posizioni 123456789, con 123 nella riga superiore)


3

JavaScript (ES6), 192 163 byte

a=>b=>a[(a[4]=0)+--b]?(A=(c,d)=>c==b|(e=a[c])-(f=a[d])|!e?(a[c-b?(e?e<f:new Date&1)?c:d:4]=2,a):A(+g[c],+h[d]))(+(g="3016X2785")[b],+(h="1250X8367")[b]):(a[b]=2,a)

Appunti

Questa funzione utilizza uno speciale formato di input. Il primo input è un array di numeri interi ( 0perfloor , 1for walle 2for player) che rappresentano la mappa. Il secondo input è la direzione (capovolta):1 è nord-ovest, 2è nord, 3è nord-est, 4è ovest ecc. Gli input dovrebbero essere dati attraverso la sintassi del curry ( Z(a)(b)).

Casi test

Le mappe e le indicazioni sono state modificate per adattarsi al mio formato di input.

Z=
a=>b=>a[(a[4]=0)+--b]?(A=(c,d)=>c==b|(e=a[c])-(f=a[d])|!e?(a[c-b?(e?e<f:new Date&1)?c:d:4]=2,a):A(+g[c],+h[d]))(+(g="3016X2785")[b],+(h="1250X8367")[b]):(a[b]=2,a)

testcases = [
    [[1,0,0,0,2,1,1,0,1], 3],
    [[1,0,0,0,2,1,1,0,1], 9],
    [[1,1,0,1,2,1,0,0,1], 1],
    [[0,0,0,0,2,0,0,0,0], 5],
    [[1,1,1,1,2,1,1,1,1], 2]
]
for (test of testcases) {
    console.log(Z(test[0])(test[1]))
}


1

Python 3, 120 104 153 176 175 byte

def f(n,l):
 n-=1
 if n!=4and'.'in l:l[sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)[1][0]],l[4]='@.'
 return l

Provalo online!

Questo metodo ottiene la direzione e l'elenco di '.', '#' E '@'. Gli indici iniziano da 1 a 9 (con 0 a 8 nella lista davvero). Quindi ha la forma

123 
456
789 

Il metodo restituisce un nuovo elenco con nuove posizioni.

Questa linea

sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)

restituisce un elenco di questo tipo:

>>>n=7
>>> l=['#','#','#','.','@','#','.','#','.']
>>> sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)
[(4, '@'), (8, '.'), (6, '.'), (3, '.'), (7, '#'), (5, '#'), (1, '#'), (0, '#'), (2, '#')]

Calcoliamo le distanze in punti liberi e aggiungiamo casualità. Perché ord('#') <= ord('.') - 8 and ord('.') + 8 <= ord('@')possiamo dire che il più vicino '.' per n = 7 (indice nella lista) ha un indice di 8.

inserisci qui la descrizione dell'immagine

Esempio:

>>> f(9, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '.', '.', '.', '#', '#', '@', '#']
>>> f(3, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '@', '.', '.', '#', '#', '.', '#']
>>> f(5, ['.','.','#','.','@','.','#','.','#'])
['.', '.', '#', '.', '@', '.', '#', '.', '#']
>>> f(7, ['#','#','#','#','@','#','#','#','#'])
['#', '#', '#', '#', '@', '#', '#', '#', '#']
>>> f(7, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '.', '@', '.', '#', '#', '.', '#'] or ['#', '.', '.', '.', '.', '#', '#', '@', '#']

1) Questo non funziona per i casi di test in cui la direzione in cui il giocatore vuole spostarsi è occupata e la posizione corretta non è la prima ','(come nel caso dei casi di test 2, 3 e 5). 2) Il tuo formato I / O non sembra essere lo stesso della domanda. Indica il tuo formato I / O.
Luca,

Il tuo esempio f(9, ...non funziona: posiziona il personaggio su 2 ma le posizioni più vicine a 9 sono 6 e 8, quindi uno di questi dovrebbe essere scelto a caso (non c'è casualità nel tuo codice). Inoltre dovrebbe quindi girare intorno al perimetro trovando il prossimo più vicino, quindi f(9,list("####@#.##"))posizionare il personaggio nell'unico punto possibile (7 qui).
Jonathan Allan,

Grazie per aver segnalato gli errori Per me, la novità è che il codice l [4], l [l.index ('.')] = '. @' E l [l.index ('.')], L [4 ] = '@'. sono diversi
Кирилл Малышев,

@JonathanAllan, all'inizio non ho capito bene le regole. Spero di poter correggere correttamente il codice.
Кирилл Малышев,

Ancora non corretto, no. 1. l'esempio f(9, ...dovrebbe tornare list("#....##@#")(perché 8 è gratuito e vicino a 9). 2. Qualcosa del genere f(9,list("####@.#.#"))dovrebbe avere qualche possibilità di tornare list("####..#@#")(non sempre list("####.@#.#")) come specificato "Se entrambe le direzioni sono aperte, scegline una per spostarti a caso".
Jonathan Allan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.