Може четвертий захворіти на грип


12

Оскільки завтра - 4 травня, ось невеличкий тематичний пост "Зоряних воєн", щоб подумки підготувати вас до всіх поганих жартів, що приходять завтра.

НАЗАД

Під час сесії галактичного сенату всі сенатори сидять в 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_]&

Введення здійснюється у вигляді 2D матриці 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 і, отже, були би "правдою"
Suever

Як щодо tn:"tlY6Z+1>Z|t?x@D.]]N?xl_? (Я не тестував багато). Якщо всі елементи в один момент є 1, негайно виведіть індекс циклу та видаліть стек. В кінці циклу, якщо стек не порожній, видаліть і натисніть-1
Луїс Мендо

3

APL (Dyalog 16.0), 54 символи або 60 байт

Приймає додану матрицю в якості аргументу, повертає номер кроку, який завершує зараження, тобто 1 = вже повністю заражений. 0 = не поширюється повністю, що становить лише 1 + номери ОП.

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 │ XXXXX │ XXXXXX │ XXXXXX │ XXXXXX │ XXXXXX │
│ X │ XX │ XXX │ 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 │ XXXX │ XXXX │
│ XX │ XXX │ XXX │ XXX │ XXX │ XXX │ XXX │ XXX │ XXX │ XXXX │
└───────────────────────────────────────────────────── ┴───────────────────────────────────────────────────── ┘


2

Пітон, 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/0зберігає два байти від raise. Може 1/(g!=h), спрацювало б? (тоді і ціле whileможна було б накреслити).
Джонатан Аллан

@JonathanAllan Я оновив його, дякую за вклад.
Ніл

q=lambda r,c:g[r][c]if(0<=r<m)*(0<=c<m)else 0економить 12. Можна видалити простір між (а) 1і for(б) ]і forтеж.
Джонатан Аллан

@JonathanAllan Оновлено знову. Спасибі
Ніл

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 у масиві з обмеженим рядком. Повертається, NaNякщо сітка ніколи не заразиться повністю.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.