修剪那些分散注意力的背景!


13

拍照时会很烦人,但背景会损害图像的实际内容吗?我会说是的。我需要知道应该种植多少,这样我才能摆脱这个问题!但是-像往常一样-我很懒,所以我需要有人替我做...

任务与规则

给定一个表示图像的二进制矩阵,输出包含原始矩阵中所有1 s 的最小子矩阵的尺寸(宽度和高度)。甲子矩阵是从原始的矩阵相邻条目的块。等效地,它是通过重叠原始行的相邻行的子集和相邻列的子集而形成的新矩阵。

  • 也可以将矩阵的宽度和高度作为输入。
  • 该输入保证至少包含一个1
  • 您可以通过任何标准方法进行输入并提供输出,同时请注意,默认情况下,这些漏洞是禁止的。这是,因此请尝试以您选择的语言可以管理的最少字节来完成任务。

[000000010100011011001010000000][101001101101010](5,3)

测试用例

输入| 输出量

[[0,1,0,0,0,1,0]]
->(5,1)或(1,5)

[[0,0,0,0,0],[0,1,0,1,0],[0,0,1,0,0]]
->(3,2)或(2,3)

[[1,1,1,1],[0,0,0,0],[0,0,0,0],[1,0,0,0]]
->(4,4)

[[0,0,0,0,0,0],[0,1,0,1,0,1],[0,0,0,0,0,0]]
->(5,1)或(1,5)

[[0,0,0,0,0],[0,1,0,1,0],[0,0,1,0,0],[0,1,0,1,0],[ 0,0,0,0,0]]
->(3,3)

[[0,0,0,0,0,0],[0,1,0,1,0,0],[0,1,1,0,1,1],[0,0,1, 0,1,0],[0,0,0,0,0,0]]
->(5,3)或(3,5)

1
感觉很熟悉; 在沙盒中有一段时间了吗?
毛茸茸的

8
这确实非常接近链接的问题,但我认为可以将其视为足够远的子集,因为生成矩阵对于计算实际的宽度和高度并不是绝对必要的。例如,一种可能的算法是计算每一行和每一列的边际零的最小数量,然后从原始尺寸中减去这些零。
Xcoder先生18年

Answers:



5

APL(Dyalog Unicode),10 字节SBCS

匿名默认前缀功能。

(1+⌈/-⌊/)⍸

在线尝试!

 索引为1s。

(…… ) 对此应用以下默认功能:

⌊/ 最小值(最低y坐标和最低x坐标)

⌈/- 最大负值(这给了我们范围)

1+ 一加(包含在内)


5

八度57 56 45字节

find是繁重的工作:finds非零条目的行和列索引。然后,我们只需要分别找出每个最大值和最小值之间的差(加一)。

感谢@beaker和@AndrasDeak提供-1个字节,以及@LuisMendo提供-11个字节!

@(a){[I{1:2}]=find(a),cellfun(@range,I)}{2}+1

在线尝试!



3

果冻,7个字节

S,§t€0Ẉ

在线尝试!

怎么运行的

S,§t€0Ẉ  Main link. Argument: M (matrix)

S        Take the columnwise sum. Let's call the resulting array A.
  §      Take the sum of each row. Let's call the resulting array B.
 ,       Pair; yield [A, B].
   t€0   Trim surrounding zeroes of A and B.
      Ẉ  Widths; yields the lengths of the trimmed arrays.

3

Python 2中 63  55个字节

在Vincent的帮助下为-8(将输入矩阵作为Numpy数组)

lambda a:[len(`a.max(x)`[7::3].strip('0'))for x in 0,1]

接受二维整数块(in {0,1})的未命名函数,该数组返回整数列表[width,height]

在线尝试!


63字节的非数字版本(在中接受整数列表{0,1}):

lambda a:[len(`map(max,v)`[1::3].strip('0'))for v in zip(*a),a]

在线尝试!

怎么样?

给定一个矩阵,afor每一个(v转置的),zip(*a)以及a本身我们找到所需的高度(给出的转置,这是宽度)。

