Người thứ tư có thể bị cúm


12

Vì ngày mai là ngày 4 tháng 5, đây là một bài đăng nhỏ theo chủ đề Chiến tranh giữa các vì sao để chuẩn bị tinh thần cho tất cả những câu chuyện dở khóc dở cười vào ngày mai.

QUAY LẠI

Trong một phiên họp của thượng viện thiên hà, tất cả các thượng nghị sĩ đang ngồi trong một n*nlưới. Một đợt bùng phát bất ngờ của bệnh cúm JarJar (kéo dài mãi mãi và khiến người nhiễm bệnh nói như JarJar Binks) khiến một số thượng nghị sĩ bị nhiễm bệnh.

Đây là một ví dụ với một 6*6 lưới trong đó các Xthượng nghị sĩ bị nhiễm bệnh, danh sách tương ứng là [[0,5],[1,4],[2,3],[2,1],[3,3],[3,0],[4,5],[0,5]]:

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

Sau đó, nhiễm trùng bắt đầu lây lan từng bước. Hai thượng nghị sĩ liền kề nếu họ chia sẻ toàn bộ cạnh trên lưới (nghĩa là trên cùng, dưới cùng, phải, trái), có nghĩa là chúng tôi loại trừ các đường chéo.

Chúng tôi có thể kết luận một thượng nghị sĩ có thể tiếp giáp với 2,3 hoặc 4 thượng nghị sĩ khác và yêu cầu các quy tắc sau đây về sự lây nhiễm:

  • Một thượng nghị sĩ đã bị nhiễm vẫn bị nhiễm mãi mãi
  • Một thượng nghị sĩ bị nhiễm ở một bước nếu anh ta tiếp giáp với 2 thượng nghị sĩ bị nhiễm bệnh ở bước trước

Đây là một ví dụ với lưới trước đó cho thấy 2 bước đầu tiên của việc lây nhiễm:

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

Sau các bước nexts, tất cả các thượng viện sẽ bị nhiễm bệnh

NHIỆM VỤ CỦA BẠN

Mã của bạn không cần xử lý các đầu vào không hợp lệ như danh sách lớn hơn n*n hoặc tọa độ không phân biệt.

nVí dụ, mã của bạn sẽ lấy một danh sách các cặp số nguyên (hoặc lưới nhị phân hoặc bất kỳ định dạng nào phù hợp với ngôn ngữ của bạn) và một số nguyên (có thể không cần thiết nếu bạn sử dụng định dạng khác ngoài danh sách), ví dụ:

8 [[1,2],[1,1],[7,4],[2,7],[4,3]]

n là cạnh của lưới có nghĩa là lưới sẽ là lưới * n và danh sách các cặp số nguyên là tọa độ của các ô của các thượng nghị sĩ bị nhiễm ban đầu.

Phía dưới bên trái của lưới là [0,0] và phía trên bên phải là [n-1, n-1]. Trên cùng bên trái là [0, n-1].

Mã của bạn phải xuất ra một số nguyên:

-1 hoặc giá trị sai lệch hoặc lỗi nếu toàn bộ lưới sẽ không bao giờ bị nhiễm hoàn toàn hoặc số bước tối thiểu cần thiết để lây nhiễm toàn bộ lưới

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

6 [[0,5],[1,4],[2,3],[2,1],[3,3],[3,0],[4,5],[5,0]] => 7

4 [[1,1][0,3][1,0][3,0][3,3]] => 9

Hãy nhớ rằng đây là , do đó, câu trả lời ngắn nhất tính bằng byte sẽ thắng!




Giá trị tối thiểu là ngì? Có một giá trị tối đa?
mbomb007

@ mbomb007 không có giá trị tối đa trong lý thuyết nhưng nó phải được tính toán. Đối với giá trị tối thiểu tôi muốn nói là 1 đầu ra 0 hoặc -1

2
Trông giống như một công việc cho CellularAutomaton
Mathicala

Câu trả lời:


2

MATL, 29 28 byte

tn:"tlY6Z+1>Z|t?@.]]Nl=?l_]&

Đầu vào ở dạng ma trận 2D 1 và 0

Dùng thử tại MATL Online

Giải trình

        % Implicitly grab user input as a 2D matrix
t       % Duplicate the inputs
n:      % Count the number of elements in the input (N) and create the array [1...N]
"       % Loop this many times (maximum number of steps we analyze)
  t     % Duplicate the top element
  lY6   % Push the 2D array => [0 1 0; 1 0 1; 0 1 0]
  Z+    % Perform 2D convolution (and maintain the size)
  l>    % Find all values that are >= 2
  Z|    % Perform an element-wise OR with the previous state
  t?    % If all elements are 1's
    @.  % Push the current index and break out of the loop
  ]     % End of if 
]       % End of for loop
Nl=?    % If there is only one element on the stack
  l_    % Push a negative one
]       % End of if statement
&       % Display the top stack element

@LuisMendo Thật không may, tôi không nghĩ như vậy bởi vì có một số 0 trong kết quả của phép chập sẽ trở thành -1 và do đó là "đúng"
Suever

