Stampa una scheda Sorry


19

Stavo solo giocando al gioco da tavolo Scusa! con alcune persone, e mi sono reso conto che avrei potuto basarmi su alcune sfide interessanti. Questo è piuttosto semplice.

Il tuo compito è semplicemente quello di produrre una versione di una tavola dispiaciuta, posizionando i pezzi dove ti dico.

Specifiche

Innanzitutto, ecco l'immagine di un vero Mi dispiace! scheda di riferimento:

Scusate!  Tavola

La scheda vuota appare come:

# > - - o # # # # > - - - o # #
#   #   S                     v
o   #             H # # # # # |
|   #                         |
|   #                       S o
|   #                         #
^   H                         #
#                             #
#                             #
#                         H   v
#                         #   |
o S                       #   |
|                         #   |
| # # # # # H             #   o
^                     S   #   #
# # o - - - < # # # # o - - < #

Notare alcune funzionalità.

  • Le #'s sono quadrati vuoti.
  • Gli S'e H' sono rispettivamente Start e Home.
  • Le >v<^'s sono l'inizio delle slitte, a seconda della direzione che devono affrontare.
  • Gli |"e -" sono i medi delle diapositive, a seconda che siano orizzontali o verticali.
  • I o's sono il fine è di diapositive.
  • Ogni colonna è separata da una colonna di spazi per renderla più quadrata.

Ora ecco cosa devi fare:

  • Il tuo input è un elenco di coordinate di vari pezzi che sono stati posizionati sul tabellone.
  • Le coordinate iniziano nel 0riquadro esterno all'inizio del colore di fondo (giallo nell'immagine) e aumentano di uno per quadrato in senso orario.
  • Dopo questi 60 quadrati, le zone sicure hanno le successive e le ultime 20 coordinate, iniziando da quella in basso (che ottiene 60-64), quindi procedendo in senso orario.
  • Dovrai posizionare le stelle *sulla coordinata corretta, sostituendo il personaggio sottostante per tutti i giocatori.
  • Inoltre, se qualcuno dei giocatori si trova nella casella iniziale di un cursore, spostali alla fine del cursore prima di posizionarli.
  • Puoi presumere che non ci saranno collisioni, prima o dopo aver risolto i cursori.
  • Non devi preoccuparti di Home o Start.
  • Puoi essere 1-indicizzato se vuoi, ma i casi di test sono 0-indicizzati.

Casi test

[0, 20] ->

# > - - o # # # # > - - - o # #
#   #   S                     v
*   #             H # # # # # |
|   #                         |
|   #                       S o
|   #                         #
^   H                         #
#                             #
#                             #
#                         H   v
#                         #   |
o S                       #   |
|                         #   |
| # # # # # H             #   o
^                     S   #   #
# # o - - - < # # # # * - - < #

[2, 7, 66] ->

# > - - o # # # # > - - - o # #
#   #   S                     v
o   #             H # # # # # |
|   #                         |
|   #                       S o
|   #                         #
^   H                         #
#                             #
#                             #
#                         H   v
#                         #   |
o S                       #   |
|                         #   |
| # * # # # H             #   o
^                     S   #   #
# # o - * - < # # * # o - - < #

1
Avrei pensato che sarebbe stato più interessante se i valori fossero stati dati come distanze dai rispettivi quadrati di partenza (quindi ad esempio il primo caso di test potrebbe essere 0, 5e il secondo potrebbe essere 2, 60, 37).
Neil,

@Neil come faresti a sapere quale punto iniziale utilizzare?
Maltysen,

Mi spiace, supponevo che tu avessi usato i quadrati in senso orario, ma immagino che non sarebbe giusto per una partita a 2 giocatori.
Neil,

@Closevoters: cosa non è chiaro al riguardo? Se si identificano alcuni problemi specifici, sarà più facile risolverli in modo che questo rimanga aperto.
DJMcMayhem

La mia confusione riguarda l'indicizzazione, prima e dopo che sono stati raggiunti i 60 e quando contrassegnare le posizioni nella sezione home. Penso che se chiarissi di più i tuoi esempi avrebbe più senso. Altrimenti sembra piuttosto bello.
jacksonecac,

