Bombaların zincir reaksiyonu


32

Giriş:

Görevden önce, haritada her elemanın yaptığı şey:

Düz arazi ( X): Bu hiçbir şey yapmaz.

Yok edilen arazi ( -): Bu, düz arazi ile aynıdır, ancak bir bomba tarafından tahrip edilmiştir.

Aktif bomba ( !): Bir haritada, bu 3x3 karedeki her şeyi mahvedecek:

XXXXX                         XXXXX
XXXXX                         X---X
XX!XX     > will become >     X---X
XXXXX                         X---X
XXXXX                         XXXXX

Pasif bomba ( @): Başka bir bomba tarafından patlatılana kadar hiçbir şey yapmaz. Bu da 3x3 kare patlama yarıçapına sahiptir:

XXXXX                         XXXXX
XXXXX                         XXXXX
XX@XX     > will become >     XX@XX (nothing happened)
XXXXX                         XXXXX
XXXXX                         XXXXX

Fakat:

XXXXX                         XXXXX
XXXXX                         X---X
XX@XX     > will become >     ----X (both bombs have exploded)
X!XXX                         ----X
XXXXX                         ---XX

Nuke ( ~): Başka bir bomba tarafından patlatılana kadar hiçbir şey yapmaz. Fark, bu bombanın 5x5 kare'lik bir patlama yarıçapına sahip olmasıdır:

XXXXX                         XXXXX
XXXXX                         XXXXX
XX~XX     > will become >     XX~XX (nothing happened)
XXXXX                         XXXXX
XXXXX                         XXXXX

Fakat:

XXXXX                         -----
XXXXX                         -----
XX~XX     > will become >     ----- (both bombs have exploded)
X!XXX                         -----
XXXXX                         -----

Görev

  • Bir 9x9 haritası göz önüne alındığında , zincir reaksiyonundan sonra haritayı çıkar .
  • Bir işlev veya program sağlayabilirsiniz.
  • Bu , bu yüzden en az sayıda bayt olan gönderim kazanıyor!

Test durumları

Test durumu 1 ( 3 adım ):

XXXXXXXXX           XXXXXXXXX
----XXXXX           ----XXXXX
XXXX@XXXX           XXXX@XXXX
XXXXXXXX-           XXX---XX-
XXXX@XXXX     >     ------XXX
XXXXXXXX-           ------XX-
XX~XXXXXX           -----XXXX
X!XXXXXX-           -----XXX-
XXXXXXXXX           -----XXXX

Sınama durumu 2 ( 2 adım ):

XXXXXXXXX           XXXXXXXXX
XXXXXXXXX           XXXXXXXXX
XX~XXXXXX           XX~XXXXXX
---------           ---------
XXXX!XXXX     >     XXX---XXX
XXXXXXXXX           XXX------
XXX@@X@!X           XXX@@----
XXXXXXXXX           XXXXX----
XXXXXXXXX           XXXXXXXXX

Test durumu 3 ( 2 adım ):

XXXXXXXXX           XXXXXXXXX
XXXXXXXXX           XXXXXXXXX
XX~XXXXXX           XX~XXXXXX
XXXXXXXXX           XXX---XXX
XXXX!XXXX     >     XXX---XXX
XXXXXXXXX           XXX------
XXX@@X@!X           XXX@@----
XXXXXXXXX           XXXXX----
XXXXXXXXX           XXXXXXXXX

Test durumu 4 ( 1 adım ):

XXXXXXXXX           XXXXXXXXX
XXXX-XXXX           XXXX-XXXX
XXXXXXXXX           XXX---XXX
XX-X!X-XX           XX-----XX
XXXXXXXXX     >     XXX---XXX
XX-----XX           XX-----XX
XXXX-XXXX           XXXX-XXXX
XXXXXXXXX           XXXXXXXXX
XXXXXXXXX           XXXXXXXXX

Test durumu 5 ( 9 adım ):

!XXXXXXXX           ---XXXXXX
X@XXXXXXX           ----XXXXX
XX@XXXXXX           -----XXXX
XXX@XXXXX           X-----XXX
XXXX@XXXX     >     XX-----XX
XXXXX@XXX           XXX-----X
XXXXXX@XX           XXXX-----
XXXXXXX@X           XXXXX----
XXXXXXXX@           XXXXXX---

Test durumu 6 ( 9 adım ):

