フライヤーシミュレーター


31

あなたの仕事は、食物に対する生地の影響をモデリングすることです。3層のクラストを追加してください。

[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0], // in
 [0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
 [0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0],
 [0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,1,0,0],
 [0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0],
 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]
                   |
                   V
[[0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,2,1,2],
 [0,0,2,1,2,2,0,0,0,0,0,0,0,2,2,0,2,0],
 [0,0,2,1,1,1,2,0,0,0,0,0,2,1,1,2,0,0],
 [0,0,0,2,1,2,0,0,0,0,0,2,1,1,2,1,2,0],
 [0,0,0,0,2,0,0,0,0,0,0,0,2,1,1,1,2,0],
 [0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0]]
                   |
                   V
[[0,0,3,2,3,3,0,0,0,0,0,0,0,3,3,2,1,2],
 [0,3,2,1,2,2,3,0,0,0,0,0,3,2,2,3,2,3],
 [0,3,2,1,1,1,2,3,0,0,0,3,2,1,1,2,3,0],
 [0,0,3,2,1,2,3,0,0,0,3,2,1,1,2,1,2,3],
 [0,0,0,3,2,3,0,0,0,0,0,3,2,1,1,1,2,3],
 [0,0,0,0,3,0,0,0,0,0,0,0,3,2,2,2,3,0]]
                   |
                   V
[[0,4,3,2,3,3,4,0,0,0,0,0,4,3,3,2,1,2], // out
 [4,3,2,1,2,2,3,4,0,0,0,4,3,2,2,3,2,3],
 [4,3,2,1,1,1,2,3,4,0,4,3,2,1,1,2,3,4],
 [0,4,3,2,1,2,3,4,0,4,3,2,1,1,2,1,2,3],
 [0,0,4,3,2,3,4,0,0,0,4,3,2,1,1,1,2,3],
 [0,0,0,4,3,4,0,0,0,0,0,4,3,2,2,2,3,4]]

ちょっとした視覚補助:

入力は、フライヤーを表すブール行列です。0は油、1は食品です。関数またはプログラムは、1の周りに2、3、および4の3つのレイヤーを追加し、0の一部を上書きする必要があります。バッターは、ドーナツ(穴のある食品)や砕けるもの(孤立した食品の「ピクセル」)など、あらゆる形状やサイズの食品に水平方向および垂直方向(ただし斜めではない)に付着し、フライヤーの境界に制限されます。生地の初期の層は地殻に変わり、後の層の影響を受けません。

言い換えると、最初に1のvon-Neumann近傍にあるすべての0を2に置き換え、次に2のvon-Neumann近傍にあるすべての0を3に置き換え、最後にvon-Neumann近傍にあるすべての0を置換する必要があります3秒と4秒。したがって、数値2,3,4は、最も近い1セルまでのマンハッタン距離より1大きい量を表します。

フライヤーのサイズは少なくとも3行3列で、少なくとも1枚の食べ物が入っています。I / Oは柔軟です-あなたの言語に適したマトリックス形式を使用してください。余分な空白は許可されますが、短いコードが望ましく、抜け穴は禁止されています。

