我会及时解决吗?


37

灵感来自

背景

邪恶的农场主已决定烧毁你的麦田,以哄抬价格。为了确保完全销毁,他还把您的田地浸泡在汽油中。更不幸的是,当它着火时,您正巧在田野上行走,您必须迅速走出去才能生存。

挑战

给定一个包含小麦,火和您所在位置的田地,确定是否可以及时将其赶出田野。

一块田地由小麦(这里用表示.)和火(F)组成。在此,您的位置标有O。例如:

...F...F
F.......
........
.F......
....O...
...F....
........
.F....F.

您每秒移动到任何相邻的单元(但不是对角线),并且每场火势都会蔓延到每个相邻的单元。如果您无法移至不会着火的牢房,您就会丧命。如果您不在野外就可以生存。让我们看看在此示例中发生了什么:

...F...F
F.......
........
.F......
....O...
...F....
........
.F....F.

..FFF.FF
FF.F...F
FF......
FFF.....
.F.F.O..
..FFF...
.F.F..F.
FFF..FFF

FFFFFFFF
FFFFF.FF
FFFF...F
FFFF....
FF.FF.O.
.FFFFFF.
FFFFFFFF
FFFFFFFF

FFFFFFFF
FFFFFFFF
FFFFF.FF
FFFFF.FF
FFFFFFFO
FFFFFFFF
FFFFFFFF
FFFFFFFF

FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFFO <-- you made it out and survived, barely
FFFFFFFF
FFFFFFFF
FFFFFFFF

规则

  • 您的输入是作为网格的字段。您可以选择任何输入格式,包括带行分隔符的字符串或2D数组。
    • 不得将火灾和/或您自己的位置作为输入。
    • 您可以使用任意3个不同的值,例如Wheat,Fire和您的位置,包括用于数组输入的非字符串。
    • 字段的大小始终至少为1x1,为矩形,并且不包含无效字符。
    • 任何字段都将恰好包含代表您的位置的值之一,而其他所有位置可能会也可能不会触发。
  • 一样,您的输出是“存活”或“死亡”两个不同值之一。
  • 适用标准规则。

测试用例

幸存下来

O
....
.O..
....
FFFFF
.....
..O..
.....
FFFF
FFFO
FFFF
.F....
......
......
.F....
..O...
.FF...
.F....
..FF..
...F...F
F.......
........
.F......
....O...
...F....
........
.F....F.

没有生存

FFF
FOF
FFF
F.F
.O.
F.F
....F
.....
..O..
.....
F....
.F....F.
........
........
F..O....
........
.....F..
...F...F
F......F
........
.F......
....O...
...F....
........
.F....F.
F..F
.O..
FF..

2
我不明白为什么有人反对
奥利弗·尼

3
向两个拒绝投票的人解释为什么我的挑战很糟糕。
PurkkaKoodari

6
@DeadPossum因为我觉得它将简化太多的挑战并使它变得过于广泛。不过,请随时提出不同意见。如果其他人同意您,我可能会更改限制。
PurkkaKoodari

2
我同意Pietu1998,我也觉得这个限制是非常适当的。
Xcoder先生17年

2
@LuisMendo如果农民转弯时有可能逃脱,他/她总是有可能沿直线逃脱。例如,假设农民试图逃离田地的右边。当农民向下移动一个空间时,一些火势将向下蔓延。然后,农民的状况与初始位置相同(加上更多的火力)。
JungHwan Min

Answers:


28

蜗牛,15字节

\Oo!{.,fee7.,\F

在线尝试!

1意味着生存,而0意味着死亡。

由于不可能扑灭大火,因此设法扑灭它永远没有用。最好的路线永远是一条直线。因此,逃生路线只有四种可能的选择。为了确定一个方向是否安全,我们检查F“火锥”中是否有任何指向该方向的东西。


1
O_o您可以提供测试链接吗?这似乎很短。
Xcoder先生17年

10
代码几乎在说:“ Oy!” ...“ phew” ...
Magic Octopus Urn

26
因为蜗牛是
战胜

6
@feersum在“尝试在线”链接中,我尝试了以下3行麦田,应该是死亡的,但是程序认为您可以生存下去:“ F..F”,“。O ..”,“ FF ..
Xantix


12

Python 2中283个 218 209 208字节

lambda F:f(F)&f(F[::-1])
def f(F):l=F.split();w=len(l[0])+1;i=F.index('O');x,y=i/w,i%w;r=range(len(l));return all('F'in''.join(n)for n in[[l[i][x+abs(i-y):]for i in r],[l[i][max(0,y+x-i):i+x-y+1]for i in r]])

在线尝试!

取输入作为换行符分隔串,并返回True/False用于Dead/Alive

通过F向外看来检查每个方向(udlr)的工作原理:

例:

输入:

FFFFF
.....
..O..
.....

消防检查:

Up:       Down:     Left:     Right:

FFFFF               F             F
 ...                ..           ..
  O         O       ..O         O..
           ...      ..           ..

如果四面八方都被火烧死,否则将逃脱。

编辑:返回以字符串作为输入,现在仅检查向上/向右,还向后检查输入(向下/向左)

Xcoder先生Felipe Nardi Batista节省了很多字节


@FelipeNardiBatista谢谢:)
TF


