Imprimir um quadro de desculpas

19

Eu estava apenas jogando o jogo de tabuleiro Desculpe! com algumas pessoas, e percebi que poderia basear alguns desafios interessantes. Este é bastante simples.

Sua tarefa é simplesmente produzir uma versão de um quadro de desculpas, colocando peças onde eu digo.

Especificações

Primeiro, aqui está uma imagem de um real Desculpe! placa para referência:

Desculpe!  Borda

O tabuleiro vazio se parece com:

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

Observe alguns recursos.

  • Os #quadrados são vazios.
  • Os S'e H' são Start e Home, respectivamente.
  • O >v<^início dos slides depende da direção que eles estão voltados.
  • Os |'s' e -'s são os meios de slides, dependendo se eles são horizontais ou verticais.
  • Os osão os finais dos slides.
  • Cada coluna é separada por uma coluna de espaços para torná-la mais quadrada.

Agora, aqui está o que você deve fazer:

  • Sua entrada é uma lista de coordenadas de várias peças que foram colocadas no quadro.
  • As coordenadas começam no 0quadrado fora do início da cor inferior (amarelo na figura) e aumentam em uma por quadrado no sentido horário.
  • Após esses 60 quadrados, as zonas seguras têm as próximas e as últimas 20 coordenadas, começando pela inferior (que fica entre 60 e 64) e depois no sentido horário.
  • Você terá que colocar as estrelas *na coordenada correta, substituindo o personagem abaixo de todos os jogadores.
  • Além disso, se algum dos jogadores estiver no quadrado inicial de um controle deslizante, mova-os para o final do controle deslizante antes de colocá-los.
  • Você pode assumir que não haverá colisões, antes ou depois de resolver os controles deslizantes.
  • Você não precisa se preocupar com o Lar ou o Lar.
  • Você pode ser indexado 1 se quiser, mas os casos de teste são indexados 0.

Casos de teste

[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 - - < #
Maltysen
fonte
11
Eu teria pensado que isso seria mais interessante se os valores fossem dados como distâncias dos respectivos quadrados iniciais (por exemplo, o primeiro caso de teste pode ser 0, 5e o segundo pode ser 2, 60, 37).
7116 Neil
@ Neil, como você saberia qual quadrado inicial usar?
Maltysen 07/12/19
Desculpe, presumi que você usasse os quadrados no sentido horário, mas acho que não seria muito justo para um jogo com 2 jogadores.
Neil
@Closevoters: O que não está claro sobre isso? Se você identificar algumas preocupações específicas, será mais fácil corrigi-las para que isso possa permanecer aberto.
DJMcMayhem
Minha confusão é sobre a indexação, antes e depois dos 60 anos e quando marcar os locais na seção inicial. Eu acho que se você esclarecesse mais seus exemplos, faria mais sentido. Caso contrário, parece bem legal.
21416 jacksonecac

Respostas:

1

Python 2, 476 bytes

Solução curta de 3 linhas ( Experimente 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)

Uma linha em 534 ( Experimente 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)

Eu assumo índices de zona segura desta maneira:

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

Explicação (as linhas são um pouco separadas para melhor compreensão):

# 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)
Gambá morto
fonte