Tối ưu hóa Nullifier của tôi


12

Tôi là một fan hâm mộ lớn của trò chơi Creeper World, và đặc biệt là phần tiếp theo. Bạn không cần biết trò chơi này hoạt động như thế nào để trả lời câu hỏi, tôi chỉ muốn đề cập đến câu hỏi của tôi bắt nguồn từ đâu.

Trong trò chơi, mục tiêu của bạn là tiêu diệt các Emitters đang sinh ra Creeper, sử dụng vũ khí được gọi là nullifier.

Nullifier có thể phá hủy mọi bộ phát trong bán kính này:

 eee
eeeee
eenee
eeeee
 eee

Mỗi nullifier có thể nhắm mục tiêu nhiều Emitters.

Mục tiêu của bạn

Đưa ra một mảng mô phỏng bản đồ 2D không có gìphát ra với bất kỳ ký tự nào bạn thích, có thể là khoảng trắnge hoặc số - chỉ cần đảm bảo chúng có thể phân biệt được, xuất ra cùng một bản đồ với số lượng tối ưu hóa n (hoặc những gì bạn muốn ) được đặt, sao cho các bộ phát bị hủy với số lượng nullifier ít nhất.

Nếu có nhiều cách tối ưu để thực hiện nó, chỉ cần xuất ra một cách sẽ ổn. Tuy nhiên, nếu nhiệm vụ không thể giải quyết được, giả sử có rất nhiều trình phát mà không có bố cục nào sẽ tấn công tất cả chúng, bạn phải xuất ra một thứ gì đó khác biệt, null sẽ đủ

Quy tắc nhanh:

  • Đầu vào: mảng đa chiều
  • Đầu vào sẽ chứa hai ký tự, nghĩa là không có gì và bộ phát , bao gồm những gì trong câu trả lời của bạn
  • Đầu ra: mảng đa chiều
  • Đầu ra sẽ chứa ba ký tự, nghĩa là không có gì , bộ phátnullifier HOẶC đầu ra có thể phân biệt nếu đầu vào không thể giải được
  • Bạn chỉ có thể thay thế ký tự không có gì bằng nullifier
  • Một nullifier có thể tấn công nhiều bộ phát và sẽ luôn đánh tất cả những gì trong phạm vi
  • Một nullifier có thể đánh vào khu vực được chỉ định ở trên và sẽ luôn đánh tất cả các trình phát mà nó có thể nhắm mục tiêu
  • Câu trả lời ngắn nhất bằng byte thắng
  • sơ hở tiêu chuẩn bị cấm

Ví dụ

Đầu vào:

[[ , ,e, , ],
 [ , , , , ],
 [e, , , ,e],
 [ , , , , ],
 [ , ,e, , ]]

Đầu ra:

 [[ , ,e, , ],
  [ , , , , ],
  [e, ,n, ,e],
  [ , , , , ],
  [ , ,e, , ]]

Đầu vào:

[[e,e,e,e,e],
 [e, , , ,e],
 [e, , , ,e],
 [e, , , ,e],
 [e,e,e,e,e]]

Đầu ra:

[[e,e,e,e,e],
 [e, ,n, ,e],
 [e, , , ,e],
 [e, ,n, ,e],
 [e,e,e,e,e]]

Đầu vào:

[[e, , , , , , ,e, ,e, , , ,e, ,e, ,e, ,e],
 [ , ,e, , ,e, , , ,e,e, , , , ,e, , , , ],
 [ , ,e, , , ,e, ,e, ,e, ,e, ,e, ,e, , , ],
 [e, , , ,e, ,e, , , , , , , , , , , ,e, ],
 [e, , ,e, , , , , ,e, ,e, ,e, ,e, , , ,e],
 [ , , ,e, ,e, ,e, , , , , , , , , ,e, , ],
 [ ,e,e, ,e, , , ,e, ,e,e, ,e, ,e, ,e, , ],
 [ , ,e, , , ,e, , , , , , , , ,e,e, ,e, ],
 [ , , ,e, , , , ,e,e, , , , , , , , ,e, ],
 [e, , , , , , ,e, , , ,e,e, ,e, , , , , ],
 [ ,e,e, , ,e, , , , ,e, , , , , , ,e, , ],
 [ , , ,e,e, ,e, ,e, , , ,e,e, ,e, ,e, ,e],
 [e,e, , , , ,e, , , ,e, , , , , , , , , ],
 [ , , ,e, , , , , ,e, , ,e, ,e, ,e, ,e, ],
 [ , , , ,e, ,e, , , , , , , , , , , , , ],
 [e,e, , ,e,e, , ,e, , ,e, ,e, ,e, ,e, ,e],
 [e, ,e, ,e, , ,e,e,e, , ,e, , , ,e, , ,e],
 [ , , , ,e, , , , , ,e, , , ,e, , , , , ],
 [ , ,e, , , ,e, ,e, , , ,e, , , , ,e, , ],
 [ , , ,e, ,e, ,e, , ,e,e, , ,e,e, , ,e, ]]

