ฆ่ามันด้วยไฟ


30

การปฏิเสธความรับผิดชอบ: เรื่องราวที่บอกไว้ในคำถามนี้เป็นเรื่องสมมติทั้งหมดและคิดค้นขึ้นเพื่อวัตถุประสงค์ในการให้คำแนะนำ

ฉันเป็นเกษตรกรที่ชั่วร้ายและเพื่อเพิ่มราคาข้าวสาลีในพื้นที่ของฉันฉันตัดสินใจเผาไร่นาของเกษตรกรทั้งหมดที่อยู่รอบตัวฉัน ฉันอยากเห็นทุ่งนาที่ลุกเป็นไฟ (ดังนั้นฉันสามารถใช้เสียงหัวเราะชั่วร้ายของฉันและขยี้มือด้วยความยินดี) แต่ฉันก็ไม่อยากถูกจับได้ดังนั้นฉันต้องการให้คุณจำลองสนาม เผาสำหรับฉัน

งานของคุณ:

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้เป็นอินพุตฟิลด์และส่งคืนสเตจของการเบิร์นจนกระทั่งฟิลด์ทั้งหมดเป็นแอช ส่วนที่เฉพาะเจาะจงของสนามที่อยู่ในไฟจะถูกแสดงด้วยจำนวนเต็มแทนความเข้มของเปลวไฟ ไฟเริ่มต้นที่ "1" และย้ายไปที่ "2" จากนั้น "3" และอื่น ๆ เมื่อถึงไฟ "4" มันจะจับโดยตรง (ไม่ใช่แนวทแยงมุม) บริเวณใกล้เคียงที่ติดไฟได้ง่าย เมื่อมันมาถึง "8" มันจะเผาไหม้ในการทำซ้ำครั้งถัดไปและเปลี่ยนเป็นเถ้าซึ่งมีเครื่องหมาย "A" เมื่อพื้นที่ยังไม่ถูกสัมผัสด้วยไฟจะมีเครื่องหมายเป็น "0" ตัวอย่างเช่นถ้าฟิลด์มีลักษณะดังนี้:

100
000

โปรแกรมของคุณควรแสดงผลลัพธ์ดังนี้:

100
000

200
000

300
000

410
100

520
200

630
300

741
410

852
520

A63
630

A74
741

A85
852

AA6
A63

AA7
A74

AA8
A85

AAA
AA6

AAA
AA7

AAA
AA8

AAA
AAA

หากคุณต้องการคุณสามารถแทนที่สัญลักษณ์ด้านบนด้วยชุดสัญลักษณ์ที่คุณเลือกตราบใดที่มีความสอดคล้องและแตกต่างจากกัน

การป้อนข้อมูล:

ตำแหน่งเริ่มต้นของฟิลด์ในรูปแบบมาตรฐานใด ๆ เช่นสตริงที่มีการกำหนดขอบเขตใหม่ตามด้านบน

เอาท์พุท:

เขตข้อมูลในการวนซ้ำทุกครั้งที่ถูกเผาไหม้ไม่ว่าจะเป็นอาร์เรย์หรือเป็นสตริงที่คั่นด้วยอักขระบางตัว

กรณีทดสอบ:

0301
000A
555
 |
 v
0301
000A
555

1412
010A
666

2523
020A
777

3634
030A
888

4745
141A
AAA

5856
252A
AAA

6A67
363A
AAA

7A78
474A
AAA

8A8A
585A
AAA

AAAA
6A6A
AAA

AAAA
7A7A
AAA

AAAA
8A8A
AAA

AAAA
AAAA
AAA

เกณฑ์การให้คะแนน:

นี่คือคะแนนต่ำสุดเป็นไบต์ชนะ!


1
รูปร่างมีความแตกต่างกันมากแค่ไหน? ชิ้นส่วนที่ไม่ได้เป็นรูปสี่เหลี่ยมผืนผ้านั้น "หลุม" ที่ขอบด้านขวาหรือมีช่องว่างในสนามเสมอหรือไม่?
PurkkaKoodari

