油炸锅模拟器


31

您的任务是模拟面糊对食物的影响。请添加三层地壳。

[[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周围加上3层,分别为2s,3s和4s,从而覆盖部分0。面糊在水平和垂直方向(而不是对角线)粘在任何形状或大小的食物上,包括甜甜圈(带有孔的食物)和碎屑(孤立的食物“像素”),并且仅限于油炸锅的边界。较早的面糊层会变成硬皮,并且不会受到后期的影响。

换句话说,首先应将1s的von-Neumann邻域中的所有0替换为2s,然后将2s的von-Neumann邻域中的所有0替换为3s,最后将的von-Neumann邻域的所有0替换为3s与4s。因此,数字2、3、4代表比曼哈顿到最近的1个单元的距离大一的数量。

炸锅的大小至少为3 x 3,并且将包含至少一件食物。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例如:000010000→交通000212000→交通003212300→交通043212340
georgewatson

4
谢谢,@georgewatson; 看起来你是对的。但是,从规范中尚不清楚,该规范提到“面糊”仅应粘附在食物上,较早的面糊不会受到后来面糊的影响。确定的唯一方法是从测试用例中解密它。
毛茸茸的

6
下一个挑战应该是男修道士模拟器。
魔术章鱼缸

5
@ngn 真的吗?(͡°͜ʖ°)
魔术章

Answers:


10

模具:1 + 14 = 15字节

命令行参数: 3

码: s<×⌈/N:1+⌈/N⋄S

在线尝试!

3 重复以下转换三次:

s 如果无论是小号精灵非空

< 小于

× 的信号

⌈/N 冯·诺伊曼N邻域的最大值

: 然后新值变成

  1+ 一加

  ⌈/N 冯·诺伊曼N邻域的最大值

 其他

  S 值保持不变(S elf)


这不是15个字节(对于参数,为14 + 1 3)吗?第一次见到Stencil,但是如果我理解正确,这是Dyalog APL受益于矩阵的扩展吗?另外,请注意:开头的大写字母N Neumann应该是粗体,而不是结尾的小写字母N。:)
凯文·克鲁伊森

1
好吧,最新的共识似乎表明,一种语言的各种配置都应算作单独的语言,但我要添加它
-Adám,

1
@KevinCruijssen Stencil 可以用作Dyalog APL工具以实现简单的细胞自动机,但它也可以作为高尔夫语言独立使用。确实,在使用工具和打高尔夫球的语言之间转换时,可能需要修改自己的代码。
亚当

1
@KevinCruijssen不,大胆的最后N是有意的。请参阅文档,Stencil使用moorevon neumann的第一个和最后一个字母作为有无自我的助记符,并使用小写和大写作为助记符来计算非空和元素的实际列表。
亚当

@KevinCruijssen我还要提到Stencil只是Dyalog APL 内置接口(称为Stencil)的接口。另请参见其文档。一个内置的完整的高尔夫语言!实际上,我已经基于单个Dyalog APL内置的其他两种高尔夫语言:QuadR和QuadS
亚当

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)

在线尝试!

Xcoder先生为-18个字节,ovs为
-20个字节


9
明天早上醒来,再次看这段代码时,我可能会觉得很愚蠢。 ”最好是,因为我用Java超越了您。; P
Kevin Cruijssen '18

1
@KevinCruijssen什么D:不可接受。一定不能被Java击败:P
HyperNeutrino,

1
让我们击败Java:c – 196 bytes
Xcoder先生18年

@ Mr.Xcoder谢谢:c:D
HyperNeutrino,

@ovs哦,太好了!
HyperNeutrino

3

Python 2中146个 143字节

e=enumerate;l=input()
for y,f in e(l):
 for g,h in e(f):x=1+min(abs(y-a)+abs(g-c)for a,b in e(l)for c,d in e(b)if d==1);l[y][g]=x*(x<5)
print l

在线尝试!


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保存了5个字节any()
  • 编辑3:通过删除不必要的内容节省了7个字节if
  • 编辑4:通过缩小声明节省了18个字节s


1

干净,157字节

import StdEnv,StdLib
t=transpose
z=zipWith
?n=n+sign n
f[0,h:l]=[?h:f[h:l]]
f[h,0:l]=[h,?h:f l]
f[h:l]=[h:f l]
f l=l
$l=z(z max)(t(map f(t l)))(map f l)

$o$o$

在线尝试!

作为函数文字。


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

在线尝试!基于我的用火杀死它的答案。编辑:由于@MartinEnder,节省了6 9个字节。说明:

1
4

将所有的1变成4。

3{

重复该程序的其余部分(最多)3次。

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

将与4s相邻的所有0更改为5s。

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

将与3s相邻的所有0更改为4s。

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

如果没有1,则将所有数字减1。


您可以使用字符!(不能出现在输入中)代替来节省一些字节(?!)
Martin Ender '18

@MartinEnder谢谢,这也适用于用火杀死它(我在那里的时候我发现了一个单独的2字节高尔夫!)
Neil

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}

在线尝试!

使用明显的三环算法。Ruby允许对数组进行负索引的事实意味着(我可以看到)无法进行边界检查。到达数组边界之外会返回nil,因此仅需要负边界检查。检查a[i+1][j]只需要使用安全访问操作符。

我还通过使用变量来减少了一些字节a[0]

-12个以上字节:使用 .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
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.