Hiệp sĩ điền vào một lưới


15

Một hiệp sĩ điền vào là một trận lụt bằng cách sử dụng kết nối của quân cờ hiệp sĩ. Đặc biệt:

 1 1
1   1
  0
1   1
 1 1

(0 là điểm ban đầu, 1 giây hiển thị các ô được kết nối)

Thử thách

Đưa ra một lưới 2D của không gian và các bức tường, và một vị trí ban đầu, thực hiện một hiệp sĩ điền vào lưới. Mã ngắn nhất sẽ thắng.

Quy tắc

  • Bạn có thể lấy đầu vào và tạo đầu ra ở bất kỳ định dạng nào bạn thích (hình ảnh, chuỗi, mảng, bất cứ thứ gì). Bạn có thể lấy vị trí ban đầu làm một phần của lưới đầu vào hoặc làm tọa độ riêng. Với mục đích giải thích này, định dạng sau sẽ được sử dụng:

    ########    # = wall
    ########    x = initial location
    ## x  ##
    ##    ##
    ########
    ##    ##
    ########
    ########
    
  • Đầu ra là một bản sao của lưới đầu vào với kết quả điền vào hiệp sĩ được thêm vào

  • Điền của bạn không được có cùng "màu" với không gian hoặc tường, nhưng có thể giống với điểm đánh dấu vị trí ban đầu. Ví dụ: được cung cấp hình ảnh ở trên, một đầu ra hợp lệ sẽ là:

    ########    # = wall
    ########    @ = fill (could also have been x)
    ## @ @##
    ## @ @##
    ########
    ##@ @ ##
    ########
    ########
    
  • Bạn có thể giả định rằng lưới đầu vào sẽ luôn chứa một bức tường 2 ô ở tất cả các phía

  • Bạn có thể cho rằng vị trí ban đầu sẽ không bao giờ ở trong tường
  • Bạn có thể cho rằng lưới sẽ không bao giờ lớn hơn 1000x1000
  • Nội tích ổn
  • Mã ngắn nhất (tính bằng byte) thắng

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

Trong tất cả các trường hợp thử nghiệm, #biểu thị một bức tường, biểu thị không gian trống và xbiểu thị vị trí ban đầu của vật liệu lấp. @biểu thị điền vào đầu ra.

Input 1:

########
########
## x  ##
##    ##
########
##    ##
########
########

Output 1:

########
########
## @ @##
## @ @##
########
##@ @ ##
########
########

Input 2:

############
############
## ##    x##
## ##     ##
#####     ##
##        ##
############
############

Output 2:

############
############
## ##@@@@@##
##@##@@@@@##
#####@@@@@##
## @@@@@@@##
############
############

Input 3:

####################
####################
##  ##            ##
##  ##            ##
##  ##  ########  ##
##  ##  ########  ##
##  ##  ##    ##  ##
##  ##  ##    ##  ##
##  ##  ##    ##  ##
##  ##  ##    ##  ##
##  ##  ########  ##
##  ##  ########  ##
##  ##        ##  ##
##  ##       x##  ##
##  ############  ##
##  ############  ##
##                ##
##                ##
####################
####################

Output 3:

####################
####################
##@@##@@@@@@@@@@@@##
##@@##@@@@@@@@@@@@##
##@@##@@########@@##
##@@##@@########@@##
##@@##@@##    ##@@##
##@@##@@##    ##@@##
##@@##@@##    ##@@##
##@@##@@##    ##@@##
##@@##@@########@@##
##@@##@@########@@##
##@@##@@@@@@@@##@@##
##@@##@@@@@@@@##@@##
##@@############@@##
##@@############@@##
##@@@@@@@@@@@@@@@@##
##@@@@@@@@@@@@@@@@##
####################
####################

Input 4:

################
################
##           ###
##     x     ###
##  #######  ###
##  #######  ###
##  ##   ##  ###
##  ##   ##  ###
##  ##   ##  ###
##  ########  ##
##  ########  ##
##        ##  ##
##        ##  ##
################
################

Output 4:

################
################
##   @   @   ###
## @   @   @ ###
##  #######  ###
##@ ####### @###
##  ##   ##  ###
## @##   ##@ ###
##  ##   ##  ###
##@ ########@ ##
##  ########  ##
## @   @  ## @##
##   @   @##  ##
################
################

Input 5:

##############
##############
##         ###
##         ###
##         ###
##   ###   ###
##   #x#   ###
##   ###   ###
##         ###
##         ###
##         ###
##############
##############

Output 5:

##############
##############
##@@@@@@@@@###
##@@@@@@@@@###
##@@@@@@@@@###
##@@@###@@@###
##@@@#@#@@@###
##@@@###@@@###
##@@@@@@@@@###
##@@@@@@@@@###
##@@@@@@@@@###
##############
##############

Câu trả lời:


4

Octave, 73 byte

function a=F(s,a)do;b=a;until(a=~s&imdilate(a,de2bi(")0#0)"-31)))==b;a+=s

Demo trực tuyến!

* Một số thay đổi được áp dụng để chạy trong rextester.

Hàm lấy mảng 2d là 0 & 2 làm tường và mảng 0 & 1 làm vị trí ban đầu và xuất ra mảng 0 & 1 & 2.


Có vẻ tốt, nhưng không cần điều này pkg load ...khi chạy bên ngoài khung kiểm tra? Nếu imdilate& de2bicó sẵn mà không cần nhập khẩu rõ ràng thì không sao.
Dave

