火で殺します


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
最初の灰がフィールドを2つに分離し、その一部が燃えないようにすることは可能ですか?
アシェプラー

9
4を超えて広がっていない火災が動揺しすぎている場合は、1〜4が強さを増しており、5-Aが燃え尽きていることを想像してください。
ジェレミーワイリッヒ

回答:


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 各セルをムーア近傍に適用されたこの関数の結果に置き換えます:

 ,⍵ 引数をほぐします(平坦化します)。9要素のリストを与える

r←rに  割り当てる

4⊃ 4番目の要素を選択します。中心、つまり元のセル値

c←cに  割り当てる

1= 等しいですか?

: もしそうなら、それから:

  ⍳2 最初にɩの整数。0 1

  9⍴Rの長さが9にeshape。0 1 0 1 0 1 0 1 0

  r/⍨ これを使用してrをフィルタリングします(これにより、直交する近傍が取得されます)

  4∊ 4はそのメンバーですか?(つまり、次の世代には5人がいますか?)

  1+ 1つ追加します。発火していない場合は1、発火した場合は2

 それ以外(つまり、現在の値は0または2以上)

  ×cc  の符号

  c+cプラス(火災の場合は1ずつ増加)

  10⌊ 最低10個(灰が燃えないため)


* Dyalog Classicでは、の⎕U233A 代わりに使用します


小さいですが、ボードの変更には対応していません。3x3に詰まっています。
-Suamere

@Suamere何?ボードのサイズは変わりませんか?
アダム

すみません、はっきりしませんでした。あなたの答えは素晴らしいですが、このソリューションでは、「右側」にギャップがある場合とない場合がある可変サイズのボードを考慮すべきだと理解しています。中央のギャップは処理する必要はありません。「右側」とは、サイズ15のボードが4x4として構築されることを意味するようですが、右端の下部が欠けています。そして、サイズ8のボードは3x3として構築されますが、一番右下のピースが欠けているなどは例外です。それがチャレンジ要件の読み方です。あなたの答えは現在最短ですが、3x3でのみ機能します。
スアメア

@Suamere OPは、入力が2Dであることを明確に述べています。入力を数値行列として取得し、ゼロの形でどこでも「空の」スロットを許可します。入力は3×3 以上である必要がありますが(OPはこれを許可します)、より大きなサイズの入力を受け入れます。実際、ここのリンクをクリックすると、2番目の例が2×3で、右下のセルが空になっていることがわかります。
アダム

わかった。理由はわかりませんが、ここで試してみてくださいリンクに問題があります(おそらく私のせいです)。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(面倒に見えますが、バイトを節約します)
Xoder氏に-8バイトに感謝し
ますovsに26バイトに感謝し
ますppperryに-6バイトに感謝します


例のように空白を追加するにはどうすればよいですか?
-tuskiomi

10

JavaScript(ES6)、217 210 207 204 193 192 190バイト

9as を使用する@Shaggyの提案のおかげで2バイト節約されましたA

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。整数の2D配列として入力します。そのような配列の配列として出力します。


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

網膜103 96 88バイト

^
¶
;{:`

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

オンラインでお試しください!9灰の使用; これは、を使用して4バイトのコストで変更できますT`1-8`2-8A。編集:@MartinEnderのおかげで6バイトを保存しました。説明:

^
¶

出力が互いにぶつからないようにセパレータを追加します。(以下を照合するときにも役立ちます。)

;{:`

最終状態を印刷しないでください(既に印刷されている前の状態と同じです)。パスが状態を変更しなくなるまで繰り返します。各パスの前に現在の状態を印刷します。

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.*¶.*))

上記の行の同じ列で適切なフィールドを探します。これは後読みであり、したがって右から左への一致であるため、バランスグループによって一致した列の前にバランスグループ条件が表示される必要があります。


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

オンラインでお試しください!

「A」の代わりに「9」を使用して、焼損した場所を示します。

説明した

@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@は燃える3野原にあるすべての未燃野をに置き換えることによって左から右への火の広がりを管理し0ます。
  • iがより小さい限り、各桁をインクリメントします9
  • gf各行に適用されてから行を反転し、f再度適用して元に戻ります。次に、行のリストが転置され、再び各行でその逆fが適用されます。
  • hg入力が変更されなくなるまで入力に適用され、結果が収集されます。

入力 "" @ 3 @ 1 \ n @@@ 9 \ n555 @@@@@@@@@@@@@@@@@@@@ "で失敗します。何らかの理由で@sの長い行が最初のイテレーションの後の一番上の行。それを修正することは素晴らしいことです、ありがとう!
グリフォン-モニカの復活

@Gryphon変位は、文字マトリックスの転置によって発生します。他の行が、フィールド、火事、灰のいずれも表さない文字などで同じ長さになっている場合に機能し_ます。これが受け入れられない場合、私は答えを削除する必要があると思います、なぜならそれは使用法に集中しており、transpose大量のバイトを導入することなく簡単にそれを修正する方法が見当たらないからです。
ライコニ

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のデフォルトで許可されているように、2つの入力、その長さが前にある文字列の配列へのポインタを受け取る関数を定義します。末尾に改行を付けてSTDOUTに出力します。

オンラインでお試しください!


inputで永久に実行されます80
アシェプラー

@ascheplerごめんなさい!私はすべてのキャラクターAがsに変わるはずだと思いましたが、どうやら間違っていると思いました。とにかく、情報をありがとう。現在修正されています。
R. Kap


@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

入力は、数字の2D配列、およびでマークされた空のスポットとして取得され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]-とてもいい
スアメア

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入力を整数の2D配列、およびでマークされた空のスポットとして受け取ります'''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 210209185177バイト

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;

という名前のファイルから入力を末尾の改行で取得しますm9灰のため。

で実行する-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バージョンノート(古いアプローチ用)

  • 7.0より古いPHPの場合、その後$c-4|をすべて置き換えます$g[$y+$p=[1,0,-1][$a]][$q+=$x]!="0"||$g[$y+$p][$q]=1;
  • 5.5より古いPHPの場合は[1,0,-1][$a]$a%2*~-($a&2)
  • 7.0より新しいPHPのため、交換するa&$c""<$c+$c0<$c$c-4$c!=4

他のテストケースについてdoesntの」仕事... sandbox.onlinephpfunctions.com/code/...
g19fanatic

@ g19fanatic固定&ゴルフ。気づいてくれてありがとう。
タイタス

0

オクターブ、419 312バイト

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 endforendwhileあなたは書くことができますend
-rahnema1

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.