Dừng bước vào tường!


16

Một số lượt thích giả mạo dựa trên văn bản không cho phép bạn đi vào tường và cho bạn di chuyển trở lại nếu bạn cố gắng. Tại sao làm điều đó khi bạn có thể làm cho người chơi di chuyển theo hướng hợp lệ gần nhất?

Các thách thức

Viết chương trình hàm, đưa ra một hướng và 3 lưới 3 ký tự, xuất ra cùng một lưới sau khi người chơi đã thực hiện một bước.

Ví dụ,

9
#..
.@#
#.#

trở thành

#.@
..#
#.#

Đầu vào

  • Hướng được đưa ra bởi một chữ số duy nhất từ ​​1 đến 9, mỗi hướng tương ứng với 8 hướng hồng y và đứng yên. Điều này được bắt nguồn từ vị trí tương đối của các số trên bàn phím:

    Tây Bắc
    .. \ | /
    ... 7 8 9
    W- 4 5 6 -E
    ... 1 2 3
    ../ | \
    SW S SE
    
    Tuy nhiên, bạn cũng có thể sử dụng các số 123, 456, 789 thay vì 789, 456, 123. Nói cách khác, bạn có thể hoán đổi 2 hàng hoặc số trên cùng và dưới cùng nếu bạn chọn. Đây là 2 kết hợp chỉ số chấp nhận được.

  • Lưới 3 nhân 3 sẽ bao gồm 3 ký tự ASCII có thể in riêng biệt, đại diện cho sàn, tường và người chơi có thể đi bộ. (Trong các trường hợp thử nghiệm, .được sử dụng cho sàn, #s là tường và @là trình phát)

  • Bạn có thể chọn những ký tự mà chương trình của bạn sử dụng, nhưng bạn phải nêu chúng trong câu trả lời của bạn và chúng phải nhất quán qua nhiều thử nghiệm.
  • Ký tự đại diện cho nhân vật sẽ luôn ở giữa lưới 3 x 3 và hướng sẽ luôn nằm trong khoảng từ 1 đến 9 (bao gồm)
  • Bạn có thể nhận đầu vào theo thứ tự bất kỳ
  • Lưới 3 by 3 có thể được nhập vào dưới dạng mảng char, mảng chuỗi, chuỗi 9 độ dài hoặc thay thế hợp lý khác.

Đầu ra

  • Trả về từ một hàm hoặc xuất ra StdOut hoặc thay thế gần nhất
  • Không gian lưu trữ và dòng mới được cho phép
  • Bạn phải sử dụng các biểu diễn ký tự giống như đầu vào
  • Các định dạng tương tự được phép cho đầu vào được phép cho đầu ra

Cách người chơi di chuyển

Nếu hướng được chỉ định bị chặn bởi tường (ví dụ: nếu ví dụ trên có hướng 6), thì hãy nhìn vào 2 hướng gần nhất:

  • Nếu một (và chỉ một) hướng là miễn phí, hãy di chuyển người chơi theo hướng đó.
  • Nếu không có hướng nào là miễn phí, hãy nhìn vào 2 hướng gần nhất tiếp theo (không bao gồm hướng 5). Nếu bạn đã quấn quanh và không tìm thấy hướng mở (người chơi bị bao quanh bởi các bức tường), đừng di chuyển người chơi
  • Nếu cả hai hướng đều mở, hãy chọn một hướng để di chuyển ngẫu nhiên (mặc dù không nhất thiết phải thống nhất).

Nếu hướng đã cho là 5, không di chuyển người chơi

Các trường hợp thử nghiệm

( #= tường, .= sàn, @= người chơi)

Đầu vào:

9
# ..
. @ #
#. #

Đầu ra:

#. @
.. #
#. #


Đầu vào:

3
# ..
. @ #
#. #

Đầu ra:

# ..
.. #
# @ #


Đầu vào:

7
##.
# @ #
.. #

Đầu ra:

## @ ##.
#.# hoặc là #.#
.. # @. #


Đầu vào:

5
...
. @.
...

Đầu ra:

...
. @.
...


Đầu vào:

2
###
# @ #
###

Đầu ra:

###
# @ #
###

Chấm điểm

Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.


Không dùng yuhjklbn? YÊN NGHỈ.
Rɪᴋᴇʀ

Ngoài ra, tôi không thực sự thích phần "chọn một hướng thay thế" nhiều như vậy. Nó khác với phần khác của thử thách, đó là "di chuyển người chơi theo một hướng và đầu ra cụ thể." Đó chỉ là sở thích cá nhân.
Rɪᴋᴇʀ

1
Phần này khó hiểu: "Nếu không có hướng nào là miễn phí, hãy nhìn vào 2 hướng gần nhất tiếp theo."
Leaky Nun

1
Chúng ta có thể gán một số thay vì một ký tự ASCII cho mỗi phần tử, sau đó lấy đầu vào làm danh sách 2 chiều không? Hay họ phải là chuỗi?
Scott Milner

2
Tôi có thể sử dụng các hướng dẫn 123;456;789thay vì 789;456;123?
Nữ tu bị rò rỉ

Câu trả lời:


2

Pyth - 73 70 byte

Kmsd"78963214"DPGJXXYt@K+xKQG\@4\.R?q/J\#/Y\#Jk=YwV5=GflTmPd(N_N)IGOGB

Thử nó

Đầu vào bao gồm hai dòng:

Dòng thứ 1: hướng di chuyển

Dòng thứ 2: Bảng (vị trí 123456789, với 123 là hàng trên cùng)


3

JavaScript (ES6), 192 163 byte

a=>b=>a[(a[4]=0)+--b]?(A=(c,d)=>c==b|(e=a[c])-(f=a[d])|!e?(a[c-b?(e?e<f:new Date&1)?c:d:4]=2,a):A(+g[c],+h[d]))(+(g="3016X2785")[b],+(h="1250X8367")[b]):(a[b]=2,a)

Ghi chú

Chức năng này sử dụng một định dạng đầu vào đặc biệt. Đầu vào đầu tiên là một mảng các số nguyên ( 0for floor, 1for wall2for player) đại diện cho bản đồ. Đầu vào thứ hai là hướng (lật): 1là hướng tây bắc, 2là hướng bắc,3 hướng đông bắc, 4hướng tây v.v ... Các đầu vào phải được đưa ra thông qua cú pháp currying ( Z(a)(b)).

Các trường hợp thử nghiệm

Các bản đồ và hướng dẫn đã được sửa đổi cho phù hợp với định dạng đầu vào của tôi.

Z=
a=>b=>a[(a[4]=0)+--b]?(A=(c,d)=>c==b|(e=a[c])-(f=a[d])|!e?(a[c-b?(e?e<f:new Date&1)?c:d:4]=2,a):A(+g[c],+h[d]))(+(g="3016X2785")[b],+(h="1250X8367")[b]):(a[b]=2,a)

testcases = [
    [[1,0,0,0,2,1,1,0,1], 3],
    [[1,0,0,0,2,1,1,0,1], 9],
    [[1,1,0,1,2,1,0,0,1], 1],
    [[0,0,0,0,2,0,0,0,0], 5],
    [[1,1,1,1,2,1,1,1,1], 2]
]
for (test of testcases) {
    console.log(Z(test[0])(test[1]))
}


1

Python 3, 120 104 153 176 175 byte

def f(n,l):
 n-=1
 if n!=4and'.'in l:l[sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)[1][0]],l[4]='@.'
 return l

Hãy thử trực tuyến!

Phương pháp này nhận được hướng và danh sách '.', '#' Và '@'. Các chỉ mục bắt đầu bằng 1 đến 9 (thực sự có 0 đến 8 trong danh sách). Vì vậy, nó có hình thức

123 
456
789 

Phương pháp trả về danh sách mới với vị trí mới.

Đường thẳng này

sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)

