ปฏิกิริยาลูกโซ่ของระเบิด


32

บทนำ:

ก่อนงานนี่คือสิ่งที่ทุกองค์ประกอบทำบนแผนที่:

ที่ดินเปล่า ( X): มันไม่ทำอะไรเลย

Destroyed ที่ดิน ( -): นี่เป็นดินแดนเดียวกัน แต่ถูกทำลายด้วยระเบิด

The bomb ที่ใช้งานอยู่ ( !): บนแผนที่สิ่งนี้จะทำลายทุกอย่างในพื้นที่ 3x3:

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

The Passive bomb ( @): ไม่ทำอะไรเลยจนกว่าจะมีการระเบิดด้วยระเบิดอีกครั้ง นี่ก็มีรัศมีการระเบิด 3 x 3 :

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

The nuke ( ~): ไม่ทำอะไรเลยจนกว่าจะมีการระเบิดด้วยระเบิดอีกครั้ง ความแตกต่างคือระเบิดนี้มีรัศมีการระเบิด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

อาจเป็นส่วนหนึ่งของการประชุมเชิงปฏิบัติการเรื่องความท้าทายนี้หรือไม่?
อดัม

คำตอบ:


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

Convolution คือกุญแจสู่ความสำเร็จ

แนวคิดมีดังต่อไปนี้: ค้นหาระเบิดที่ใช้งานอยู่ ขยายพื้นที่นี้เป็นตาราง 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 ไบต์ *

มาร์แชลเพื่อนร่วมงานของฉันค้นพบวิธีแก้ปัญหาที่สง่างามสั้นกว่าตัวอักษร 21 ตัว:

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

ลองออนไลน์!

{} ฟังก์ชั่นไม่ระบุชื่อโดยมีการโต้แย้งโดย

'-'@()⍵พุ่งไป ที่ตำแหน่งที่ปิดบังโดยฟังก์ชั่น tacit ต่อไปนี้:

  '!'∘= บูลีนที่เครื่องหมายอัศเจรีย์เท่ากับอาร์กิวเมนต์

  (... )⍣≡ ใช้ฟังก์ชั่นโดยปริยายต่อไปนี้จนกว่าจะไม่มีการเปลี่ยนแปลงเพิ่มเติม:

   ×∘() คูณด้วยค่าคงที่ต่อไปนี้:

    '~'=⍵ บูลีนที่เครื่องหมายตัวหนอนเท่ากับอาร์กิวเมนต์ดั้งเดิม

    (... )+ เพื่อเพิ่ม:

     'X'≠⍵ บูลีนโดยที่ X แตกต่างจากอาร์กิวเมนต์ดั้งเดิม

   {}⌺5 5 สำหรับแต่ละข้อให้ใช้ฟังก์ชั่นต่อไปนี้ในพื้นที่ 5 × 5 ที่อยู่ตรงกลาง:

    4↑1 ใช้สี่องค์ประกอบแรกของหนึ่งเติมด้วยศูนย์ [1,0,0,0]

    1+ เพิ่มหนึ่ง [2,1,1,1]

    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

Java, 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/⍨∨⌿↑ รับ bitmask ซึ่งเซลล์ได้รับผลกระทบและเลือกจาก i

'-'@( )⊢aใส่-ที่ตำแหน่งเหล่านั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.