认识藤蔓


31

背景

我有一堆破旧的黑白图像。其中有些描绘的是藤蔓爬在墙上,有些则没有。您的任务是为我分类。

输入输出

您的输入是矩形A的二维数组,以任何方便的格式给出。它不会为空,但不能保证同时包含0和1。如果满足以下条件,则阵列将描绘出藤蔓:

  • A的底行至少包含1。这些是葡萄树的根。
  • A中的每个1 通过1s路径连接到最下面一行,该路径仅向左,向右和向下(不向上,也不对角线)移动。这些路径是葡萄树的分支。

如果输入描述的是藤本植物,则输出为一致的真实值,否则为一致的虚假值。

例子

这个数组描绘了一个藤蔓:

0 0 1 0 0 1
0 1 1 0 0 1
0 1 0 1 1 1
1 1 0 1 0 1
0 1 1 1 0 1
0 0 1 0 1 1

此输入未描述藤本植物,因为在右边框的中间有一个1,它没有通过分支连接到根部:

0 0 0 1 1 0
0 1 0 1 1 1
0 1 0 1 0 1
0 1 1 1 1 0
0 0 1 1 0 1

全0数组永远不会描述藤蔓,但全1数组总是如此。

规则和计分

您可以编写完整的程序或函数。最低字节数获胜,并且不允许出现标准漏洞。

测试用例

真实的输入:

1

0
1
1

01
11

0000
0111
1100
1001

1111
1111
1111
1111

001001
011001
010111
110101
011101
001011

1011011
1001001
1111111
0100000
0111111
1111001
1001111
1111101

0000000
0011100
0010100
0011100
0001000
1111111
0001000
0011100
0010100
0010100

虚假输入:

0

1
0

10
01

000
000
000

011
110
000

111111
000000
101011
111001

010010
001000
000010
110001

001100
111111
110101
010011
111011

000110
010111
010101
011110
001101

11000000
10110001
10011111
11110001
01100011
00110110
01101100
01100001
01111111

1
没意识到葡萄不能向下生长,有个不错的主意,使用图表的相关组件,叹了口气……
swish

@swish这意味着必须依次删除每一行,才能使图形连接到底部的1s线。
尼尔

Answers:


26

蜗牛25 19 17字节

&
\0z),(\1dlr)+d~

在线尝试!

说明

Snails是受regex启发的2D模式匹配语言,它最初是为应对2D模式匹配语言设计挑战而开发的

&品牌蜗牛试图从每一个可能的起始位置和打印模式01取决于模式是否在任何他们或比赛的失败,在所有的人。

现在,Snails可以使用隐式括号,因此该模式是以下内容的简写:

(\0z),(\1dlr)+d~

,作用就像一个*在正则表达式(即匹配的零个或更多次),而+相同的正则表达式(匹配一个或更多次)。因此,我们首先\0z根据需要进行匹配,首先匹配单个对象0,然后允许蜗牛使用任意重置其方向z。前提是可以在其他任何地方找到有效的蔓生细胞,从而允许输入零。

然后,我们匹配至少一个\1dlr,它匹配一个1,然后允许蜗牛向下,向左或向右重置方向。请注意,如果我们开始的单元格包含a,1那么我们只匹配此部分。基本上,它允许蜗牛从树枝向下穿过葡萄藤直至到达根部。

最后,我们需要通过在(~)下寻找一个越界单元()来确保到达地面d


1
我很惊讶任何人都可以遵循该文档:)
feersum

3

JavaScript(ES6),135个字节

s=>s.replace(/^[^1]*\n/,``).split`
`.map(s=>+`0b${s}`).reverse(g=(n,m,o=(m<<1|m|m>>1)&n)=>n-m?o-m&&g(n,o):n).reduce((m,n,i)=>g(n,n&m))

注意:由于整数类型的限制,仅适用于宽度不超过31个字符的葡萄树。说明:每行与相邻的行按位与,以确定连接点,然后使用该g函数以递归方式水平扩展该行,直到不能再扩展为止。例如,如果两个相邻行是11101111011100然后连接点是1010100与该被再扩展到11101101110111然后发现此行连接。如果该g函数失败,则它返回零,这g也会导致所有后续函数也失败,并且结果是虚假的。如果g函数成功执行,则返回新行,然后通过传播reduce该行以测试下一行。

s=>s.replace(/^[^1]*\n/,``)         Remove irrelevant leading "blank" rows
    .split`\n`                      Split into lines
    .map(s=>+`0b${s}`)              Convert into binary
    .reverse(                       Process from bottom to top
     g=(n,m,o=(m<<1|m|m>>1)&n)=>     Expand row horizontally
      n-m?o-m&&g(n,o):n)             Check whether rows are connected
    .reduce((m,n,i)=>g(n,n&m))      Check all rows

我会裁定31个字符足够宽,这种方法是有效的。
Zgarb

2

Python 2,254字节

没有图书馆

def f(A,r=0,c=-1):
 B=A[r];R=len(A)-1;C=len(B);i=1 in A[R]
 if c<0:
    for j in range(R*C+C):
        if A[j/C][j%C]:i&=f(A,j/C,j%C)
    return i&1
 _=B[c];B[c]=0;i=_&(r==R)
 if _:
    if c>0:i|=f(A,r,c-1)
    if r<R:i|=f(A,r+1,c)
    if c<C-1:i|=f(A,r,c+1)
 B[c]=_;return i

请注意,第二级和第三级缩进在字节数中由制表符形成。

在线尝试


1

沃尔夫勒姆-254

花一些时间进行这项工作,所以我就把它留在这里:

f[s_]:=(
v=Characters@StringSplit@s;
{h,w}=Dimensions@v;
g=GridGraph@{w,h};
r=First/@Position[Flatten@v,"0"];
g=VertexDelete[Graph[VertexList@g,
EdgeList@g/.x_y_/;Abs[x-y]>1yx],r];
v=VertexList@g;
v≠{}∧v~Complement~VertexOutComponent[g,Select[v,#>w h-w&]]{}
)

基本上,我构造了一个有向边朝上的网格图,删除与0s对应的顶点,检查底部顶点分量是否包含所有顶点。可笑,我知道...


2
为什么这种不竞争?
Downgoat '16

1
目前我们认为这不是“答案”,因为它不是高尔夫运动。如果您只是删除不必要的空格并添加字节数,我认为没有理由不竞争。
Alex A.

0

蟒+ NumPy的204 202 195个字节

from numpy import*
def f(A):
 r,c=A.shape
 z,s=zeros((r,1)),array([0,2,c+3])
 B=hstack((z,A,z)).flat
 for i in range(1,(r-1)*(c+2)):
    if B[i]and not any(B[s]):return 1<0
    s+=1
 return any(B[i:])

期望A是2D numpy数组。

取矩阵,左和右填充零列并展平矩阵。s是指向左侧,右侧和下部元素的模具。循环检查除最后​​一行以外的每个元素是否为1,并且至少一个模板为1False否则返回。然后,检查最后一行是否包含any 1

两个适合您的测试用例:

I1 = '001001\n011001\n010111\n110101\n011101\n001011'
A1 = array([int(c) for c in I1.replace('\n','')]).reshape(6,6)
print f(A1) #True

I2 = '001100\n111111\n110101\n010011\n111011'
A2 = array([int(c) for c in I2.replace('\n','')]).reshape(5,6)
print f(A2) #False

Edit1:1<0False

Edit2:flatflatten()循环中第二种意图的替代品,也可以使用制表符

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.