Đầu ra (Đầu ra này được làm bằng tay và có thể không phải là đầu ra tối ưu):

[[e, , , , , , ,e, ,e, , , ,e, ,e, ,e, ,e],
 [ , ,e, , ,e, , ,n,e,e, , , ,n,e, , , , ],
 [ ,n,e, , ,n,e, ,e, ,e, ,e, ,e, ,e, ,n, ],
 [e, , , ,e, ,e, , , , , , , , , , , ,e, ],
 [e, , ,e, , , , , ,e, ,e, ,e, ,e, , , ,e],
 [ , ,n,e, ,e, ,e, , , ,n, , , , , ,e, , ],
 [ ,e,e, ,e, ,n, ,e, ,e,e, ,e, ,e,n,e, , ],
 [ , ,e, , , ,e, , , , , , , , ,e,e, ,e, ],
 [ , , ,e, , , , ,e,e, , , , , , , , ,e, ],
 [e, ,n, , , , ,e, , , ,e,e, ,e, , , , , ],
 [ ,e,e, , ,e,n, , ,n,e, , , ,n, , ,e,e, ],
 [ , , ,e,e, ,e, ,e, , , ,e,e, ,e, ,e, ,e],
 [e,e, , , , ,e, , , ,e, , , , , , , , , ],
 [ , , ,e, ,n, , , ,e, , ,e, ,e, ,e, ,e, ],
 [ ,n, , ,e, ,e, , , , , , , ,n, , , ,n, ],
 [e,e, , ,e,e, , ,e,n, ,e, ,e, ,e, ,e, ,e],
 [e, ,e, ,e, , ,e,e,e, , ,e, , , ,e, , ,e],
 [ , , , ,e, , , , , ,e, ,n, ,e, , ,n, , ],
 [ , ,e, ,n, ,e, ,e, , , ,e, ,n, , ,e, , ],
 [ , , ,e, ,e, ,e, ,n,e,e, , ,e,e, , ,e, ]]

Đầu vào:

[[e,e],
 [e,e]]

Đầu ra:

null

Tôi có thể sử dụng 0, 12tương tự?
dùng202729

@ user202729 Có, miễn là bạn chỉ định cái gì là gì và giữ cho nó nhất quán, IE nếu một bộ phát là 1 trong đầu vào, thì tương tự nó phải là 1 trong đầu ra
Troels MB Jensen

1
Tôi yêu Creeper World, nó luôn luôn thỏa mãn khi cuối cùng xóa được dấu vết cuối cùng của cây leo
Jo King

1
@ edc65 Toàn bộ quan điểm của code-golf là giảm thiểu kích thước mã mà không quan tâm đến thời gian chạy.
dùng202729

2
Tôi yêu thế giới cây leo quá!
orlp

Câu trả lời:


4

Python 3 , 558 511 509 byte

from itertools import*
E=enumerate
L=len
def s(s):
 q=[(x,y)for y,r in E(s)for x,k in E(r)if k==w]
 for i in range(1,L(q)):
  for c in combinations(q,i):
   m=[l*1for l in s]
   for p in c:
    m[p[1]][p[0]]=n
    for y,r in E([list(r) for r in' xxx ,xxxxx,xxnxx,xxxxx, xxx '.split(',')]):
     for x,k in E(r):
      o=(p[0]-x+2,p[1]-y+2)
      if k==d and-1<o[0]<L(m[0])and-1<o[1]<L(m)and m[o[1]][o[0]]==e:
       m[p[1]-y+2][p[0]-x+2]=d
   if e not in ','.join([''.join(r)for r in m]):return(m)
print(s(m))

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

Nó rất điên rồ, nhưng tôi không biết đủ về Python để tối ưu hóa nó hơn nữa. Tôi đã học được một số điều từ câu trả lời của ovs, vì vậy đó là niềm vui.