その他のテスト:

 [[0,0,1], // in
  [0,0,0],
  [0,1,0]]

 [[3,2,1], // out
  [3,2,2],
  [2,1,2]]

 -

 [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], // in
  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
  [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0],
  [1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0],
  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0],
  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0],
  [0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0],
  [0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0],
  [0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1],
  [0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0],
  [0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
  [0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,0,0,0,0,0,0],
  [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0]]

 [[3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,3,3,4,3,3,3,4,4,4,3,2,1], // out
  [2,3,4,0,0,0,0,0,0,0,0,0,0,0,0,4,3,2,2,3,2,2,2,3,3,4,4,3,2],
  [1,2,3,4,0,0,0,0,0,0,0,0,0,0,4,3,2,1,1,2,1,1,1,2,2,3,4,4,3],
  [1,1,2,3,4,4,4,4,0,0,0,0,0,4,3,2,1,1,1,1,1,1,1,1,1,2,3,4,4],
  [2,2,3,4,4,3,3,3,4,0,0,0,4,3,2,1,1,2,1,1,1,1,1,2,2,1,2,3,4],
  [3,3,4,4,3,2,2,2,3,4,0,0,4,3,2,1,2,2,1,1,2,2,1,2,3,2,3,4,4],
  [4,4,4,3,2,1,1,1,2,3,4,0,4,3,2,1,1,2,1,2,3,3,2,2,2,3,4,3,3],
  [0,4,3,2,1,1,2,1,2,3,4,0,0,4,3,2,2,2,1,2,3,3,2,1,1,2,3,2,2],
  [4,3,2,1,1,2,2,1,2,3,4,0,0,0,4,3,3,3,2,3,4,4,3,2,2,3,2,1,1],
  [3,2,1,2,1,1,1,1,2,3,4,0,0,0,0,4,4,3,3,3,4,3,3,3,3,3,2,1,2],
  [4,3,2,1,2,2,1,2,3,4,0,0,0,0,0,4,3,2,2,2,3,2,2,3,4,4,3,2,3],
  [0,4,3,2,1,1,2,3,2,3,4,0,0,0,4,3,2,1,1,1,2,1,1,2,3,4,4,3,4],
  [0,0,4,3,2,2,3,2,1,2,3,4,0,0,0,4,3,2,2,2,3,2,2,3,4,4,3,2,3],
  [0,0,0,4,3,3,4,3,2,3,4,0,0,0,0,0,4,3,3,3,4,3,3,4,4,3,2,1,2],

ちょっとした視覚補助:


視覚化について@Tschallackaに感謝します。


4
ウォークスルーの例を教えてください。または、なぜ2、3または4を使用するとき、それは私にははっきりしていない(私が不明確としてVTCをいただきたいが、私は今、ハンマーを持っていると私は同じようには少数派に見える)
シャギー

1
@Shaggy私の理解では、数字は「レイヤー」を識別するということです。1D例:000010000000212000003212300043212340
georgewatson

4
ありがとう、@ georgewatson; あなたは正しいようです。ただし、仕様からは明らかではありません。仕様では、「バッター」は食物のみに固執する必要があり、バターの前の層は後の層の影響を受けません。それを判断する唯一の方法は、テストケースからそれを解読することです。
シャギー

6
次の課題は、Friarシミュレーターです。
魔法のタコ

5
@ngn 本当に?(͡°͜ʖ͡°)
魔法のタコ

回答:


10

ステンシル:1 + 14 = 15バイト

コマンドライン引数: 3

コード: s<×⌈/N:1+⌈/N⋄S

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

3 次の変換を3回繰り返します。

s かどうかあればS elfが非空であります

< よりも少ない

× のサイン

⌈/N フォンノイマンN近傍の最大値

: その後、新しい値は

  1+ ワンプラス

  ⌈/N フォンノイマンN近傍の最大値

 他に

  S 値は変更されないまま(S elf)


これは15バイト(引数の場合は14 + 1 3)であってはなりませんか?初めてStencilを目にしましたが、正しく理解すれば、Dyalog APLがマトリックスに利益をもたらすための拡張機能ですか?また、小さなコメント:Neumann説明の最後の小さな大文字ではなく、先頭の大文字のNを太字にする必要があります。:)
ケビンクルーイッセン

1
さて、最新のコンセンサスは、単一の言語のさまざまな構成を個別の言語としてカウントする必要があることを示しているようですが、それを追加します
18

1
@KevinCruijssen Stencil 、簡単なセルラーオートマトンのDyalog APLツールとして使用できますが、ゴルフ言語としての機能も備えています。実際、ツールの使用法とゴルフ言語との間を移動する場合、コードを変更する必要がある場合があります。
アダム

1
@KevinCruijssenいいえ、大胆な最後のNは意図的なものです。Stencilは、selfの有無にかかわらず、moorevon neumannの最初と最後の文字をニーモニックとして使用し、空でない数と実際の要素リストのニーモニックとして小文字と大文字を使用するドキュメントを参照してください。
アダム

@KevinCruijssenまた、ステンシルはDyalog APLのビルトイン(ステンシルと呼ばれる)への単なるインターフェイスであることに言及する必要があります。そのドキュメントも参照してください。単一のビルトインで構築されたゴルフ言語全体!実際、単一のDyalog APLビルトインに基づいて、QuadRとQuadSの 2つの他のゴルフ言語を作成しました
アダム

10

ジャワ8、271の 269 247 210 202 198 193バイト