3
ดังนั้นบางสิ่งที่กระทบกับ 4 จึงเริ่มเกิดไฟไหม้ในสี่เหลี่ยมที่อยู่ติดกัน แต่สิ่งที่เริ่มต้นที่ 4 หรือสูงกว่านั้นไม่ใช่หรือ นั่นไม่เหมือนจริงมาก
laszlok

14
"ข้อสงวนสิทธิ์: เรื่องราวที่บอกไว้ในคำถามนี้เป็นเรื่องสมมติทั้งหมดและคิดค้นขึ้นเพื่อวัตถุประสงค์ในการให้คำแนะนำ" -> เริ่มต้นด้วย "ฉันเป็นชาวนาที่ชั่วร้าย [ผู้ที่ต้องการทำสิ่งชั่วร้าย]" ฉลาดมาก. ไม่มีใครจะเกี่ยวข้องกับเขตการเผาไหม้ให้กับคุณในขณะนี้
J_F_B_M

3
เป็นไปได้ไหมที่เถ้าเริ่มต้นแยกสนามเป็นสองส่วนเพื่อให้ส่วนนั้นไม่ไหม้?
aschepler

9
หากไฟไม่ลุกลามเกิน 4 จะทำให้อารมณ์เสียให้จินตนาการว่า 1-4 เป็นไฟที่เพิ่มความเข้มและ 5-A หมายถึงไฟลุกไหม้
Jeremy Weirich

คำตอบ:


1

APL (Dyalog) 52 ไบต์ *

ถือว่า⎕IO←0เป็นค่าเริ่มต้นในหลาย ๆ ระบบ ใช้สนามโดยใช้ 0 สำหรับช่องว่าง 1 สำหรับสนามที่ไม่ไหม้ 2 สำหรับไฟใหม่ 5 สำหรับการแพร่กระจายไฟและ 10 สำหรับเถ้า ข้อมูลที่ป้อนต้องมีอย่างน้อย 3 × 3 ซึ่งไม่ใช่ปัญหาเนื่องจากแถวและคอลัมน์เพิ่มเติมอาจเต็มด้วยค่าศูนย์ (ช่องว่างในรูปแบบของ OP)

{}{1=c4r←,⍵:1+4r/⍨9⍴⍳210cc}⌺3 3⍣{⍺≡⎕←⍵}

ลองออนไลน์!

รูปแบบของฉันทำให้ยากต่อการตรวจสอบความถูกต้องดังนั้นนี่คือรุ่นที่มีการเพิ่มก่อนและหลังการประมวลผลเพื่อแปลจากและเป็นรูปแบบของ OP

⍣{... } ทำซ้ำจนกระทั่ง:

 รุ่นถัดไป

 เหมือนกันกับ

⎕←⍵ รุ่นปัจจุบันเอาท์พุท

{}⌺3 3 แทนที่แต่ละเซลล์ด้วยผลลัพธ์ของฟังก์ชั่นนี้ที่ใช้กับพื้นที่ใกล้เคียงของ Moore:

 ,⍵ ravel (แผ่) อาร์กิวเมนต์; ให้รายการเก้าองค์ประกอบ

r← มอบหมายให้r

4⊃ เลือกองค์ประกอบที่สี่ ศูนย์กลางคือค่าเซลล์ดั้งเดิม

c← มอบหมายให้

1= หนึ่งเท่ากับ

: ถ้าเป็นเช่นนั้น:

  ⍳2 คนแรกที่จะɩ ntegers; 0 1

  9⍴r eshape ต่อความยาวเก้า 0 1 0 1 0 1 0 1 0

  r/⍨ ใช้สิ่งนั้นเพื่อกรองr (นี่เป็นเพียงแค่มุมฉากเพื่อนบ้าน)

  4∊ สมาชิกสี่คนนั้นคืออะไร? (เช่นจะมีห้าในรุ่นต่อไปหรือไม่)

  1+ เพิ่มหนึ่ง; 1 ถ้าไม่ถูกไฟไหม้หรือ 2 ถ้าถูกไฟไหม้

 อื่น (เช่นค่าปัจจุบันคือ 0 หรือ≥ 2)

  ×c สัญลักษณ์ของc

  c+cบวกนั่น (คือเพิ่มขึ้นหนึ่งถ้าไฟ)

  10⌊ อย่างน้อยสิบและที่ (เป็นเถ้าไม่ไหม้)


