Роздрукувати дошку жаль


19

Я просто грав у настільну гру Вибачте! з деякими людьми, і я зрозумів, що я можу зв'язати з цим кілька цікавих викликів. Цей досить простий.

Ви ставите перед собою завдання вивести версію дошки з жалем, розмістивши шматки там, де я вам скажу.

Технічні характеристики

По-перше, ось зображення фактичного вибачення! довідка:

Вибачте!  Правління

Порожня дошка виглядає так:

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

Зауважте кілька функцій.

  • Це #порожні квадрати.
  • У S«s і H» s є Start і будинок - х відповідно.
  • Це >v<^початок слайдів, залежно від того, в якому напрямку вони стикаються.
  • |«S і -» s є центрами гірок, в залежності від того, якщо вони горизонталі або по вертикалі.
  • У o«s є Енд слайдів.
  • Кожен стовпчик відокремлений стовпцем пробілів, щоб він виглядав більш квадратним.

Тепер ось що вам потрібно зробити:

  • Ваша інформація - це список координат різних фігур, розміщених на дошці.
  • Координати починаються на 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 - - < #

1
Я б подумав, що це буде цікавіше, якби значення задавалися як відстані від відповідних стартових квадратів (так, наприклад, перший тестовий випадок може бути, 0, 5а другий може бути 2, 60, 37).
Ніл

@Neil як би ти знав, який стартовий квадрат використовувати?
Малтісен

Вибачте, я припустив, що ви використовували квадрати за годинниковою стрілкою, але, мабуть, це було б не дуже справедливо для гри з двома гравцями.
Ніл

@Closevoters: Що незрозумілого в цьому? Якщо ви виявите деякі конкретні проблеми, це полегшить їх усунення, щоб це могло залишатися відкритим.
DJMcMayhem

Моя плутанина в тому, що стосується індексації, до і після досягнення 60 і коли потрібно позначити місця в домашньому розділі. Я думаю, якби ви більше пояснили свої приклади, це мало б більше сенсу. Інакше це виглядає досить круто.
jacksonecac

Відповіді:


1

Python 2, 476 байт

Коротке 3-лінійне рішення ( спробуйте його онлайн )

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.