a->{for(int n=0,i,j,t,I,J;++n<4;)for(i=a.length;i-->0;)for(j=a[0].length;j-->0;)for(t=4;a[i][j]==n&t-->0;)try{a[I=t>2?i-1:t>1?i+1:i][J=t<1?j-1:t<2?j+1:j]+=a[I][J]<1?n+1:0;}catch(Exception e){}}

Javaとインデックス依存のマトリックス..すでに冗長な言語を始めるのに適した組み合わせではありません。..

新しい行列を返す代わりに、入力行列を変更します。

説明:

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

a->{                            // Method with integer-matrix parameter and no return-type
  for(int n=0,i,j,t,I,J;++n<4;) //  Loop `n` in range [1, 4)
    for(i=a.length;i-->0;)      //   Inner loop over the rows
      for(j=a[0].length;j-->0;) //    Inner loop over the columns
        for(t=4;a[i][j]==n&     //     If the current cell contains the current `n`:
                t-->0;)         //      Loop `t` downwards in the range (4, 0]
          try{a[                //       Get the cell at a location relative to the current
                I=t>2?          //        If `t` is 3:
                 i-1            //         Take the cell above
                :t>1?           //        Else if `t` is 2:
                 i+1            //         Take the cell below
                :i][J=t<1?      //        Else if `t` is 0:
                 j-1            //         Take the cell left
                :t<2?           //        Else if `t` is 1:
                 j+1:j]         //         Take the cell right
              +=a[I][J]<1?      //       And if this cell contains a 0:
                 n+1:0;         //        Fill it with `n+1`
          }catch(Exception e){} //       catch and ignore ArrayIndexOutOfBoundsExceptions
                                //       (try-catch saves bytes in comparison to if-checks)


3

JavaScript(ES6)、107 105バイト

f=(m,k=1)=>k<4?f(m.map((r,y)=>r.map((v,x)=>v|[-1,0,1,2].every(d=>(m[y+d%2]||0)[x+~-d%2]^k)?v:k+1)),k+1):m

テストケース

コメント済み

f = (m, k = 1) =>                  // given the input matrix m[] and starting with k = 1
  k < 4 ?                          // if this is not the 4th iteration:
    f(                             //   do a recursive call:
      m.map((r, y) =>              //     for each row r[] at position y in m[]:
        r.map((v, x) =>            //       for each cell v at position x in r[]:
          v |                      //         if v is non-zero
          [-1, 0, 1, 2].every(d => //         or each neighbor cell at (x+dx, y+dy), with:
            (m[y + d % 2] || 0)    //           dy = d % 2 --> [-1, 0, 1, 0]
            [x + ~-d % 2]          //           dx = (d - 1) % 2 --> [0, -1, 0, 1]
            ^ k                    //           is different from k  
          ) ?                      //         then:
            v                      //           let the cell unchanged
          :                        //         else:
            k + 1                  //           set the cell to k + 1
        )                          //       end of inner map()
      ),                           //     end of outer map()
      k + 1                        //     increment k for the next iteration
    )                              //   end of recursive call
  :                                // else:
    m                              //   stop recursion and return m[]

3

Python 3、176バイト

f=lambda a,i=-2,e=enumerate:a*i or f([[E or int((6*max(len(a)>i>-1<j<len(a[i])and a[i][j]for i,j in((r+1,c),(r-1,c),(r,c+1),(r,c-1))))**.5)for c,E in e(R)]for r,R in e(a)],i+1)

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

Mr. Xcoderのおかげで-18バイト
ovsのおかげで-20バイト


9
明日の朝目を覚まして、このコードをもう一度見ると、おそらく非常にばかげた気分になるだろう。」Javaであなたを追い抜いたので、あなたはそうあるべきです。; P
ケビンクルーッセン

1
@KevinCruijssen何D:受け入れられない。Javaに
beat

1
Java:c – 196 bytesを打ち負かしましょう。
氏Xcoder

@ Mr.Xcoder感謝:c:D
HyperNeutrino

@ovsいいね、ty!
ハイパーニュートリノ


3

Fortran 95の、309の 299 294 287 269バイト

subroutine f(a)
integer::a(:,:),s(2)
integer,allocatable::b(:,:)
s=shape(a)
allocate(b(0:s(1)+1,0:s(2)+1))
do1 k=0,3
do1 i=1,s(1)
do1 j=1,s(2)
b(i,j)=a(i,j)
if(any((/b(i+1,j)==k,b(i-1,j)==k,b(i,j+1)==k,b(i,j-1)==k/)).and.b(i,j)<1.and.k>0)b(i,j)=k+1
1 a(i,j)=b(i,j)
end

Fortranはゴルフ言語ではありません。

  • 編集:奇妙な昔ながらのdoループを使用して10バイトを保存しました。
  • 編集2: 5バイトで保存any()
  • 編集3:不要なものを削除して7バイトを保存しましたif
  • 編集4:の宣言を縮小して18バイトを保存しましたs



1

Perl、63バイト

+3を含む 0ap

perl -0ape 's/0(?=$a|.{@{-}}$a)/$a+1/seg,$_=reverse while($a+=$|-=/
/)<4'

