อาจเป็นครั้งที่สี่กับไข้หวัด


12

ตั้งแต่วันพรุ่งนี้เป็นวันที่ 4 พฤษภาคมนี่คือโพสต์รูปแบบ Star Wars เล็ก ๆ น้อย ๆ ที่จะเตรียมความพร้อมให้กับคุณในเรื่องตลก ๆ ที่กำลังจะมาถึงในวันพรุ่งนี้

backstory

ในระหว่างเซสชันของกาแล็กซี่วุฒิสภาสมาชิกวุฒิสภาทั้งหมดกำลังนั่งอยู่ในn*nตาราง การระบาดอย่างฉับพลันของไข้หวัดใหญ่ JarJar (ซึ่งจะคงอยู่ตลอดไปและทำให้ผู้ติดเชื้อพูดเหมือน JarJar Binks) ทำให้วุฒิสมาชิกบางคนติดเชื้อ

นี่คือตัวอย่างของ6*6กริดที่Xเป็นสมาชิกวุฒิสภาที่ติดเชื้อรายการที่เกี่ยวข้องคือ[[0,5],[1,4],[2,3],[2,1],[3,3],[3,0],[4,5],[0,5]]:

ป้อนคำอธิบายรูปภาพที่นี่

หลังจากนั้นการติดเชื้อเริ่มแพร่กระจายทีละขั้นตอน วุฒิสมาชิกสองคนอยู่ติดกันหากพวกเขาแบ่งปันขอบทั้งหมดในตาราง (เช่นด้านบนด้านล่างขวาซ้าย) ซึ่งหมายความว่าเราไม่รวมเส้นทแยงมุม

เราสามารถสรุปวุฒิสมาชิกสามารถติดกับสมาชิกวุฒิสภาอีก 2,3 หรือ 4 คนและเรียกร้องกฎต่อไปนี้สำหรับการติดเชื้อ:

  • วุฒิสมาชิกที่ติดเชื้อนั้นจะคงอยู่ตลอดไป
  • วุฒิสมาชิกติดเชื้อในขั้นตอนเดียวหากเขาอยู่ติดกับสมาชิกวุฒิสภาที่ติดเชื้อ 2 คนขึ้นไปในขั้นตอนก่อนหน้า

นี่คือตัวอย่างของกริดก่อนหน้าซึ่งแสดงขั้นตอนแรกของการติดเชื้อ 2 ขั้นตอน:

ป้อนคำอธิบายรูปภาพที่นี่

หลังจากขั้นตอนต่อไปวุฒิสภาจะได้รับเชื้อทั้งหมด

งานของคุณ

รหัสของคุณไม่จำเป็นต้องจัดการอินพุตที่ไม่ถูกต้องเช่นรายการที่มากกว่าn*nหรือพิกัดที่ไม่แตกต่างกัน

รหัสของคุณจะใช้เป็นรายการของคู่ของจำนวนเต็ม (หรือตารางไบนารีหรือรูปแบบอื่น ๆ ที่เหมาะกับภาษาของคุณ) และจำนวนเต็มn(ซึ่งอาจไม่จำเป็นหากคุณใช้รูปแบบอื่นนอกเหนือจากรายการ):

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

n เป็นด้านของกริดซึ่งหมายถึงกริดจะเป็นกริด * n และรายชื่อคู่จำนวนเต็มเป็นพิกัดของเซลล์ของวุฒิสมาชิกที่ติดเชื้อเริ่มแรก

ด้านล่างซ้ายของตารางคือ [0,0] และด้านบนขวาคือ [n-1, n-1] ด้านซ้ายบนคือ [0, n-1]

รหัสของคุณจะต้องแสดงผลเป็นจำนวนเต็ม:

-1 หรือค่าที่ผิดพลาดหรือข้อผิดพลาดหากกริดทั้งหมดจะไม่ติดเชื้อโดยสิ้นเชิงหรือจำนวนขั้นต่ำที่จำเป็นในการติดเชื้อกริดทั้งหมด

กรณีทดสอบ

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

จำไว้ว่านี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ!




ค่าต่ำสุดnคืออะไร มีค่าสูงสุดหรือไม่?
mbomb007

@ mbomb007 ไม่มีค่าสูงสุดในทางทฤษฎี แต่ควรคำนวณได้ สำหรับค่าต่ำสุดที่ฉันพูด 1 ซึ่งผลลัพธ์ 0 หรือ -1

2
ดูเหมือนงานสำหรับ Mathematica ของCellularAutomaton...
mbomb007

คำตอบ:


2

MATL, 29 28 ไบต์

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