max跨映射会v产生一个零和一的列表,表示其中的每一行是否v包含任何一个。此列表的字符串表示形式是使用反引号(`...`)找到的,它给出了一个字符串,该字符串带有前导[,零和以, (逗号+空格)分隔。我们使用三个[1::3]仅包含零和一的字符串从索引1开始以三个为单位对该字符串进行切片,这使我们能够使用字符串函数strip删除外部零(strip('0'))。

例如:

      a = [[0,0,0,0,0]           map(max,a)                    = [0,1,1]
          ,[0,1,0,0,0]          `map(max,a)`[1::3]             = '011'
          ,[0,0,0,1,0]]         `map(max,a)`[1::3].strip('0')  = '11'
                            len(`map(max,a)`[1::3].strip('0')) = 2

zip(*a) = [(0,0,0)         map(max,zip(*a))                    = [0,1,0,1,0]
          ,(0,1,0)        `map(max,zip(*a))`[1::3]             = '01010'
          ,(0,0,0)        `map(max,zip(*a))`[1::3].strip('0')  = '101'
          ,(0,0,1)    len(`map(max,zip(*a))`[1::3].strip('0')) = 3
          ,(0,0,0)]

    --> [len(`map(max,v)`[1::3].strip('0'))for v in zip(*a),a] = [3,2]

使用numpy数组的57个字节
文森特

如果我们将输入作为非内置类型,难道我们不应该在计数某种导入语句以允许我们这样做吗?(可能只是我们必须将帖子的标题命名为“带numpy的Python 2”-我不太确定)...如果您有时间,可以在第19个字节的聊天室中提问吗?
乔纳森·艾伦,

1
...还有55个字节对吗?
乔纳森·艾伦,

1
我在PPCG Meta上找不到真正的明确答案,所以我不确定。是的,确实有55个字节:)
Vincent

1
我只是问。根据这篇文章,不必包含导入。
文森特

1

视网膜0.8.2,83字节

+`^0+¶|¶0+$

+1`((.)*).(¶(?<-2>.)*).(?<=(1)¶.*|(.))
$1$3$4$5
(¶?)*0*(.*1)0*
$#1 $.2

在线尝试!说明:

+`^0+¶|¶0+$

删除开头和结尾的零行。

+1`((.)*).(¶(?<-2>.)*).(?<=(1)¶.*|(.))
$1$3$4$5

删除0最后一行上方所有行中的。删除所有1的两个,但是1在这种情况下,将下一行下面的数字更改为a 。这按位或行在一起。

(¶?)*0*(.*1)0*
$#1 $.2

将行数计为换行符加1,将列数计为前1个和后1个之间的位数。


1

J,31个字节

[:$([:|.@|:}.^:(0=1#.{.))^:4^:_

在线尝试!

说明:

                            ^:_ - repeat until the result stops changing
   (                    )^:4    - repeat 4 times
             ^:(        )       - is
                  1#.           - the sum of
                      {.        - the first row
                 =              - equal 
                0               - to 0
           }.                   - if yes, drop the first row
    [:|.@|:                     - transpose and reverse (rotate 90 degrees) 
[:$                             - what's the shape of the result?


1

Mathematica,34个字节

Max@#-Min@#+1&/@(#~Position~1)&

纯功能。将嵌套的整数列表作为输入,并返回两个整数的列表(高度,然后是宽度)作为输出。的Unicode字符为U + F3C7 \[Transpose]



1

05AB1E11 9 字节

ζ‚Oε0Û0Üg

-2个字节,感谢@ Mr.Xcoder

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

说明:

ζ            # Swap the rows and columns of the (implicit) input-list
            # Pair it with the (implicit) input-list
  O          # Take the sum of each column and row
   ε         # Map Both the list of column-sums and list of row-sums to:
    0Û       #  Remove all leading zeros
      0Ü     #  Remove all trailing zeros
        g    #  Take the length of the remaining lists

1
ζ‚Oε0Û0Üg节省2个字节。
Xcoder先生18年

@ Mr.Xcoder当然可以。我对这次调换还不太满意。不敢相信我没有想到要
先做



0

Japt,16 15字节

[UUy]®=ðd)ÎaZÌÄ

尝试运行所有测试用例


说明

[   ]               :Create an array containing
 U                  : The input and
  Uy                : The input transposed
     ®              :Map each Z
       ð            : Indices of elements where
        d           :  Any element is truthy (not 0)
      =  )          : Reassign to Z
          Î         : First element
           a        : Absolute difference with
            ZÌ      :  Last element
              Ä     :   Plus 1

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.