* ใน Dyalog คลาสสิกใช้แทน⎕U233A


เล็ก แต่ไม่จัดการกับการเปลี่ยนแปลงของบอร์ด ติดอยู่ที่ 3x3
Suamere

@Suamere คืออะไร บอร์ดไม่เปลี่ยนขนาดใช่มั้ย
อดัม

ขออภัยฉันไม่ชัดเจน คำตอบของคุณยอดเยี่ยม แต่ฉันเข้าใจว่าวิธีแก้ปัญหาควรอนุญาตให้ใช้กับกระดานขนาดผันแปรซึ่งอาจมีหรือไม่มีช่องว่าง "ด้านขวา" ไม่จำเป็นต้องจัดการช่องว่างตรงกลาง "ทางด้านขวา" ดูเหมือนจะหมายถึงบอร์ดขนาด 15 จะถูกสร้างเป็น 4x4 ยกเว้นชิ้นส่วนล่างขวาสุดหายไป และบอร์ดขนาด 8 จะถูกสร้างเป็น 3x3 ยกเว้นชิ้นส่วนล่างขวาสุดหายไป ฯลฯ นั่นคือวิธีที่ฉันอ่านข้อกำหนดการท้าทาย คำตอบของคุณสั้นที่สุด แต่ใช้ได้กับ 3x3 เท่านั้น
Suamere

@Suamere OP ระบุไว้อย่างชัดเจนว่าอินพุตเป็น 2D ฉันรับอินพุตเป็นเมทริกซ์ตัวเลขและอนุญาตให้มีช่อง "ว่าง" ที่ใดก็ได้ในรูปแบบศูนย์ ในขณะที่ฉันต้องการอินพุตเป็นอย่างน้อย 3 × 3 ( อนุญาตให้ใช้ OP ) ฉันยอมรับอินพุตที่มีขนาดใหญ่ขึ้น อันที่จริงถ้าคุณคลิกที่ลิงค์นี้คุณจะเห็นว่ากรณีตัวอย่างที่สองของฉันคือ 2 × 3 ที่มีเซลล์ด้านล่างขวาว่างเปล่า
2560

Gotcha ไม่แน่ใจว่าทำไม แต่ลิงก์ทดลองใช้ที่นี่มีปัญหา (อาจเป็นความผิดของฉัน) แม้ว่าลิงก์ที่จัดรูปแบบใหม่ของคุณจะทำงานได้ดี EG: fire '0A000\n0A0A0\n0A0A0\n000A1'ทำงานได้อย่างสมบูรณ์บนฟอร์แมทที่จัดรูปแบบ แต่ฉันไม่สามารถเทียบเท่ากับการทำงานกับลิงค์แรกได้ ฉันอาจทำสิ่งผิดปกติ สิ่งนี้ไม่ได้ผลสำหรับฉัน:f ↑(0 0 0)(0 1 0)(0 0 0)
Suamere

15

Python 3 , 232 ไบต์

def f(j):
 k=[[int(min(9,j[x][y]+(j[x][y]>0)or 3in(lambda k,x,y:[k[i][j]for i,j in[[x-1,y],[x+1,y],[x,y-1],[x,y+1]]if(-1<i<len(k))and(-1<j<len(k[i]))])(j,x,y)))for y in range(len(j[x]))]for x in range(len(j))]
 if k!=j:print(k);f(k)

ลองออนไลน์!

ขอขอบคุณอย่างเป็นทางการจากไบต์ -3 โดยรวมแลมบ์ดาอื่นเข้าด้วยกันf(ดูยุ่ง แต่บันทึกไบต์และนั่นคือทั้งหมดที่เราใส่ใจ)
-8 ไบต์ขอบคุณ Mr. Xoder
-26 ไบต์ขอบคุณ ovs
-6 ไบต์ขอบคุณ ppperry


ฉันจะเพิ่มช่องว่างเช่นในตัวอย่างได้อย่างไร
tuskiomi

10