XX@@@XXXX           ------XXX
XXXXXXXXX           ------XXX
~XXXXXXXX           ---XXXXXX
XXXXXXXXX           ---XXXXXX
~XXXXXXXX     >     ---XXXXXX
XXXXXXXXX           ---XXXXXX
~XXXXXXXX           ---XXXXXX
@XXXXXXXX           ---XXXXXX
!XXXXXXXX           ---XXXXXX

Sınama durumu 7 ( 3 adım ):

!XXXXXXXX           ---XXXXXX
X@XXXXXXX           ----XXXXX
XX@XXXXXX           ----XXXXX
XXXXXXXXX           X---X----
XXXXXX@@!     >     XXXXX----
XXXXXXXXX           X---X----
XX@XXXXXX           ----XXXXX
X@XXXXXXX           ----XXXXX
!XXXXXXXX           ---XXXXXX

4
Cevabım kabul edilenden çok daha kısa.
Adám

Bir çalıştayın parçası bu zorluğa dayanabilir mi?
Adám,

Yanıtlar:


10

Matlab, 120 111 bayt

function f=c(f);c=@(x,i)conv2(x+0,ones(i),'s');a=c(f<34,3);for k=f;a=c(a&f<65,3)|a;a=c(a&f>99,5)|a;end;f(a)='-'

Evrişim başarının anahtarıdır.

Fikir şu: Aktif bombayı bul. Bu alanı 3x3 kareye büyütün. Etkilenen yeni bombaları bulun, ilgili bölgeleri karşılık gelen boyuta getirin ve daha önce tahrip edilen alana ekleyin. Bunu, durağan bir noktaya ulaştığımızdan emin olmak için (= artık patlayan bombalar olmadığından), yeterli sayıda tekrarlayın (benim durumumda, giriş karakterlerine sahip olduğumuz sayıda, sadece en kısa değişken olduğu için). Ardından tüm tahrip edilmiş bölgeyi ayarlayın -ve sonucu görüntüleyin.

Girişin bir karakter matrisi olduğu varsayılır, örn.

['!XXXXXXXX';
'X@XXXXXXX';
'XX@XXXXXX';
'XXX@XXXXX';
'XXXX@XXXX';
'XXXXX@XXX';
'XXXXXX@XX';
'XXXXXXX@X';
'XXXXXXXX@'];

10

Retina , 188 168 154 152 bayt

Bayt, ISO 8859-1 olarak sayılır.