trả về một danh sách loại này:

>>>n=7
>>> l=['#','#','#','.','@','#','.','#','.']
>>> sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)
[(4, '@'), (8, '.'), (6, '.'), (3, '.'), (7, '#'), (5, '#'), (1, '#'), (0, '#'), (2, '#')]

Chúng tôi tính toán khoảng cách đến các điểm miễn phí và thêm tính ngẫu nhiên. Bởi vì ord('#') <= ord('.') - 8 and ord('.') + 8 <= ord('@')chúng ta có thể nói rằng gần nhất '.' cho n = 7 (chỉ mục trong danh sách) có chỉ số là 8.

nhập mô tả hình ảnh ở đây

Thí dụ:

>>> f(9, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '.', '.', '.', '#', '#', '@', '#']
>>> f(3, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '@', '.', '.', '#', '#', '.', '#']
>>> f(5, ['.','.','#','.','@','.','#','.','#'])
['.', '.', '#', '.', '@', '.', '#', '.', '#']
>>> f(7, ['#','#','#','#','@','#','#','#','#'])
['#', '#', '#', '#', '@', '#', '#', '#', '#']
>>> f(7, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '.', '@', '.', '#', '#', '.', '#'] or ['#', '.', '.', '.', '.', '#', '#', '@', '#']

1) Điều này không hoạt động đối với các trường hợp thử nghiệm trong đó hướng mà người chơi muốn di chuyển bị chiếm giữ và vị trí chính xác không phải là vị trí đầu tiên ','(đó là trường hợp đối với các trường hợp thử nghiệm 2, 3 và 5). 2) Định dạng I / O của bạn dường như không giống như trong câu hỏi. Vui lòng đề cập đến định dạng I / O của bạn.
Lu-ca

Ví dụ của bạn f(9, ...không hoạt động - nó đặt ký tự ở 2 nhưng vị trí gần nhất với 9 là 6 và 8, do đó, một trong số đó phải được chọn ngẫu nhiên (không có sự ngẫu nhiên trong mã của bạn). Hơn nữa, sau đó nó sẽ đi xung quanh chu vi để tìm vị trí gần nhất tiếp theo, vì vậy f(9,list("####@#.##"))nên đặt nhân vật vào vị trí duy nhất có thể (7 ở đây).
Jonathan Allan

Cảm ơn đã chỉ ra lỗi cho tôi, tin tức là mã l [4], l [l.index ('.')] = '. @' Và l [l.index ('.')], L [4 ] = '@.' khác nhau
Кирилл Малышев

@Jonathan ALLan, ban đầu tôi không hiểu lắm về các quy tắc. Tôi hy vọng tôi có thể sửa mã chính xác.
Ứng dụng này có

Vẫn không đúng, không. 1. ví dụ f(9, ...sẽ trả về list("#....##@#")(vì 8 là miễn phí và bên cạnh 9). 2. Một cái gì đó giống như f(9,list("####@.#.#"))sẽ có một số cơ hội quay trở lại list("####..#@#")(không phải luôn luôn list("####.@#.#")) như được chỉ định "Nếu cả hai hướng đều mở, hãy chọn một hướng để di chuyển ngẫu nhiên".
Jonathan Allan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.