Cetak Papan Maaf

19

Saya baru saja memainkan permainan papan Maaf! dengan beberapa orang, dan saya menyadari bahwa saya dapat mendasarkan beberapa tantangan menarik darinya. Yang ini cukup sederhana.

Tugas Anda hanyalah mengeluarkan versi dari papan maaf, menempatkan potongan-potongan di tempat yang saya beri tahu.

Spesifikasi

Pertama, ini adalah gambar Maaf yang sebenarnya ! papan untuk referensi:

Maaf!  Naik

Papan kosong terlihat seperti:

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

Perhatikan beberapa fitur.

  • Itu #adalah kotak kosong.
  • Tanda S'dan H' adalah masing-masing Mulai dan Rumah.
  • Ini >v<^adalah awal dari slide, tergantung pada arah mana yang mereka hadapi.
  • Tanda |'dan -' adalah bagian tengah dari slide, tergantung pada apakah itu horisontal atau vertikal.
  • Ini oadalah akhir dari slide.
  • Setiap kolom dipisahkan oleh kolom spasi untuk membuatnya terlihat lebih seperti persegi.

Inilah yang harus Anda lakukan:

  • Input Anda adalah daftar koordinat berbagai bagian yang telah ditempatkan di papan tulis.
  • Koordinat mulai di 0di alun-alun di luar Mulai dari warna bawah (kuning pada gambar), dan meningkat satu per persegi searah jarum jam.
  • Setelah 60 kotak ini, zona aman memiliki 20 koordinat berikutnya dan terakhir, mulai dari yang di bawah (yang mendapat 60-64), kemudian bergerak searah jarum jam.
  • Anda harus menempatkan bintang di *koordinat yang benar, menggantikan karakter di bawahnya untuk semua pemain.
  • Selain itu, jika ada pemain yang berada di kotak awal slider, pindahkan mereka ke ujung slider sebelum menempatkannya.
  • Anda dapat mengasumsikan bahwa tidak akan ada tabrakan, sebelum atau setelah menyelesaikan slider.
  • Anda tidak perlu khawatir tentang Rumah atau Mulai.
  • Anda dapat diindeks 1 jika diinginkan, tetapi kotak uji diindeks 0.

Uji Kasus

[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
sumber
1
Saya akan berpikir ini akan lebih menarik jika nilai diberikan sebagai jarak dari masing-masing kotak mulai (jadi misalnya kasus uji pertama mungkin 0, 5dan yang kedua mungkin 2, 60, 37).
Neil
@ Neil, bagaimana Anda tahu yang mulai kuadrat untuk digunakan?
Maltysen
Maaf, saya berasumsi bahwa Anda menggunakan kotak dalam urutan searah jarum jam, tapi saya kira itu tidak akan sangat adil untuk permainan 2 pemain.
Neil
@Closevoters: Apa yang tidak jelas tentang ini? Jika Anda mengidentifikasi beberapa masalah tertentu, itu akan membuatnya lebih mudah untuk memperbaikinya sehingga ini bisa tetap terbuka.
DJMcMayhem
Kebingungan saya adalah tentang pengindeksan, sebelum dan sesudah 60 telah tercapai dan kapan harus menandai lokasi di bagian beranda. Saya pikir jika Anda lebih banyak mengklarifikasi contoh Anda, itu akan lebih masuk akal. Kalau tidak, itu terlihat sangat keren.
jacksonecac

Jawaban:

1

Python 2, 476 byte

Solusi 3 garis pendek ( Coba 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 di 534 ( Coba 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)

Saya menganggap indeks zona aman dengan cara ini:

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

Penjelasan (garis dipisahkan sedikit untuk pemahaman yang lebih baik):

# 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)
Possum Mati
sumber