JavaScript (ES6), 217 210 207 204 193 192 190 ไบต์

ที่บันทึกไว้ 2 ไบต์ขอบคุณที่ @ ข้อเสนอแนะปุยของการใช้เป็น9A

f=F=>[F,...(t=[],y=0,g=x=>(r=F[y])?(x||(t[y]=[]),r[x]+1)?(t[y][x]=r[x]<8?r[x]+(r[x]>0|[r[x-1],r[x+1],F[y-1]&&F[y-1][x],F[y+1]&&F[y+1][x]].includes(3)):9,g(x+1)):g(0,y++):t)(0)+""!=F?f(t):[]]

// test code
test=s=>{
  var test = document.querySelector("#in").value.split`\n`.map(e => Array.from(e).map(e => parseInt(e)));
  var out = f(test);
  document.querySelector("#out").innerHTML = out.map(e => e.map(e => e.join``).join`\n`).join`\n\n`;
};window.addEventListener("load",test);
<textarea id="in" oninput="test()">0301&#10;0009&#10;555</textarea><pre id="out"></pre>

ใช้แทน9 Aอินพุตเป็นอาร์เรย์จำนวนเต็ม 2 มิติ เอาต์พุตเป็นอาร์เรย์ของอาร์เรย์ดังกล่าว


คุณสามารถบันทึกอะไรก็ได้โดยใช้9แทนAหรือไม่
ขนดก

7

จำลองโลก (ในอิโมจิ) 1407 ไบต์?

คุณไม่ชอบใช้คำอธิบายที่อธิบายได้ง่ายในการเขียนโปรแกรมภาษาหรือไม่? ข้อเสียของเรื่องนี้คือมักจะไม่มีโปรแกรมที่กำหนดไว้อย่างดีดังนั้นในกรณีนี้ฉันใช้ JSON ที่ส่งออก (หากคุณมีความคิดที่ดีกว่านี้แจ้งให้เราทราบ)

{"meta":{"description":"","draw":1,"fps":1,"play":true},"states":[{"id":0,"icon":"0","name":"","actions":[{"sign":">=","num":1,"stateID":"4","actions":[{"stateID":"1","type":"go_to_state"}],"type":"if_neighbor"}],"description":""},{"id":1,"icon":"1","name":"","description":"","actions":[{"stateID":"2","type":"go_to_state"}]},{"id":2,"icon":"2","name":"","description":"","actions":[{"stateID":"3","type":"go_to_state"}]},{"id":3,"icon":"3","name":"","description":"","actions":[{"stateID":"4","type":"go_to_state"}]},{"id":4,"icon":"4","name":"","description":"","actions":[{"stateID":"5","type":"go_to_state"}]},{"id":5,"icon":"5","name":"","description":"","actions":[{"stateID":"6","type":"go_to_state"}]},{"id":6,"icon":"6","name":"","description":"","actions":[{"stateID":"7","type":"go_to_state"}]},{"id":7,"icon":"7","name":"","description":"","actions":[{"stateID":"8","type":"go_to_state"}]},{"id":8,"icon":"8","name":"","description":"","actions":[{"stateID":"9","type":"go_to_state"}]},{"id":9,"icon":"A","name":"","description":"","actions":[]}],"world":{"update":"simultaneous","neighborhood":"neumann","proportions":[{"stateID":0,"parts":100},{"stateID":1,"parts":0},{"stateID":2,"parts":0},{"stateID":3,"parts":0},{"stateID":4,"parts":0},{"stateID":5,"parts":0},{"stateID":6,"parts":0},{"stateID":7,"parts":0},{"stateID":8,"parts":0},{"stateID":9,"parts":0}],"size":{"width":9,"height":9}}}

ลองที่นี่หรือที่นี่:

<iframe width="100%" height="450" src="http://ncase.me/simulating/model/?remote=-Kr2X939XcFwKAunEaMK" frameborder="0"></iframe>


6

Retina , 103 96 88 ไบต์