2

JavaScript,174个字节

a=>+(t=>g=a=>t--?g(a.map((l,y)=>l.map((c,x)=>(h=v=>[(a[y-1]||[])[x],(a[y+1]||[])[x],a[y][x+1],a[y][x-1],c].includes(v),!c&&h()?p=1:[2,0,1].find(h))))):p)((p=a+'!').length)(a)

输入格式:

  • 整数数组
  • 2代表F,1代表.,0代表O

输出:

  • 生存的真实价值(1)
  • 模具的假值(NaN)

试试吧:

考虑一个细胞自动机。一个单元有3个状态O(人可到达),F(触发火),.(什么都没发生)。创建下一代的规则是:

for each cell:
  me and my 4 neighborhoods,
    if anyone is `F` then result is `F`,
    otherwise, if anyone is `O` then result is `O`
    otherwise, keep state `.`

一旦边缘的某个单元处于O状态,人们就可以生存。如果这没有以足够的数量发生,那么人民就会丧生。

// check for all neighbors:
h=v=>[(a[y-1]||[])[x],(a[y+1]||[])[x],a[y][x+1],a[y][x-1],c].includes(v)
// if me == 'O' and i'm edge (neighbors contain _undefined_), then survive
!c&&h()?p=1
// Otherwise apply the given rule
:[2,0,1].find(h)

2

八度,71字节

@(a)(A=blkdiag(0,a,0))<3||any((bwdist(A>2,'ci')>bwdist(A==2,'ci'))(!A))

在线尝试!

要么

验证所有测试用例!

输入格式:

  • 2D整数数组
  • 1.2O,并3F

输出:

  • truefalse

说明:

说明:

A=blkdiag(0,a,0)    % add a boundary of 0s around the array
A<3                 % return truthy when there is no fire
bwdist(A>2,'ci')    % city block distance transform of binary map of fire
bwdist(A==2,'ci')   % city block distance transform of binary map of your location
any(...)(!A)        % check if there is at least one element on the boundary of 
                    % the fire distance map has its distance greater than 
                    % that of distance map of your location

1

视网膜,243字节

^.*O(.|¶)*|(.|¶)*O.*$|(.|¶)*(¶O|O¶)(.|¶)*
O
m`^((.)*) (.*¶(?<-2>.)*(?(2)(?!))O)
$1#$3
m`^((.)*O.*¶(?<-2>.)*(?(2)(?!))) 
$1#
T`p`\O`#| ?O ?
+m`^((.)*)[O ](.*¶(?<-2>.)*(?(2)(?!))F)
$1#$3
+m`^((.)*F.*¶(?<-2>.)*(?(2)(?!)))[O ]
$1#
}T`p`F`#|.?F.?
O

在线尝试!要求背景为空格而不是.s(或可以使用其他一些正则表达式安全字符)。说明:

^.*O(.|¶)*|(.|¶)*O.*$|(.|¶)*(¶O|O¶)(.|¶)*
O

如果有O任何边缘,请删除其他所有内容(生存情况)

m`^((.)*) (.*¶(?<-2>.)*(?(2)(?!))O)
$1#$3

将放置#在现有上方的任何空间中O

m`^((.)*O.*¶(?<-2>.)*(?(2)(?!))) 
$1#

并且#在现有空间下方的任何空间中O

T`p`\O`#| ?O ?

#s 更改为Os,并将现有空间的左侧或右侧的任何空格也更改为O

+m`^((.)*)[O ](.*¶(?<-2>.)*(?(2)(?!))F)
$1#$3

#s置于任何现有Fs 之上。这些可以覆盖Os和空格。

+m`^((.)*F.*¶(?<-2>.)*(?(2)(?!)))[O ]
$1#

#s 放置在任何现有s之下F,并覆盖Os和空格。

}T`p`F`#|.?F.?

#s 更改为Fs,并将O现有的左侧或右侧的任意或空格也更改为F。重复直到Fs消耗了所有东西。

O

返回1生存,0如果没有。

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.