Wydrukuj przepraszam


19

Właśnie grałem w grę planszową Przepraszamy! z niektórymi ludźmi i zdałem sobie sprawę, że mogę na tym oprzeć kilka interesujących wyzwań. Ten jest dość prosty.

Twoim zadaniem jest po prostu wersję przepraszającej planszy, umieszczając elementy tam, gdzie ci powiem.

Okular

Po pierwsze, oto obraz faktycznego Przepraszamy! tablica odniesienia:

Przepraszam!  Tablica

Pusta tablica wygląda jak:

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

Zwróć uwagę na kilka funkcji.

  • To #puste kwadraty.
  • Te Si Hsą odpowiednio Start i Home.
  • >v<^to początki slajdów, w zależności od kierunku, w którym są skierowane.
  • |„S i -” s są środkowe zjeżdżalni, w zależności czy są poziome lub pionowe.
  • To okoniec slajdów.
  • Każda kolumna jest oddzielona kolumną spacji, aby wyglądała bardziej kwadratowo.

Oto, co musisz zrobić:

  • Twój wkład to lista współrzędnych różnych elementów, które zostały umieszczone na planszy.
  • Współrzędne zaczynają się 0od kwadratu poza początkiem dolnego koloru (żółty na zdjęciu) i zwiększają się o jeden na kwadrat zgodnie z ruchem wskazówek zegara.
  • Po tych 60 kwadratach strefy bezpieczne mają następne i ostatnie 20 współrzędnych, zaczynając od tej na dole (która dostaje 60-64), a następnie idąc zgodnie z ruchem wskazówek zegara.
  • Będziesz musiał umieścić gwiazdę ( *-y) na właściwej współrzędnej, zastępując postać pod spodem dla wszystkich graczy.
  • Dodatkowo, jeśli któryś z graczy znajduje się na polu startowym suwaka, przesuń go na koniec suwaka przed umieszczeniem go.
  • Możesz założyć, że nie będzie kolizji przed lub po rozwiązaniu suwaków.
  • Nie musisz się martwić o Dom lub Start.
  • Jeśli chcesz, możesz być indeksowany jako 1, ale przypadki testowe są indeksowane jako 0.

Przypadki testowe

[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
Pomyślałbym, że byłoby to bardziej interesujące, gdyby wartości podano jako odległości od odpowiednich kwadratów początkowych (tak na przykład może być pierwszy przypadek testowy, 0, 5a drugi może być 2, 60, 37).
Neil,

@ Nee skąd miałbyś wiedzieć, którego kwadratu początkowego użyć?
Maltysen

Przepraszam, założyłem, że używałeś kwadratów w kolejności zgodnej z ruchem wskazówek zegara, ale sądzę, że nie byłoby to fair w przypadku gry dla dwóch graczy.
Neil,

@Closevoters: Co jest niejasne? Jeśli zidentyfikujesz jakieś szczególne obawy, łatwiej je rozwiązać, aby pozostało otwarte.
DJMcMayhem

Moje zamieszanie dotyczy indeksowania, przed osiągnięciem 60 i po nim oraz kiedy oznaczyć lokalizacje w sekcji głównej. Myślę, że jeśli bardziej szczegółowo wyjaśnisz swoje przykłady, miałoby to większy sens. W przeciwnym razie wygląda całkiem fajnie.
jacksonecac

Odpowiedzi:


1

Python 2, 476 bajtów

Krótkie rozwiązanie 3-liniowe ( wypróbuj 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 w 534 ( Wypróbuj 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)

Zakładam wskaźniki bezpiecznej strefy w ten sposób:

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

Objaśnienie (linie są nieco oddzielone dla lepszego zrozumienia):

# 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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.