确定一个网格是否包含另一个网格


10

挑战
创建一个函数将两个二维字符数组(如果编程语言没有字符作为数据类型,则为字符串)作为输入:a和b。如果您的语言不支持这些输入,则可以使用任何其他标准的一字节变量。

您的任务是确定b是否包含a。如果是这样,则返回true。否则,返回false。

样本测试用例

a:

123
456
789

b:

123
456
789

应该返回true。

a:

code
golf

b:

thisis
code!!
golf!!
ohyeah

应该返回true。

a:

abcd
efgh
ijkl

b:

abcdef
ghijkl
mnopqr

应该返回false。

a:

abc
def

b:

1abc2
3def4
5ghi6

应该返回true

a:

ab
cd

b:

#ab##
##cd#

应该返回假

最少字节获胜。


2
嗨,欢迎来到codegolf!我对您的测试用例进行了编辑,以(希望)使它们更加清晰。请注意,在将挑战发布到主要挑战之前,我们有一个沙盒用于应对挑战。祝好运!
FryAmTheEggman,

2
另外,即使我的语言(C#)具有内置的字符类型,我也可以将第一个数组作为字符串数组,第二个数组作为由换行符分隔的字符串吗?
无知的体现,

@Neil测试用例2和3不是正方形。
罗宾·赖德

5
您能否添加一个真实的测试用例,a而不是在b的左边缘,以及一个虚假的测试用例,其中的每一行都a出现在的连续行中,b但它们的左边缘错开?
毛茸茸的

@EmbodimentofIgnorance是
危害

Answers:


9

Brachylog(v2),4个字节

s\s\

在线尝试!

最容易作为一个完整的程序运行,像往常一样用于,用一个指定为命令行参数,b在标准输入。这个问题要求一个函数,该程序也可以作为一个函数使用,当且仅当决策为false时,左边的b,右边的a并通过产生异常输出。

说明

s\s\
s     a substring of rows of {the left input}
 \…\  assert rectangular; swap row and column operations
  s   a substring of <s>rows</s> columns of {the above matrix}
      {implicit} assert that the result can be {the right input}

很明显,“断言矩形”毫无意义,因为问题已经保证了这一点。程序的其余部分通过标识行和列的子字符串(即子矩阵)为我们进行网格查找。

元讨论

之前我们有一个非常相似的问题。我希望一个问题的大多数答案都可以修改为另一个问题的答案。我认为这是更简洁的版本。


这里最短的答案,所以我会接受。
危险

7

Python 2,67字节

f=lambda a,b,r=4:b*r and f(a,b[1:],r)|f(a,zip(*b)[::-1],r-1)or a==b

在线尝试!

将输入作为字符元组列表。

尝试所有子网格,b并检查是否a在其中。子网格是通过在删除第一行b或将其旋转90度时递归分支而生成的。精确旋转四圈后,检查修剪b是否等于a


1
@mazzy我认为输入网格应该是矩形。
xnor

5

J21 15 8 7字节

1#.,@E.

在线尝试!

-7个字节,感谢Bolce Bussiere

原始答案

J21 15字节

<@[e.&,$@[<;.3]

在线尝试!

-6字节归功于FrownyFrog

怎么样

  • <@[ 盒装左arg
  • $@[<;.3] 右侧arg中与左侧arg形状相同的所有矩形
  • 现在将这些作为左侧和右侧arg传递给...
  • 在将两个参数展平后,是左侧arg是右侧arg的榆树 e.&,

我认为可能是<@[e.&,$@[<;.3]
FrownyFrog,

啊,公安!如果您想挑战,请看一下我与
Jonah

1
-7个字节:+/@:,@E.。E.几乎可以应对这一挑战。
Bolce Bussiere,

tyvm @BolceBussiere。我今晚会更新。
乔纳

4

木炭,26字节

⌈⭆η⭆ι⁼θE✂ηκ⁺Lθκ¹✂νμ⁺L§θ⁰μ¹

在线尝试!链接是详细版本的代码。很大程度上基于我对连续子矩阵进行计数的答案,唯一的区别是,我没有取匹配的总和,而是取最大值,并且由于使用结果导致隐式字符串转换,因此已经是一个字符串,它保存了字节。


4

05AB1E,10 个字节

øŒεøŒI.å}à

b作为第一输入,a作为第二。两个输入均作为字符矩阵。

@ Mr.Xcoder的05AB1E答复此相关挑战的端口,请确保对其进行投票!

在线尝试验证所有测试用例

说明:

øŒ          # Get the sublists of every column of the (implicit) input `b`
  ε         # Map each list of sublists to:
   øŒ       #  Get the sublists of every column again
            #  (now we have all sub-matrices of `b`)
     I    #  Check if the second input `a` is in this list of sub-matrices
          # After the map: check if any are truthy by taking the maximum
            # (which is output implicitly as result)



3

的JavaScript(ES6) 131个112 105字节

105个字节:

f=(m,n)=>m.some((x,i)=>i<=m.length-n.length&x.some((c,j)=>n.every((l,z)=>(m[i+z]+'').indexOf(l,j)==2*j)))

在线尝试!

变化:

  • m[i]xn[z]l完全忘记了这些变量已实例化
  • &&into &运算符的两边已经是布尔值,因此按位运算符将起作用

112个字节:

f=(m,n)=>m.some((x,i)=>i<=m.length-n.length&&m[i].some((c,j)=>n.every((l,z)=>(m[i+z]+'').indexOf(n[z],j)==2*j)))

在线尝试!

变化:

  • map((c,j)=>{...}).some(s=>s)some((c,j)=>{...})冗余
  • m[i+z].join()into m[i+z]+''将数组转换为字符串的较短方法
  • indexOf(n[z].join(),j)into indexOf(n[z],j) indexOf 方法已经转换 n[z] 为字符串

131个字节:

f=(m,n)=>m.some((x,i)=>i<=m.length-n.length&&m[i].map((c,j)=>n.every((l,z)=>m[i+z].join().indexOf(n[z].join(),j)==2*j)).some(s=>s))

在线尝试!

可读性:

function f (m, n) {
  return m.some((x, i) => {
    return i <= m.length - n.length
      && m[i].map((c, j) => {
        return n.every((l, z) => {
          return m[i + z].join().indexOf(n[z].join(), j) == 2 * j
        })
      })
        .some(s => s)
  })
}

我检查了网格N的行是否包含在网格M的行中,而不是对各个值进行取舍,如果是,则检查在哪个索引处。如果从同一索引开始包含所有行,则网格N将包含在网格M中。


2

PowerShell中71 102 85 98个字节

谢谢@Jo King; 测试用例已添加。

param($a,$b)!!($a|%{$p=[regex]::Escape($_)
$b|sls $p -a -ca|% m*}|group index|?{"$a"-ceq$_.Group})

在线尝试!

少打高尔夫球:

param($a,$b)

$matches = $a|%{
    $pattern = [regex]::Escape($_)
    $b|Select-String $pattern -AllMatches -CaseSensitive|% Matches
}

$relevantGroupsByMatchPosition = $matches|group index|?{
    "$a"-ceq$_.Group  # the '$_.Group' contains matches in source order
                      # -ceq is case sensitivity equation operator
                      # -ceq performs an implicit conversion to the left operand type
}

!!($relevantGroupsByMatchPosition)  # true if the variable is not $null

1

Javascript,150个字节

f=(a,b)=>{_='length';for(r=i=0;i<=b[_]-a[_];i++)for(j=0;j<=b[0][_]-a[0][_];j++){u=0;a.map((l,y)=>l.map((c,x)=>u=u||b[i+y][j+x]!=c));r=r||!u;}return r}

在线尝试

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.