Đầu vào (được sửa đổi để dễ viết các trường hợp kiểm tra hơn ) mong đợi '' hoặc 'e', ​​trong khi đầu ra sử dụng '', 'n' cho nullifier và 'x' cho bộ phát bị vô hiệu hóa. Hàm lấy đầu vào dự kiến ​​được mô tả trong câu hỏi.

Tôi đặt các biến e, w, n và d bên ngoài vì chúng có thể dễ dàng thay thế bằng số và, nếu đầu vào và đầu ra được sửa đổi để sử dụng các số, nó cũng sẽ in ra điều tương tự. Tôi đã sử dụng các chữ cái bởi vì chúng làm cho nó dễ đọc hơn trong khi làm việc với nó.

Câu hỏi thú vị, OP! Creeper World thật tuyệt và đó là một nguồn cảm hứng tuyệt vời cho câu hỏi :)

Chỉnh sửa: -47 byte nhờ Erik the Outgolfer


8
Xin lỗi, nhưng có vẻ như đây không phải là một mục cạnh tranh nghiêm trọng. Tôi khuyên bạn nên xóa nó cho đến khi bạn có thời gian để tối ưu hóa nó.
Erik the Outgolfer

2
Rất tiếc, xấu của tôi! Được chỉnh sửa theo khả năng tốt nhất của tôi
GammaGames

1
Bạn thực sự không cần 2 khoảng trống cho mỗi cấp độ thụt, 1 là đủ.
Erik the Outgolfer

3

Python 2 , 267 263 byte

from itertools import*
m=input()
E=enumerate
e=[(x,y)for y,a in E(m)for x,e in E(a)if e]
for n in count():
 for p in combinations(e,n):
	k=[l*1for l in m]
	for x,y in p:k[y][x]=2
	all(e+any(8>(y-Y)**2+(x-X)**2for X,Y in p)for y,a in E(m)for x,e in E(a))>0>exit(k)

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

0cho emitter, 2cho nullifier và 1cho không gian trống.


1

Ngôn ngữ Wolfram (Mathicala) , 173 168 byte

t=ToExpression@$ScriptInputString
P=Position
p=t~P~0
q=t~P~2
Print@ReplacePart[t,Thread[p->LinearProgramming[1&/@p,(xBoole[Norm[x-#]^2<6]&/@p)/@q,1&/@q,0,Integers]]]

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

Giải quyết trường hợp thử nghiệm lớn nhất trong 1 giây .

Chương trình đầy đủ. Là một hàm, nó ngắn hơn, chỉ 130 byte .

Sử dụng 0cho  , 1cho n2cho e.

Chương trình này có thể được sử dụng để chuyển đổi từ định dạng đầu vào trong thử thách.

Nếu không có giải pháp, nó sẽ in thông báo lỗi lpdimnhư thế này hoặc lpsnfnhư thế này .

Phiên bản sử dụng Outer(mặc dù dễ đọc hơn) dài hơn 2 byte, mặc dù tên ngắn gọn là Outer: Dùng thử trực tuyến!


Giải trình.

Lưu ý rằng điều này có thể được giảm xuống thành một vấn đề lập trình tuyến tính số nguyên.

Mỗi eô được cố định ở mức 2, mỗi ô trống là một biến số nguyên, có thể là 0(trống) hoặc 1(nullifier). Danh sách tọa độ của các biến được lưu trữ trong biến p. ( Positions trong tđó là 0)

Mục tiêu là để giảm thiểu số lượng nullifier được sử dụng, do đó tổng các biến số nguyên đó phải được giảm thiểu. ( 1&/@p, một vectơ bao gồm tất cả 1và có độ dài bằng pđộ dài của, biểu thị hàm mục tiêu)

Các ràng buộc là, đối với mỗi bộ phát ( 2) (vị trí của chúng được lưu trữ q), ít nhất phải có một bộ khử trong phạm vi xung quanh nó, hoặc chính xác hơn, có khoảng cách Euclide với nó nhiều nhất6.

Điều này được xây dựng với ma trận m= (xBoole[Norm[x-#]^2<6]&/@p)/@q(cho mỗi phần tử trong q, tạo một hàng với các phần tử là 1nếu khoảng cách bình phương ( Norm) đến tọa độ tương ứng trong pnhỏ hơn 6) và vectơ b= 1&/@q.

Sau đó ReplacePartThread"áp dụng" các giá trị biến tvà in nó.


Echocó thể được sử dụng thay cho Printnhưng sản lượng chứa trước >>.
dùng202729

Thật không may 1^p, không hoạt động (thay vì 1&/@p).
dùng202729
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.