อินพุตอยู่ในรูปแบบของเมทริกซ์ 2 มิติของ 1 และ 0

ลองที่MATL Online

คำอธิบาย

        % 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 แต่น่าเสียดายที่ฉันไม่คิดอย่างนั้นเพราะมี 0 บางส่วนในผลลัพธ์ของการสนทนาซึ่งจะกลายเป็น -1 และดังนั้นจึงเป็น "ความจริง"
352 Suever

แล้วไงtn:"tlY6Z+1>Z|t?x@D.]]N?xl_ล่ะ (ฉันไม่ได้ทดสอบอะไรมากมาย) ถ้าองค์ประกอบทั้งหมดเป็น 1 ในบางจุดแสดงดัชนีลูปทันทีและลบสแต็ก ในตอนท้ายของลูปถ้าสแต็กไม่ลบและกดว่างเปล่า-1
Luis Mendo

3

APL (Dyalog 16.0), 54 ตัวอักษรหรือ 60 ไบต์

รับเมทริกซ์ที่ล้อมรอบเป็นอาร์กิวเมนต์ส่งคืนหมายเลขขั้นตอนที่เสร็จสิ้นการติดเชื้อเช่น 1 = ติดเชื้อแล้ว 0 = ไม่แพร่กระจายอย่างเต็มที่ซึ่งเป็นเพียง 1 + หมายเลขของ OP

54 ตัวอักษร (Unicode):

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

60 ไบต์ (แบบคลาสสิก):

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

เทียบเท่ากับ ⎕U233A

ตัวอย่างการเรียกใช้:

      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

ขั้นตอนดังต่อไปนี้:

┌─────────────┬─────────────┬─────────────┬─────── ──────┬─────────────┬─────────────┬─────────────┬─ ────────────┐
│ XX │ XXX │ XXXX │ XXXXX │ XXXXX │ XXXXX │ XXXXX │ XXXXXX │
│ X │ XXX │ XXXX │ XXXXX │ XXXXX │ XXXXX │ XXXXXX │ XXXXXX │
│ XX │ XXX │ XXXX │ XXXX │ XXXXX │ XXXXXX │ XXXXXX │ XXXXXX │
││ X │ XXX X XXXXX │ XXXXXX │ XXXXXX │ XXXXXX │ XXXXXX │
│ X │ XX │ XXX X XXXXX │ XXXXXX │ XXXXXX │ XXXXXX │ XXXXXX │
│ XX │ XXXX │ XXXX │ XXXX │ XXXXX │ XXXXXX │ XXXXXX │ XXXXXX │
└─────────────┴─────────────┴─────────────┴─────── ──────┴─────────────┴─────────────┴─────────────┴─ ────────────┘
┌─────────┬─────────┬─────────┬─────────┬───────── ┬─────────┬─────────┬─────────┬─────────┬───────── ┐
│ XX │ XX │ XX │ XX │ XX │ XX │ XXX │ XXXX │ XXXX │ XXXX │
│││││ X │ XX │ XXX │ XXXX │ XXXX │ XXXX │
│ X │ X │ XX │ XXX │ XXX │ XXX │ XXX │ XXX │ XXX │ XXXX │ XXXX │
│ XX │ XXX │ XXX │ XXX │ XXX │ XXX │ XXX │ XXX │ XXX │ XXX │ XXXX │
└─────────┴─────────┴─────────┴─────────┴───────── ┴─────────┴─────────┴─────────┴─────────┴───────── ┘


2

Python ขนาด 231 ไบต์

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

มันทำให้เกิดข้อผิดพลาดหากไม่สามารถทำได้

ลองออนไลน์!


0/0raiseช่วยประหยัดไบต์ที่สองจาก อาจ1/(g!=h)จะทำงานได้อย่างไร (จากนั้นทั้งหมดwhileอาจถูก inline ด้วย)
Jonathan Allan

@JanathanAllan ฉันอัพเดทแล้วขอบคุณสำหรับอินพุต
Neil

q=lambda r,c:g[r][c]if(0<=r<m)*(0<=c<m)else 0ประหยัด 12. คุณสามารถลบช่องว่างระหว่าง (a) 1และforและ (b) ]และforเกินไป
Jonathan Allan

@JonathanAllan อัพเดทอีกครั้ง ขอบคุณ
Neil

1

JavaScript (ES6), 132 ไบต์

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

โดย\nแสดงถึงอักขระบรรทัดใหม่ตามตัวอักษร รับอินพุตเป็นสตริงของ0s และ1s ในอาร์เรย์ที่คั่นด้วย newline ส่งคืนNaNถ้ากริดจะไม่ติดไวรัสอย่างสมบูรณ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.