+Tm`@~X!:`!:\-`(.)?.?.(.?(?<1>.)?)(?<=(:|(?(1)_)!|^(?(5)_)(?<-5>.)*(:|(?(1)_)!)(?<1>.*¶)?.*¶(.)*.|(?=(.)*¶.*(?<1>¶.*)?(:|(?(1)_)!)(?<-6>.)*(?(6)_)$))\2)

Çevrimiçi deneyin!

Bu daha çok bir kavram kanıtıdır. Bomba ve nükleer bombalar arasında bir açıklama eklemeden önce kurtulmaya çalışacağım korkunç bir çoğaltma var. Evet, bu kopyadan kurtuldum ama karmaşıklığı önemli ölçüde arttırdı, bu yüzden büyük tasarruflar sağladı ...


6

APL (Dyalog) , 56 karakter veya 62 bayt *

Meslektaşım Marshall , benimkinden 21 karakterden kısa zarif bir çözüm buldu:

{'-'@(({1∊⍵≥∘.⌈⍨51+41}⌺5 5×∘(('X'≠⍵)+'~'=⍵))⍣≡'!'∘=)⍵}

Çevrimiçi deneyin!

{} Argümanın ile temsil edildiği anonim işlev

'-'@(... )⍵tire de pozisyonları aşağıdaki zımni işlevi tarafından maskeli:

  '!'∘= Ünlem işaretinin argümana eşit olduğu Boole

  ()⍣≡ Başka bir şey değişinceye kadar aşağıdaki taktik işlevini uygulayın:

   ×∘() Aşağıdaki sabitle çarpın:

    '~'=⍵ Tilde orijinal argümana eşit olduğu Boolean

    (… Buna )+ , ekle:

     'X'≠⍵ X'in orijinal argümandan farklı olduğu Boolean

   {}⌺5 5 Her biri için, üzerinde ortalanan 5 × 5 alana aşağıdaki işlevi uygulayın:

    4↑1 birinin ilk dört elementini al, sıfırlarla doldurma [1,0,0,0]

    1+ bir tane ekle [2,1,1,1]

    5⍴ döngüsel olarak beş uzunluğuna yeniden şekillendirme [2,1,1,1,2]

    ∘.⌈⍨ Her iki eksende de kendisiyle birlikte maksimum masa

    ⍵≥ İlgili komşuların buna eşit veya ondan daha büyük olduğu Boole

    1∊ Varsa Boolean


* Sadece değiştirmek ile ⎕U233A karakterin başına tek bayt için Classic altında.


tio bağlantısında, girdi (">" nin solundaki), çıktıyla aynıdır (">" in sağındaki), öyle mi olması gerekiyor?
ngn

@ngn Güzel lekeli. DispFonksiyon çalışmış asla. Operatör olarak güncellendi. Teşekkürler.
Adám

... ve bir soru: Klasikte @1 bayt sayılıyor mu? benim tahminim evet
ngn

@ngn Evet.
Adám

61 bayt için bir fikir: '-'@({i/⍨∨⌿↑(↓⌈/¨|⍵∘.-i)≤3|'X@~-'⍳a[⍵]}⍣≡('!'=,a)/i←,⍳⍴a)⊢a←⎕( ⎕io←0)
ngn

4

Java, 574 562 558 549 525 523 bayt

import java.util.*;interface B{static char[][]g=new char[9][9];static void d(int i,int j,int r){g[i][j]=45;for(int x=Math.max(i-r,0);x<Math.min(i+r+1,9);x++)for(int y=Math.max(j-r,0);y<Math.min(j+r+1,9);y++)if(g[x][y]==64){d(x,y,1);}else if(g[x][y]>99){d(x,y,2);}else g[x][y]=45;}static void main(String[]a){Scanner q=new Scanner(System.in);for(int i=0;i<9;i++){int j=0;for(char c:q.nextLine().toCharArray())g[i][j++]=c;}for(int j=0;j<9;j++)for(int k=0;k<9;k++)if(g[j][k]==33)d(j,k,1);for(char[]z:g)System.out.println(z);}}

Bunu gönderdiğinden beri uzun zaman geçtiğini biliyorum. Ama birkaç şeyi golf oynayabilirsin: Her ikisi '-'de olabilir 45. Her ikisi Math.max(...,0)de olabilir ...>0?...:0(aynı şey yapılabilir, Math.min(...,9)ancak tam olarak aynı miktarda bayt vardır. for(int i=0;i<9;i++){int j=0;for(char c:q.nextLine().toCharArray())g[i][j++]=c;}for(int j=0;j<9;j++)for(int k=0;k<9;k++)if(g[j][k]==33)d(j,k,1);Olabilir int i=0,j;for(;i<9;i++){j=0;for(char c:q.nextLine().toCharArray())g[i][j++]=c;}for(i=0;i<9;i++)for(j=0;j<9;j++)if(g[i][j]<34)d(i,j,1);. Ve belki program yerine bunun dışında bir işlev yapabilirsin.
Kevin Cruijssen

1

APL (Dyalog Klasik) , 61 bayt

'-'@({i/⍨∨⌿↑(↓⌈/¨|⍵∘.-i)≤3|'X@~-'a[⍵]}⍣≡('!'=,a)/i←,⍳⍴a)⊢a←⎕

Çevrimiçi deneyin!

a←⎕ girdiyi değerlendir ve ata a

i←,⍳⍴a tüm hücrelerin indeksleri (kod çiftleri)

('!'=,a)/ sadece başlangıçtaki aktif bombaları filtrele

{ }⍣≡ stabilize olana kadar listede bir dönüşüm yapın

  • 'X@~-'⍳a[⍵]yerine 0 X, 1 @, vb, 4 yerine başka bir şey ( !)

  • 3|etki 3 "yarıçapı" almak için mod 3; daha büyük veya ona eşit olmalı ...

  • (↓⌈/¨|⍵∘.-i)≤ ... Listedeki hücreler ve tüm hücreler arasındaki Manhattan mesafeleri

  • i/⍨∨⌿↑ hangi hücrelerin etkilendiğini bitmask almak i

'-'@( )⊢a-bu pozisyonlara koymak

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.