Dördüncü grip olsun


12

Yarın 4 Mayıs olduğu için, sizi yarın gelen tüm kötü şakalara zihinsel olarak hazırlamak için küçük bir Star Wars temalı yazı.

backstory

Galaktik senatonun bir oturumu sırasında tüm senatörler bir n*nızgarada oturuyorlar . Ani bir JarJar gribi salgını (sonsuza kadar süren ve enfekte olanların JarJar Binks gibi konuşmasına neden olan) bazı senatörlerin enfekte olmasına neden olur.

Aşağıda , virüslü senatörlerin 6*6bulunduğu bir ızgara içeren bir örnek verilmiştir :X[[0,5],[1,4],[2,3],[2,1],[3,3],[3,0],[4,5],[0,5]]

resim açıklamasını buraya girin

Bundan sonra enfeksiyon adım adım yayılmaya başlar. İki senatör ızgara üzerinde bir kenarı paylaşırlarsa bitişiktir (yani üst, alt, sağ, sol), yani köşegenleri hariç tutuyoruz.

Bir senatörün 2,3 veya diğer 4 senatöre bitişik olabileceği sonucuna varabilir ve enfeksiyon için aşağıdaki kuralları talep edebiliriz:

  • Enfekte olmuş bir senatör sonsuza dek enfekte kalır
  • Bir senatör bir önceki adımda 2 veya daha fazla enfekte olmuş senatöre bitişikse bir adımda enfekte olur

Enfeksiyonun ilk 2 adımını gösteren önceki ızgaraya bir örnek:

resim açıklamasını buraya girin

Nexts adımlarından sonra tüm senato enfekte olacak

SENİN GÖREVİN

Kodunuzun, farklı olmayan bir liste n*nveya koordinatlar gibi geçersiz girişleri işlemesi gerekmez .

Kodunuz, tamsayıların (veya ikili bir ızgara veya dilinize uyan başka bir biçim) çiftlerinin bir listesini ve bir tamsayı n(listeden başka bir biçim kullanırsanız gereksiz olabilir ) girdi olarak alır :

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

n, ızgaranın bir tarafı olması, yani ızgaranın bir * n ızgarası olacağı ve tamsayıların çiftlerinin listesi, başlangıçta enfekte olmuş senatörlerin hücrelerinin koordinatlarıdır.

Izgaranın sol alt kısmı [0,0] ve sağ üst kısmı [n-1, n-1] 'dir. Sol üst [0, n-1] 'dir.

Kodunuzun bir tamsayı çıkması gerekir:

-1 veya tüm ızgaraya hiçbir zaman tam olarak bulaşmayacaksa veya tüm ızgaraya bulaşmak için gereken minimum adım sayısı varsa, yanlış bir değer veya bir hata

Test senaryoları

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

Bunun olduğunu unutmayın, bu nedenle bayttaki en kısa cevap kazanır!




Minimum değeri nedir n? Maksimum değer var mı?
mbomb007

@ mbomb007 teoride maksimum değer yoktur, ancak hesaplanabilir olmalıdır. Minimum değer için 0 veya -1 çıktısını veren 1 diyorum

2
Mathematica'nın işi gibi görünüyor CellularAutomaton...
mbomb007

Yanıtlar:


2

MATL, 29 28 bayt

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

Giriş, 1'lerin ve 0'ların 2D matrisi biçimindedir

MATL Online'da deneyin

açıklama

        % 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 Ne yazık ki öyle düşünmüyorum çünkü kıvrımın çıktısında -1 olacak ve bu yüzden "gerçek" olacak
0'lar var

Nasıl tn:"tlY6Z+1>Z|t?x@D.]]N?xl_? (Çok fazla test yapmadım). Tüm öğeler bir noktada 1 ise, döngü dizinini hemen görüntüleyin ve yığını silin. Döngünün sonunda, yığın boş değilse silin ve itin-1
Luis Mendo

3

APL (Dyalog 16.0), 54 karakter veya 60 bayt

Kapalı matrisi argüman olarak alır, enfeksiyonu tamamlayan adım sayısını döndürür, yani 1 = zaten tam olarak enfekte olmuş. 0 = tam olarak yayılmaz, bu sadece 1 + OP'nin sayılarıdır.

54 karakter (Unicode):

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

60 bayt (Klasik):

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

eşittir ⎕U233A

Örneklerin çalışması:

      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

Adımlar aşağıdaki gibidir:

┌─────────────┬─────────────┬─────────────┬─────── ──────┬─────────────┬─────────────┬─────────────┬─ ────────────┐
│ 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

Python, 231 bayt

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

Mümkün değilse bir hata oluşturur.

Çevrimiçi deneyin!


0/0iki bayt kaydeder raise. Belki 1/(g!=h)işe yarar? (o zaman bütün whilede satır içi olabilir).
Jonathan Allan

@JonathanAllan Güncelledim, giriş için teşekkürler.
Neil

q=lambda r,c:g[r][c]if(0<=r<m)*(0<=c<m)else 0Sen, (a) arasındaki boşluğu kaldırabilirsiniz 12. kaydeder 1ve forve (b) ]ve forde.
Jonathan Allan

@JonathanAllan Tekrar güncellendi. Teşekkürler
Neil

1

JavaScript (ES6), 132 bayt

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

Burada \ngerçek satırsonu karakterini temsil eder. Satırı yeni satırla ayrılmış bir dizide 0s ve 1s dizesi olarak alır . NaNIzgaraya hiçbir zaman tam olarak bulaşmayacaksa döndürür .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.