入力行列最後の改行なしの数字のブロックとして与えます。例えば

001
000
010

3x3の例の場合。出力形式は同じで、最後の改行のない数字のブロックです。

次のような小さなスクリプトを使用できます

perl -i -0pe 's/\n*$//' <file>

お気に入りのエディターで行うのが難しい場合に、ファイルから最終改行を簡単に削除する



1

網膜93 87 84バイト

1
4
3{m`(?<=^(.)*)0(?=4|.*¶(?>(?<-1>.)*)4|(?<=40|^(?(1)_)(?<-1>.)*4.*¶.*))
5
T`1-5`d

オンラインでお試しください!Kill it With Fireに対する私の答えに基づいています。編集:@MartinEnderのおかげで6 9バイトを保存しました。説明:

1
4

すべての1を4に変えます。

3{

プログラムの残りを(最大で)3回繰り返します。

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

4に隣接するすべての0を5に変更します。

T`1-5`d

すべての数字をデクリメントします。

網膜0.8.2100の 94バイト

1
3
{m`(?<=^(.)*)0(?=3|.*¶(?>(?<-1>.)*)3|(?<=30|^(?(1)_)(?<-1>.)*3.*¶.*))
4
T`1-4`d`^[^1]+$

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

1
3

すべての1を3に変えます。

{

出力が変わらなくなるまで繰り返します。

m`(?<=^(.)*)0(?=3|.*¶(?>(?<-1>.)*)3|(?<=30|^(?(1)_)(?<-1>.)*3.*¶.*))
4

3に隣接するすべての0を4に変更します。

T`1-4`d`^[^1]+$

1がない場合は、すべての数字を減らします。


!代わりに(入力に表示されない)のような文字を使用して、いくつかのバイトを保存できます(?!)
マーティンエンダー

@MartinEnderありがとう、それはKill it With Fireでも機能します(そして、私はそこにいた間に別の2バイトのゴルフを見つけました!)
ニール

1

ルビー183の 158 146バイト

->a{3.times{|n|a.size.times{|i|r=a[i];r.size.times{|j|(r[j]<1&&[i>0?a[i-1][j]:0,a[i+1]&.at(j),j>0?r[j-1]:0,r[j+1]].include?(n+1))?r[j]=n+2:0}}};a}

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

明らかな3ループアルゴリズムを使用します。Rubyが配列への負のインデックス付けを許可しているという事実は、境界チェックを行う方法がないことを意味します(私は見ることができます)。配列の境界を超えて到達するとが返されるnilため、負の境界チェックのみが必要です。のチェックa[i+1][j]には、安全なアクセス演算子を使用する必要があります。

また、の変数を使用して、数バイト削り落としましたa[0]

-12バイト以上:(3か所)の.times代わりに使用します(0...x).map

->a{
  3.times{|n|                    # For n from 0 to 2
    a.size.times{|i|             # For each row
      r=a[i];
      r.size.times{|j|           # For each column
        (r[j]<1 && [             # If the current cell is 0, and any of
            i>0 ? a[i-1][j] : 0, #     the cell to the north,
            a[i+1]&.at(j),       #     the cell to the south,
            j>0 ? r[j-1] : 0,    #     the cell to the west,
            r[j+1]               #     or the cell to the east
          ].include?(n+1)        #   are set to the previous value,
        ) ? r[j]=n+2 : 0         # Set this cell to the next value (or 0)
      }
    }
  };
  a                              # Return the modified array
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.