Risposte:


1

Python 2, 476 byte

Breve soluzione a 3 righe ( provalo online )

s=map(list,''.join(b if b in'#^v<>-|oSH~'else' '*int(b,16)for b in "#>--o####>---o##~#1#1SAv~o1#6H#####|~|1#C|~|1#BSo~|1#C#~^1HC#~#E#~#E#~#CH1v~#C#1|~oSB#1|~|C#1|~|#####H6#1o~^AS1#1#~##o---<####o--<#").split('~'))
for i in input():x,y=(lambda n:([11-n,15]*12+[0,26-n]*14+[n-26,0]*16+[15,n-41]*14+[71-n,15]*4+[13,n-50]*5+[70-n,13]*5+[2,75-n]*5+[n-65,2]*5)[2*n:2*n+2])((lambda n:4if n in[5,20,35,50]else 3if n in[12,27,42,57]else 0)(i)+i);s[y][x]='*'
for r in s:print' '.join(r)

One-liner in 534 ( provalo online ):

for r in(lambda B,I:[[[i,j]in map(lambda n:([11-n,15]*12+[0,26-n]*14+[n-26,0]*16+[15,n-41]*14+[71-n,15]*4+[13,n-50]*5+[n-64,13]*5+[2,75-n]*5+[n-65,2]*5)[2*n:2*n+2],map(lambda n:n+4if n in[5,20,35,50]else n+3if n in[12,27,42,57]else n,I))and'*'or b for i,b in enumerate(a)]for j,a in enumerate(B)])(map(list,''.join(b if b in'#^v<>-|oSH~'else' '*int(b,16)for b in"#>--o####>---o##~#1#1SAv~o1#6H#####|~|1#C|~|1#BSo~|1#C#~^1HC#~#E#~#E#~#CH1v~#C#1|~oSB#1|~|C#1|~|#####H6#1o~^AS1#1#~##o---<####o--<#").split('~')),input()):print' '.join(r)

Presumo indici di zona sicura in questo modo:

#  >  -  -  o  #  #  #  #  >  -  -  -  o  #  #
#     74    S                                v
o     73                   H 75 76 77 78 79  |
|     72                                     |
|     71                                  S  o
|     70                                     #
^     H                                      #
#                                            #
#                                            #
#                                      H     v
#                                      60    |
o  S                                   61    |
|                                      62    |
|  69 68 67 66 65 H                    63    o
^                                S     64    #
#  #  o  -  -  -  <  #  #  #  #  o  -  -  <  #

Spiegazione (le linee sono un po 'separate per una migliore comprensione):

# Hardcode board. Spaces are changed to their number in hex (as there are up to 14 spaces in row)
# Unfortunatly v^<> characters made board non-symmetrical and replacing chars costs too much in python, so I had to hardcode it all
B="#>--o####>---o##~#1#1SAv~o1#6H#####|~|1#C|~|1#BSo~|1#C#~^1HC#~#E#~#E#~#CH1v~#C#1|~oSB#1|~|C#1|~|#####H6#1o~^AS1#1#~##o---<####o--<#"

# Encode board to list of lists of characters
s=map(list,''.join(b if b in'#^v<>-|oSH~'else' '*int(b,16)for b in B).split('~'))

# Map coordinates, based on n (awfully long)
# Creates long list (lenght of 80) with values based on n and only one valid, which occures under index n
l=lambda n:([11-n,15]*12+[0,26-n]*14+[n-26,0]*16+[15,n-41]*14+[71-n,15]*4+[13,n-50]*5+[70-n,13]*5+[2,75-n]*5+[n-65,2]*5)[2*n:2*n+2]

# Returns additional move of n if it appers to be on slide start
j=lambda n:4if n in[5,20,35,50]else 3if n in[12,27,42,57]else 0

# Here takes input as list of numbers, get coordinates for them and update board with *
for i in input():x,y=l(j(i)+i);s[y][x]='*'

# Print board, spacing characters with one whitespace
for r in s:print' '.join(r)
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.