Phản ứng dây chuyền của bom


32

Giới thiệu:

Trước nhiệm vụ, đây là những gì mọi yếu tố làm trên bản đồ:

Đồng bằng ( X): Điều này không có gì.

Đất bị phá hủy ( -): Đây giống như đất đồng bằng, nhưng bị phá hủy bởi một quả bom.

Bom hoạt động ( !): Trên bản đồ, điều này sẽ phá hủy mọi thứ trong một hình vuông 3x3:

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

Bom thụ động ( @): Nó không làm gì cả, cho đến khi nó được kích nổ bởi một quả bom khác. Điều này cũng có bán kính nổ 3x3 vuông:

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

Nhưng:

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

Nuke ( ~): Nó không làm gì cả, cho đến khi nó bị kích nổ bởi một quả bom khác. Sự khác biệt là quả bom này có bán kính nổ vuông 5x5 :

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

Nhưng:

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

Nhiệm vụ

  • Cho bản đồ 9x9 , xuất bản đồ sau phản ứng dây chuyền.
  • Bạn có thể cung cấp một chức năng hoặc một chương trình.
  • Đây là , vì vậy bài nộp có số byte ít nhất sẽ thắng!

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

Trường hợp thử nghiệm 1 ( 3 bước ):

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

Trường hợp thử nghiệm 2 ( 2 bước ):

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

Trường hợp thử nghiệm 3 ( 2 bước ):

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

Trường hợp thử nghiệm 4 ( 1 bước ):

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

Trường hợp thử nghiệm 5 ( 9 bước ):

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

Trường hợp thử nghiệm 6 ( 9 bước ):

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

Trường hợp thử nghiệm 7 ( 3 bước ):

!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
Câu trả lời của tôi ngắn hơn đáng kể so với câu trả lời .
Adám

Có thể căn cứ một phần của một hội thảo về thách thức này?
Adám

Câu trả lời:


10

Matlab, 120 111 byte

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

Thuyết phục là chìa khóa thành công.

Ý tưởng là như sau: Tìm bom hoạt động. Phóng to khu vực này thành một hình vuông 3x3. Tìm những quả bom bị ảnh hưởng mới, phóng to các khu vực phản xạ đến kích thước tương ứng và thêm chúng vào khu vực bị phá hủy trước đó. Lặp lại đủ số lần này (trong trường hợp của tôi nhiều lần như chúng ta có các ký tự đầu vào, chỉ vì đó là biến thể ngắn nhất) để chắc chắn rằng chúng ta đã đạt đến điểm dừng (= không nổ bom nữa). Sau đó thiết lập tất cả các khu vực bị phá hủy -và hiển thị kết quả.

Đầu vào được coi là một ma trận các ký tự, vd

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

10

Võng mạc , 188 168 154 152 byte

Byte được tính là ISO 8859-1.

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

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

Đây là nhiều hơn một bằng chứng về khái niệm. Có một số lượng trùng lặp khủng khiếp giữa bom và vũ khí hạt nhân, mà tôi sẽ cố gắng loại bỏ trước khi thêm một lời giải thích. Chà, tôi đã thoát khỏi sự trùng lặp đó nhưng nó đã làm tăng sự phức tạp đáng kể để nó thực sự không mang lại khoản tiết kiệm lớn ...


6

APL (Dyalog) , 56 ký tự hoặc 62 byte *

Đồng nghiệp Marshall của tôi đã đưa ra một giải pháp tao nhã, ngắn hơn 21 ký tự của tôi:

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

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

{... } chức năng ẩn danh mà lập luận được đại diện bởi

'-'@(... )⍵dấu gạch ngang tại các vị trí bị che khuất bởi các chức năng ngầm như sau:

  '!'∘= Boolean trong đó dấu chấm than bằng với đối số

  (... )⍣≡ áp dụng các chức năng ngầm sau cho đến khi không có gì nhiều thay đổi:

   ×∘(Nhân ) số nhân với hằng số sau:

    '~'=⍵ Boolean trong đó dấu ngã bằng với đối số ban đầu

    (Thêm )+ vào đó, thêm:

     'X'≠⍵ Boolean trong đó X khác với đối số ban đầu

   {... }⌺5 5 cho mỗi, áp dụng các chức năng sau trên diện tích 5 × 5 tập trung vào nó:

    4↑1 lấy bốn yếu tố đầu tiên của một, đệm với số không [1,0,0,0]

    1+ thêm một [2,1,1,1]

    5⍴ định hình lại theo chu kỳ thành chiều dài năm [2,1,1,1,2]

    ∘.⌈⍨ bảng tối đa với chính nó trên cả hai trục

    ⍵≥ Boolean nơi hàng xóm tương ứng lớn hơn hoặc bằng

    1∊ Boolean nếu có là đúng


* Chỉ cần thay thế bằng ⎕U233A Cổ điển cho mỗi byte cho mỗi ký tự.


trong liên kết tio, đầu vào (ở bên trái của ">") giống như đầu ra (ở bên phải của ">"), nó có phải trông giống như vậy không?
ngn

@ngn Độc đáo phát hiện. Các Dispchức năng không bao giờ có thể làm việc. Cập nhật để trở thành một nhà điều hành. Cảm ơn.
Adám

... Và một câu hỏi: có @được tính là 1 byte trong cổ điển không? tôi đoán là có
ngn


đây là một ý tưởng cho 61 byte: '-'@({i/⍨∨⌿↑(↓⌈/¨|⍵∘.-i)≤3|'X@~-'⍳a[⍵]}⍣≡('!'=,a)/i←,⍳⍴a)⊢a←⎕( ⎕io←0)
ngn

4

Java, 574 562 558 549 525 523 byte

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

Tôi biết đã khá lâu kể từ khi bạn đăng bài này. Nhưng bạn có thể chơi golf một vài điều: Cả hai đều '-'có thể 45. Cả hai Math.max(...,0)có thể được ...>0?...:0(tương tự có thể được thực hiện với Math.min(...,9)nhưng đó là cùng một lượng chính xác của byte. 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);Có thể 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);Và có lẽ bạn có thể làm một chức năng ra khỏi nó thay vì chương trình..
Kevin Cruijssen

1

APL (Dyalog Classic) , 61 byte

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

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

a←⎕ đánh giá đầu vào và gán cho a

i←,⍳⍴a các chỉ số (cặp coords) của tất cả các ô

('!'=,a)/ chỉ lọc những quả bom hoạt động ban đầu

{ }⍣≡ thực hiện chuyển đổi trong danh sách cho đến khi nó ổn định

  • 'X@~-'⍳a[⍵]thay thế 0 cho X, 1 cho @, v.v., 4 cho bất cứ điều gì khác ( !)

  • 3|mod 3 để có "bán kính" tác động; nó phải lớn hơn hoặc bằng ...

  • (↓⌈/¨|⍵∘.-i)≤ ... Khoảng cách Manhattan giữa các ô trong danh sách và tất cả các ô

  • i/⍨∨⌿↑ nhận bitmask trong đó các ô bị ảnh hưởng và chọn những ô từ i

'-'@( )⊢ađặt -ở những vị trí đó

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.