폭탄의 연쇄 반응


32

소개:

작업 전에 다음은 모든 요소가 맵에서 수행하는 작업입니다.

평원 ( X) : 아무것도하지 않습니다.

파괴 된 땅 ( -) : 이것은 평지와 같지만 폭탄에 의해 파괴됩니다.

활성 폭탄 ( !) :지도에서 3x3 정사각형의 모든 것을 파괴합니다.

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

수동 폭탄 ( @) : 다른 폭탄에 의해 폭발하기 전까지는 아무것도하지 않습니다. 또한 3x3 제곱 폭발 반경을 갖습니다 .

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

그러나:

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

핵무기 ( ~) : 다른 폭탄에 의해 폭발 할 때까지 아무것도하지 않습니다. 차이점은이 폭탄의 폭발 반경 은 5x5입니다 .

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

그러나:

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

작업

  • 9x9 맵이 주어지면 연쇄 반응 을 출력하십시오 .
  • 기능이나 프로그램을 제공 할 수 있습니다.
  • 이것은 이므로 바이트 수가 가장 적은 제출이 승리합니다!

테스트 사례

테스트 사례 1 ( 3 단계 ) :

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

테스트 사례 2 ( 2 단계 ) :

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

테스트 사례 3 ( 2 단계 ) :

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

테스트 사례 4 ( 1 단계 ) :

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

테스트 사례 5 ( 9 단계 ) :

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

테스트 사례 6 ( 9 단계 ) :

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

테스트 사례 7 ( 3 단계 ) :

!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
내 대답 은 허용 된 것보다 훨씬 짧습니다.
Adám

이 도전에 대한 워크숍의 일부를 만들 수 있습니까?
Adám

답변:


10

MATLAB, 120 111 바이트

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

컨볼 루션은 성공의 열쇠입니다.

아이디어는 다음과 같습니다 : 활성 폭탄을 찾으십시오. 이 영역을 3x3 정사각형으로 확대하십시오. 영향을받는 새로운 폭탄을 찾아 해당 지역을 해당 크기로 확대 한 다음 이전에 파괴 한 지역에 추가하십시오. 우리가 정지 지점 (= 더 이상 폭발 폭탄이 없음)에 도달했는지 확인하기 위해이 시간을 충분히 반복하십시오 (제 경우에는 입력 문자가있는 횟수만큼 짧습니다). 그런 다음 모든 파괴 영역을 설정 -하고 결과를 표시하십시오.

입력은 문자의 행렬로 가정됩니다. 예 :

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

10

망막 , 188 168 154 152 바이트

바이트는 ISO 8859-1로 계산됩니다.

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

온라인으로 사용해보십시오!

이것은 개념 증명에 더 가깝습니다. 폭탄과 핵무기 사이에는 끔찍한 중복이 있습니다. 설명을 추가하기 전에 제거하려고합니다. 글쎄, 나는 그 중복을 제거했지만 복잡성을 크게 증가시켜 실제로 크게 절약하지 못했습니다 ...


6

APL (Dyalog) , 56 자 또는 62 바이트 *

내 동료 Marshall 은 내 것보다 21 자 짧은 우아한 솔루션을 제시했습니다.

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

온라인으로 사용해보십시오!

{} 인수가 로 표시되는 익명 함수

'-'@(… 다음 암묵적 기능에 의해 가려진 위치 에서 )⍵돌진 하십시오.

  '!'∘= 느낌표가 인수와 같은 부울

  ()⍣≡ 더 이상 변화가 없을 때까지 다음 암묵적 기능을 적용하십시오.

   ×∘() 다음 상수를 곱하십시오.

    '~'=⍵ 물결표가 원래 인수와 같은 부울

    (... )+ 것과, 추가 :

     'X'≠⍵ X가 원래 인수와 다른 부울

   {}⌺5 5 각각에 대해 중심에있는 5 × 5 영역에 다음 기능을 적용하십시오.

    4↑1 하나의 처음 네 요소를 취하고 0으로 채움 [1,0,0,0]

    1+ 하나 추가 [2,1,1,1]

    5⍴ 주기적으로 길이 5 [2,1,1,1,2]로 재구성

    ∘.⌈⍨ 두 축 모두에 최대 테이블

    ⍵≥ 해당 이웃이 그 이상인 부울

    1∊ 참이면 부울


* 그냥 교체 ⎕U233A 문자 당 단일 바이트를위한 클래식에서.


tio 링크에서 입력 ( ">"의 왼쪽)은 출력 ( ">"의 오른쪽)과 동일합니다. 그렇게 보일까요?
ngn

@ngn 멋지게 발견되었습니다. 이 Disp기능은 결코 작동 할 수 없었습니다. 연산자로 업데이트되었습니다. 감사.
Adám

... 그리고 질문 : @클래식에서는 1 바이트로 계산됩니까? 내 추측은 그렇습니다
ngn


61 바이트에 대한 아이디어는 다음과 같습니다. '-'@({i/⍨∨⌿↑(↓⌈/¨|⍵∘.-i)≤3|'X@~-'⍳a[⍵]}⍣≡('!'=,a)/i←,⍳⍴a)⊢a←⎕( ⎕io←0)
ngn

4

자바, 574 562 558 549 525 523 바이트

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

이 글을 게시 한 지 꽤 오래 걸렸습니다. 그러나 몇 가지 골프를하실 '-'수 있습니다 45. 둘 다 될 수 있습니다 . 둘 다 Math.max(...,0)가능하다 ...>0?...:0(동일하게 수행 할 수 Math.min(...,9)있지만 정확히 같은 양의 바이트 일 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);수있다 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);. 그리고 아마도 프로그램 대신 함수를 만들 수있다)
Kevin Cruijssen

1

APL (Dyalog Classic) , 61 바이트

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

온라인으로 사용해보십시오!

a←⎕ 입력을 평가하고 할당 a

i←,⍳⍴a 모든 세포의 지표 (좌표 쌍)

('!'=,a)/ 초기에 활성화 된 폭탄 만 필터링

{ }⍣≡ 리스트가 안정 될 때까지 변환을 수행

  • 'X@~-'⍳a[⍵]대용 0 X, 1 @무엇을위한, 등, 4 ( !)

  • 3|충격의 "반경"을 얻기위한 mod 3; 그것은 크거나 같아야합니다 ...

  • (↓⌈/¨|⍵∘.-i)≤ ... 목록의 셀과 모든 셀 간의 맨해튼 거리

  • i/⍨∨⌿↑ 영향을받는 셀의 비트 마스크를 가져 와서 셀을 선택하십시오. i

'-'@( )⊢a-그 위치에 넣어

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.