Thế còn tn:"tlY6Z+1>Z|t?x@D.]]N?xl_? (Tôi chưa thử nghiệm nhiều). Nếu tất cả các phần tử là 1 tại một số điểm, hiển thị chỉ số vòng lặp ngay lập tức và xóa ngăn xếp. Ở cuối vòng lặp, nếu ngăn xếp không trống, hãy xóa và đẩy-1
Luis Mendo

3

APL (Dyalog 16.0), 54 ký tự hoặc 60 byte

Lấy ma trận kèm theo làm đối số, trả về số bước hoàn thành lây nhiễm, tức là 1 = đã bị nhiễm hoàn toàn. 0 = không lan truyền đầy đủ, chỉ là 1 + số OP.

54 ký tự (Unicode):

(≢×0=0∊⊃){(⊢≡f←⊢∨2≤{+/,⍵×3 3⍴0 1}⌺3 3)⊃⍵:⍵⋄(⊂f⊃⍵),⍵}⍣≡

60 byte (Cổ điển):

(≢×0=0∊⊃){(⊢≡f←⊢∨2≤{+/,⍵×3 3⍴0 1}⎕U233A 3 3)⊃⍵:⍵⋄(⊂f⊃⍵),⍵}⍣≡

tương đương với ⎕U233A

Chạy ví dụ:

      g←(≢×0=0∊⊃){(⊢≡f←⊢∨2≤{+/,⍵×3 3⍴0 1}⌺3 3)⊃⍵:⍵ ⋄ (⊂f⊃⍵),⍵}⍣≡
      ⎕IO←0
      b←⊂⊖⍉~@(⎕JSON'[[0,5],[1,4],[2,3],[2,1],[3,3],[3,0],[4,5],[5,0]]')⊢0⍴⍨2⍴6
      g b
8
      b←⊂⊖⍉~@(⎕JSON'[[1,1],[0,3],[1,0],[3,0],[3,3]]')⊢0⍴⍨2⍴4
      g b
10

Các bước thực hiện như sau:

┌─ Giới thiệu về giới tính của bạn, giới thiệu về các loại thuốc khác. Giới thiệu về giới tính của bạn
│ XX XXX XXXXX XXXXX XXXXX XXXXX │ XXXXXX
X │ XXX XXXXX XXXXX │ XXXXX │ XXXXXX XXXXXX
│ XX │ XXX XXXX XXXX │ XXXXX │ XXXXXX XXXXXX XXXXXX
│ X │ XXX XXXXX │ XXXXXX XXXXXX XXXXXX XXXXXX
X │ XX │ XXX XXXXX │ XXXXXX │ XXXXXX XXXXXX XXXXXX
│ XX │ XXXX XXXX XXXX │ XXXXX │ XXXXXX XXXXXX XXXXXX
└─ Giới thiệu về giới tính của bạn, giới thiệu về các loại thuốc khác. Giới thiệu về giới tính của bạn
┌ ─ ─ ┬ ─ ─ ┐
│ XX XX │ XX XX XX XXX XXXX XXXX │ XXXX
│ │ X │ XX XXX XXXX │ XXXX XXXX
X │ X │ XX XXX XXX XXX XXX XXX XXXX XXXX
│ XX XXX XXX XXX XXX XXX XXX XXX XXXX
└ ─ ─ ┴ ─ ─ ┘


2

Python, 231 byte

g=input()
q=lambda r,c:g[r][c]if(0<=r<m)*(0<=c<m)else 0
m=len(g);p=t=0;n=range(m)
while not all([r for k in g for r in k]):h=[[g[r][c]or sum([q(r+1,c),q(r-1,c),q(r,c+1),q(r,c-1)])>1 for c in n] for r in n];t+=1;0/(g!=h);g=h
print t

Nó phát sinh lỗi nếu không thể.

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


0/0lưu hai byte từ raise. Có lẽ 1/(g!=h)sẽ làm việc? (sau đó toàn bộ whilecó thể được nội tuyến quá).
Jonathan Allan

@Jonathan ALLan Tôi đã cập nhật nó, cảm ơn vì đầu vào.
Neil

q=lambda r,c:g[r][c]if(0<=r<m)*(0<=c<m)else 0tiết kiệm 12. Bạn có thể loại bỏ các khoảng trống giữa (a) 1for(b) ]forquá.
Jonathan Allan

@Jonathan ALLan Cập nhật lại. Cảm ơn
Neil

1

JavaScript (ES6), 132 byte

f=s=>(w=s.search`\n`,t=` `.repeat(w+1),t+=s+t,t=s.replace(/0/g,(_,i)=>1-t[i]-t[i+=w]-t[i+=2]-t[i+w]>>>31),t==s?0/!/0/.test(s):1+f(t))

Trường hợp \nđại diện cho nhân vật dòng chữ mới. Đưa đầu vào dưới dạng một chuỗi 0s và 1s trong một mảng được phân tách bằng dòng mới. Trả về NaNnếu lưới sẽ không bao giờ bị nhiễm hoàn toàn.

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.