Распечатать доску

19

Я просто играл в настольную игру Извините! с некоторыми людьми, и я понял, что смогу решить несколько интересных задач. Это довольно просто.

Ваша задача просто вывести версию жалкой доски, размещая фрагменты там, где я вам говорю.

Спекуляции

Во-первых, вот изображение фактического извините! доска для справки:

Сожалею!  доска

Пустая доска выглядит так:

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

Обратите внимание на несколько особенностей.

  • Это #пустые квадраты.
  • «И S» и H«Начало» и «Дом» соответственно.
  • Это >v<^начало слайдов, в зависимости от того, в каком направлении они смотрят.
  • Символы |'s' и -'s' - это середина слайдов, в зависимости от того, горизонтальные они или вертикальные.
  • Это oконец слайдов.
  • Каждый столбец разделен столбцом пробелов, чтобы он выглядел более квадратным.

Теперь вот что вы должны сделать:

  • Ваш вход представляет собой список координат различных фигур, которые были размещены на доске.
  • Координаты начинаются 0с квадрата за пределами начала нижнего цвета (желтый на рисунке) и увеличиваются на единицу на квадрат по часовой стрелке.
  • После этих 60 квадратов безопасные зоны имеют следующие и последние 20 координат, начиная с той, что внизу (которая получает 60-64), и затем по часовой стрелке.
  • Вам нужно будет поставить звездочки ( *ы) в правильные координаты, заменив персонажа внизу для всех игроков.
  • Кроме того, если кто-либо из игроков находится на начальном поле слайдера, перед размещением переместите его в конец слайдера.
  • Вы можете предположить, что не будет никаких коллизий, до или после разрешения ползунков.
  • Вам не нужно беспокоиться о домах или старте.
  • Вы можете быть 1-проиндексированы, если хотите, но тестовые примеры 0-индексированы.

Тестовые случаи

[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
источник
1
Я бы подумал, что это было бы более интересно, если бы значения были даны как расстояния от соответствующих начальных квадратов (например, первый тестовый пример может быть, 0, 5а второй может быть 2, 60, 37).
Нил
@ Нейл, откуда ты знаешь, какой квадрат начать использовать?
Maltysen
Извините, я предположил, что вы использовали квадраты по часовой стрелке, но я думаю, что это не очень справедливо для игры на двоих.
Нил
@Closevoters: Что неясно по этому поводу? Если вы выявите какие-то конкретные проблемы, вам будет легче устранить их, чтобы они оставались открытыми.
DJMcMayhem
Моя путаница связана с индексированием, до и после 60, и когда отмечать места в домашнем разделе. Я думаю, если бы вы разъяснили свои примеры больше, это имело бы больше смысла. В остальном это выглядит довольно круто.
Jacksonecac

Ответы:

1

Python 2, 476 байт

Короткое трехстрочное решение ( попробуйте онлайн )

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)

Однострочник в 534 ( попробуйте онлайн ):

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)

Я предполагаю показатели безопасной зоны следующим образом:

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

Пояснение (строки немного разделены для лучшего понимания):

# 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)
Мертвый Опоссум
источник