@Dave Trong các phiên bản trước của octave, bao gồm cả phiên bản được cài đặt trong tio, có thể cài đặt một gói để nó có thể tải tự động nhưng bây giờ tôi nhận thấy rằng tính năng này đã bị xóa khỏi quãng tám! xin vui lòng xem điều này .
rahnema1

Đủ công bằng. Miễn là bạn đang nhắm mục tiêu một phiên bản trước đó -autođã bị xóa thì không vấn đề gì và tôi đoán câu trả lời này không sử dụng bất kỳ tính năng mới nào.
Dave

3

JavaScript (ES6), 116 byte

f=(s,l=s.search`
`,t=s.replace(eval(`/(x| )([^]{${l-2}}(....)?|[^]{${l+l}}(..)?)(?!\\1)[x ]/`),'x$2x'))=>s==t?s:f(t)

v=(s,l=s.search`
`)=>!/^(#+)\n\1\n[^]*x[^]*\n\1\n\1$/.test(s)|s.split`
`.some(s=>s.length-l|!/^##.+##$/.test(s))&&`Invalid Input`
textarea{font-family:monospace}
<textarea rows=11 cols=33 oninput=o.value=v(this.value)||f(this.value)></textarea><textarea rows=11 cols=33 id=o reaodnly></textarea>

Dựa trên câu trả lời của tôi để phát hiện các lâu đài không thành công . Điền vào sử dụng xs.


Bạn có thể thêm một đoạn kiểm tra / liên kết?
chính thức tuyên bố

2

Python 3 , 394 387 381 356 352 347 319 313 154 139 byte

  • 154 byte sau khi chỉ đếm hàm lõi chứ không phải hàm liên quan đến định dạng I / O
  • đã lưu 7 byte: nhờ @Jacoblaw và @ Mr.Xcoder: except:0
  • đã lưu 28 byte !!!: Cảm ơn @ovs: đã thoát khỏi try: exceptkhối và một số golf khác
  • Cảm ơn @Dave cho mô-đun thử nghiệm đẹp.
  • đã lưu 6 byte: g[(a,b)]như chỉg[a,b]
  • @ đã lưu 15 byte !!! :
def x(g,a,b,m):
 if(a,b)in g and"!">g[a,b]or m:
  g[a,b]="@"
  for i in 1,2,-1,-2:
   for j in 3-abs(i),abs(i)-3:g=x(g,a+i,b+j,0)
 return g

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


1
bạn có thể làm except:passthay thế?
jacoblaw

1
Tôi khá chắc chắn rằng điều này có thể được chơi rất nhiều
Ông

2
@jacoblaw thậm chí còn tốt hơn:except:0
Ông Xcoder


1
Đây là phiên bản thử nghiệm dễ dàng hơn một chút của TiO: Dùng thử trực tuyến!
Dave

1

Toán học, 117 byte

Câu chuyện thông thường: xây dựng mạnh mẽ nhưng tên dài

HighlightGraph[g,ConnectedComponents[h=Subgraph[g=KnightTourGraph@@Dimensions@#,Flatten@#~Position~1],#2]~Prepend~h]&

Hãy thử nó tại hộp cát Wolfram!

Phải có hai đầu vào: đầu tiên là lưới đầu vào dưới dạng một mảng 0s (đối với các bức tường) và1 s (cho các khoảng trắng), sau đó là một số nguyên duy nhất cho vị trí bắt đầu, được tìm thấy bằng cách đánh số lưới dọc theo các hàng từ trên xuống dưới, ví dụ

1  2  3  4  5
6  7  8  9  10
11 12 13 14 ...

Bạn có thể gọi hàm như thế nào HighlightGraph[...~Prepend~h]&[{{0,0,...,0}, {0,0,...,0}, ..., {0,0,...,0}}, 20].

Các KnightTourGraphchức năng xây dựng một đồ thị với các đỉnh tương ứng với các vị trí trong lưới điện và các cạnh tương ứng với di chuyển knight hợp lệ, sau đó chúng tôi lấy Subgraphcủa các đỉnh mà không phải là bức tường, và tìm ra ConnectedComponentscác đỉnh bắt đầu. Đầu ra là một biểu đồ (được hiển thị xoay 90 độ ngược chiều kim đồng hồ) với các đỉnh không tường được tô sáng màu đỏ và các đỉnh được tô màu vàng. Ví dụ: đối với trường hợp thử nghiệm đầu tiên, đầu ra trông như sau:

Đầu ra cho trường hợp thử nghiệm 1: biểu đồ với một số khu vực được tô sáng


Vâng, điều này chắc chắn trông giống như khó kiểm tra nhất! Bạn có thể thêm một ví dụ về cách gọi nó trong hộp cát, cho những người trong chúng ta đã không chạm vào Mathistica kể từ thời đại học của chúng tôi? Những nỗ lực của tôi f=... f[{0,...,0;0,...,0}, 19]và tương tự đã thất bại thảm hại.
Dave

@Dave, bạn có thể gọi hàm với HighlightGraph[g,ConnectedComponents[h=Subgraph[g=KnightTourGraph@@Dimensions@#,Flatten@#~Position~1],#2]~Prepend~h]&[{{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,1,1,1,1,0,0},{0,0,1,1,1,1,0,0},{0,0,0,0,0,0,0,0},{0,0,1,1,1,1,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0}},20](đối với trường hợp thử nghiệm đầu tiên). Tôi đã chỉnh sửa câu hỏi đó - xin lỗi vì nó không có ở đó để bắt đầu!
Không phải là một cái cây
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.