^
¶
;{:`

T`0d`d
(?<=¶(.)*)0(?=4|.*¶(?<-1>.)*(?(1)_)4|(?<=40|¶(?(1)_)(?<-1>.)*4.*¶.*))
1

ลองออนไลน์! ใช้9เป็นเถ้า นี้สามารถเปลี่ยนแปลงได้ค่าใช้จ่ายของ 4 T`1-8`2-8Aไบต์โดยใช้ แก้ไข: บันทึกแล้ว 6 ไบต์ขอบคุณ @MartinEnder คำอธิบาย:

^
¶

เพิ่มตัวคั่นเพื่อให้ผลลัพธ์ไม่ได้ทำงานร่วมกัน (และช่วยเมื่อจับคู่ด้านล่างด้วย)

;{:`

อย่าพิมพ์สถานะสุดท้าย (ซึ่งเหมือนกับรัฐก่อนหน้าซึ่งถูกพิมพ์ไปแล้ว) ทำซ้ำจนกระทั่งไม่เปลี่ยนสถานะ พิมพ์สถานะปัจจุบันก่อนผ่านแต่ละรอบ

T`0d`d

เพิ่มความเข้มของไฟทั้งหมด

(?<=¶(.)*)0(?=4|.*¶(?<-1>.)*(?(1)_)4|(?<=40|¶(?(1)_)(?<-1>.)*4.*¶.*))
1

แสงฟิลด์ที่ไม่ส่องแสงตามความเหมาะสม ย่อยคำอธิบาย:

(?<=¶(.)*)

วัดหมายเลขคอลัมน์ของฟิลด์ที่ไม่ติดไฟนี้

0

จับคู่ฟิลด์ที่ไม่ติดไฟ

(?=4

มองหาฟิลด์ที่เหมาะสมทางด้านขวา

  |.*¶(?<-1>.)*(?(1)_)4

ค้นหาเขตข้อมูลที่เหมาะสมในคอลัมน์เดียวกัน (ใช้กลุ่มสมดุล) ในบรรทัดด้านล่าง โปรดทราบว่าหากสามารถรับประกันการป้อนข้อมูลเป็นรูปสี่เหลี่ยมผืนผ้าได้สิ่งนี้สามารถทำให้ง่ายขึ้น|.*¶(?>(?<-1>.)*)4สำหรับการบันทึก 3 ไบต์

  |(?<=40

มองหาช่องที่เหมาะสมทางด้านซ้าย (เนื่องจากเรามองจากด้านขวาของสนามเราจึงเห็นสนามที่ไม่ส่องแสงเช่นกัน)

      |¶(?(1)_)(?<-1>.)*4.*¶.*))

ค้นหาเขตข้อมูลที่เหมาะสมในคอลัมน์เดียวกันในบรรทัดด้านบน เนื่องจากนี่คือ lookbehind และดังนั้นการจับคู่จากขวาไปซ้ายเงื่อนไขกลุ่มสมดุลจึงต้องปรากฏก่อนคอลัมน์ที่ถูกจับคู่โดยกลุ่มดุล


5

Perl 5 , 365 ไบต์

@a=map{[/./g]}<>;do{say@$_ for@a;say;my@n=();for$r(0..$#a){$l=$#{$a[$r]};for(0..$l){$t=$a[$r][$_];$n[$r][$_]=($q=$n[$r][$_])>$t?$q:$t==9?9:$t?++$t:0;if($t==4){$n[$r-1][$_]||=1if$r&&$_<$#{$a[$r-1]};$n[$r+1][$_]||=1if$r<$#a&&$_<$#{$a[$r+1]};$n[$r][$_-1]||=1if$_;$n[$r][$_+1]||=1if$_<$l}}}$d=0;for$r(0..$#a){$d||=$a[$r][$_]!=$n[$r++][$_]for 0..$#{$a[$r]}}@a=@n}while$d

ลองออนไลน์!

ใช้ '9' แทน 'A' เพื่อระบุตำแหน่งที่ถูกไฟไหม้

อธิบาย

@a=map{[/./g]}<>;   # split input into a 2-D array

do{
say@$_ for@a;say;   # output the current state
my@n=();            # holds the next iteration as it's created
for$r(0..$#a){      # loop through rows
  $l=$#{$a[$r]};    # holder for the length of this row
  for(0..$l){
    $t=$a[$r][$_];  # temporary holder for current value
    $n[$r][$_]=($q=$n[$r][$_])>$t?$q:$t==9?9:$t?++$t:0; #update next iteration
    if($t==4){      # ignite the surrounding area if appropriate
      $n[$r-1][$_]||=1if$r&&$_<$#{$a[$r-1]};
      $n[$r+1][$_]||=1if$r<$#a&&$_<$#{$a[$r+1]};
      $n[$r][$_-1]||=1if$_;
      $n[$r][$_+1]||=1if$_<$l
    }
  }
}
$d=0;              # determine if this generation is different than the previous
for$r(0..$#a){$d||=$a[$r][$_]!=$n[$r++][$_]for 0..$#{$a[$r]}}
@a=@n              # replace master with new generation
}while$d

4

Haskell , 162 ไบต์

import Data.List
i x|x<'9'=succ x|1<2=x
f('3':'@':r)="30"++f r
f(x:r)=x:f r
f e=e
a%b=a.b.a.b
g=map(i<$>).(transpose%map(reverse%f))
h x|y<-g x,y/=x=x:h y|1<3=[x]

ลองออนไลน์! การใช้งาน: hรับฟิลด์เป็นรายการบรรทัดและส่งคืนรายการฟิลด์ สนามเผาไหม้จะถูกระบุด้วย@และเถ้าจาก9การเกิดเพลิงไหม้ที่แตกต่างกันตัวเลขไป18

  • fจัดการการแพร่กระจายของไฟจากซ้ายไปขวาโดยการแทนที่เผาไหม้ทุก@สาขาซึ่งเป็นสิทธิที่จะเผาไหม้เขตข้อมูลที่มี30
  • i9เพิ่มขึ้นแต่ละหลักตราบใดที่มันจะน้อยกว่า
  • gใช้fกับแต่ละบรรทัดจากนั้นกลับบรรทัดใช้fอีกครั้งและย้อนกลับ จากนั้นรายการของเส้นจะถูก transposed และอีกครั้งในแต่ละบรรทัดและย้อนกลับfถูกนำไปใช้
  • hนำgไปใช้กับอินพุตจนกว่าจะไม่มีการเปลี่ยนแปลงและรวบรวมผลลัพธ์

ล้มเหลวในการป้อนข้อมูล "" @ 3 @ 1 \ n @@@ 9 \ n555 @@@@@@@@@@@@@@@@@@@@ "" ด้วยเหตุผลบางประการที่สายยาวของ @s เปลี่ยนเป็น บรรทัดบนสุดหลังจากการทำซ้ำครั้งแรกการแก้ไขจะดีมากขอบคุณ!
Gryphon - Reinstate Monica

@Gryphon การกระจัดเกิดจากการสลับเมทริกซ์อักขระ มันทำงานได้ถ้าสายอื่น ๆ จะถูกนำไปยาวเช่นเดียวกับตัวละครบางอย่างที่แสดงให้เห็นถึงค่าสนาม, _ไฟไหม้หรือเถ้าเช่น หากสิ่งนี้ไม่เป็นที่ยอมรับฉันกลัวว่าฉันจะต้องลบคำตอบเพราะมันอยู่ที่การใช้งานtransposeและฉันไม่เห็นวิธีที่จะแก้ไขได้อย่างง่ายดายโดยไม่ต้องใช้ไบต์จำนวนมาก
Laikoni

4

C (gcc) , 308 305 299 297 295 291 ไบต์

#define F B[i][v]
m(A,B,k,y,m,U,i,v)char**B;{do{for(i=k=y=0;i<A;puts(""),++i)for(v=0;v<(m=strlen(B[i]));F=(U=F)>48&&F<56?F+1:F>55?65:(i+1<A&&B[i+1][v]==51||v+1<m&&B[i][v+1]==51||v-1>-1&&B[i][v-1]==52||i-1>-1&&B[i-1][v]==52)&&U<49?49:F,putchar(U),k+=U<49||U>64,++y,++v);puts("");}while(k-y);}

โปรแกรมนี้กำหนดฟังก์ชั่นซึ่งรับสองอินพุตตัวชี้ไปยังอาร์เรย์ของสตริงที่นำหน้าด้วยความยาวตามที่อนุญาตโดย นี้ I / O เริ่มต้น ส่งออกไปยัง STDOUT ด้วยการขึ้นบรรทัดใหม่

ลองออนไลน์!


80วิ่งตลอดไปกับการป้อนข้อมูล
aschepler

@aschepler ขออภัย! ฉันคิดว่าตัวละครทุกตัวต้องกลายเป็นAs แต่ดูเหมือนว่าฉันคิดผิด อย่างไรก็ตามขอขอบคุณสำหรับข้อมูล ตอนนี้ได้รับการแก้ไขแล้ว
R. Kap

-6 ไบต์! Tio Link
Giacomo Garabello

@GiacomoGarabello ฉันไม่อยากจะเชื่อเลยว่าฉันลืมกลยุทธ์นั้น ขอบคุณที่เตือนฉัน! :)
R. Kap

4

ระดับแปดเสียง72 69 ไบต์

a=input(''),do++a(a&a<9);a+=imdilate(a==4,~(z=-1:1)|~z')&~a,until a>8

การป้อนข้อมูลที่จะนำมาเป็น array 2 Infมิติของตัวเลขและจุดที่ว่างเปล่าที่มีเครื่องหมาย 'A'ถูกแทนที่ด้วย9ได้ถูกแทนที่ด้วยผลลัพธ์ระดับกลาง (เป็นอาร์เรย์ของตัวเลข) พิมพ์โดยนัย

ลองออนไลน์!

คำอธิบาย:

ในการวนซ้ำฟังก์ชันimdilate(การขยายรูปภาพก้าน) จากแพ็คเกจภาพถูกใช้เพื่อจำลองการแพร่กระจายไฟ


1
ใช้ได้กับบอร์ดทุกขนาดและแม้แต่กับรูเล็ก ๆ EG: [0 Inf 0 0 0;0 Inf 0 Inf 0;0 Inf 0 Inf 0;0 0 0 Inf 1]- ดีมาก
Suamere

1

Python 2 , 325 ไบต์

def f(x):
 while{i for m in x for i in m}>{9,''}:
    yield x;i=0
    for l in x:
     j=0
     for c in l:
        if 0<c<9:x[i][j]+=1
        j+=1
     i+=1
    i=0
    for l in x:
     j=0
     for c in l:
        if c==0 and{1}&{x[k[1]][k[2]]==4for k in[y for y in[[i,i-1,j],[i<len(x)-1,i+1,j],[j,i,j-1],[j<len(l)-1,i,j+1]]if y[0]]}:x[i][j]+=1
        j+=1
     i+=1
 yield x

fจะเข้าเป็นอาร์เรย์ 2 ''มิติของจำนวนเต็มและจุดที่ว่างเปล่าที่มีเครื่องหมาย ได้ถูกแทนที่ด้วย'A' 9ฟังก์ชั่นเอาท์พุทตัวสร้างของฟิลด์ทั้งหมดเมื่อเวลาผ่านไปในรูปแบบเดียวกัน

ลองออนไลน์!


1

อ็อกเทฟ 212 ไบต์

function r(f)b=48;f-=b;c=-16;l=f~=-c;d=17;p=@(x)disp(char(x+b));g=@()disp(' ');p(f);g();while~all(any(f(:)==[0 d c],2))m=f>0&l;f(m)+=1;k=conv2(f==4,[0 1 0;1 0 1;0 1 0],'same')&~m&l;f(k)+=1;f(f>8&l)=d;p(f);g();end

หากต้องการเรียกใช้ให้ระบุอาร์เรย์อักขระเช่น:

f = ['0301','000A','555 '];

... จากนั้นทำ:

r(f)

คำอธิบายของรหัสที่จะปฏิบัติตาม ...

ลองออนไลน์!

หมายเหตุ: ฉันพยายามเรียกใช้รหัสนี้ด้วยtio.runแต่ฉันไม่ได้รับผลลัพธ์ใด ๆ ฉันต้องใช้บริการอื่น


จริงๆในขณะนี้ฉันต้องการโพสต์คำตอบระดับแปดคำที่คุณตอบก่อนที่จะ ..
Michthan

1

PHP, 226 212 210 209 185 177 ไบต์

for($f=file(m);$f!=$g;print"
")for($g=$f,$y=0;$r=$f[$y++];)for($x=-1;~$c=$r[++$x];$f[$y-1][$x]=$c=="0"?strstr($g[$y-2][$x].$r[$x-1].$f[$y][$x].$r[$x+1],51)/3:min(++$c,9))echo$c;

จะเข้ากับการขึ้นบรรทัดใหม่ต่อท้ายจากไฟล์ชื่อm; 9สำหรับขี้เถ้า

ทำงานด้วย-nrหรือลองออนไลน์


วิธีแรก: PHP 7.0, 209 ไบต์

for($f=$g=file(m);trim(join($f),"A
");print"
".join($f=$g))for($y=-1;(a&$c=$r[++$x])||$r=$f[$y-=$x=-1];)for(+$c&&$g[$y][$x]=++$c<9?$c:A,$a=4;$a--;$q=$p)$c-4|($w=&$g[$y+$p=[1,0,-1][$a]])[$q+=$x]!="0"||$w[$q]=1;

mจะเข้ากับการขึ้นบรรทัดใหม่ต่อท้ายจากไฟล์ชื่อ

ทำงานด้วย-nrหรือลองออนไลน์

บันทึกย่อเวอร์ชัน PHP (สำหรับวิธีการแบบเก่า)

  • สำหรับ PHP เก่ากว่า 7.0 แทนที่ทุกอย่างหลังจาก$c-4|ที่มี$g[$y+$p=[1,0,-1][$a]][$q+=$x]!="0"||$g[$y+$p][$q]=1;
  • สำหรับ PHP ที่เก่ากว่า 5.5 แทนที่[1,0,-1][$a]ด้วย$a%2*~-($a&2)
  • สำหรับ PHP ใหม่กว่า 7.0 แทนที่a&$cด้วย""<$c, +$cมี0<$cและ$c-4มี$c!=4

ไม่ทำงานสำหรับกรณีทดสอบอื่น ๆ ... sandbox.onlinephpfunctions.com/code/…
g19fanatic

@ g19fanatic แก้ไข & golfed ขอบคุณที่สังเกต
ติตัส

0

Octave, 419 312 bytes

M=input('') %take a matrix M as input
[a, b]=size(M); %size M for later
while mean(mean(M))!=9 %while the whole matrix M isn't ashes
M=M+round(M.^0.001); %if there is a nonzero int add 1 to it
for i=1:a %loop over all values of M
for j=1:b
if(M(i,j)==4) %if a value of 4 is found, ignite the zeros around it
if(M(max(i-1,1),j)==0) M(i-1,j)++;end
if(M(min(i+1,a),j)==0) M(i+1,j)++;end
if(M(i,max(j-1,1))==0) M(i,j-1)++;end      
if(M(i,min(j+1,b))==0) M(i,j+1)++;end
elseif(M(i,j)==10) M(i,j)--;
end
end
end
M %display the matrix
end

ลองออนไลน์!

นี่เป็นเวอร์ชั่นของฉันที่ใช้งานได้ดังนั้นตอนนี้ฉันยังต้องเล่นกอล์ฟ ฉันคิดว่ามันจะสั้นกว่านี้ถ้าฉันหาวิธีหาดัชนีของ 4 ในเมทริกซ์ แต่ฉันไม่รู้วิธี
PS: A คือ 9 ในรหัสของฉัน


2
แทนที่จะเป็นendif endforและendwhileคุณสามารถเขียนend
rahnema1

0

ลายฉลุ ( - โหมด) , 22 ไบต์

S8:'A'0::S⋄(3N)⌈S+s

ลองออนไลน์!

เช่นเดียวกับในการป้อนข้อมูลการทดสอบการใช้งานจำนวนเต็มคั่นด้วยช่องว่างสำหรับ0- 8, ' 'สำหรับที่ว่างเปล่าและสำหรับ'A' Aอย่าลืมเพิ่มช่องว่างต่อท้ายด้วย

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