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.