その気を散らす背景を切り落としてください!


13

写真を撮っているときは迷惑ではありませんが、背景は画像の実際の実体を損ないますか?そうだと思います。この問題を取り除くために、私はどれだけ作物を刈る必要があるかを知る必要があります!しかし-いつものように-私はとても怠け者なので、私のためにこれをする誰かが必要です...

タスクとルール

画像を表すバイナリマトリックスが与えられた場合、元のマトリックスのすべての1を含む最小のサブマトリックスの次元(幅と高さ)を出力します。サブ行列は元の行列から、隣接するエントリのブロックです。同様に、これは元の隣接する行のサブセットと隣接する列のサブセットをオーバーラップさせることにより形成される新しいマトリックスです。

  • 入力として行列の幅と高さも使用できます。
  • 入力には、少なくとも1つの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
これは確かにリンクされた質問に非常に近いですが、実際の幅と高さを計算するためにマトリックスを生成することは絶対に必要ではないので、それはその十分に遠いサブセットと考えることができると思います。たとえば、考えられるアルゴリズムの1つは、各行と列の限界ゼロの最小数をカウントし、元の次元からそれらを減算することです。
Mr Xcoder

回答:




5

オクターブ57 56 45バイト

ここでfindは、finds面倒な作業を行います。非ゼロエントリの行インデックスと列インデックスです。次に、それぞれの最大値と最小値(プラス1)の差を別々に見つける必要があります。

-1バイトを@beakerと@AndrasDeakに、-11バイトを@LuisMendoに感謝します!

@(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バイト

-8 Vincentの助けを借りて(入力行列をNumpy配列として取得)

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

整数{0,1}のリストを返す(nの)整数の2次元Numpy配列を受け入れる名前のない関数[width,height]

オンラインでお試しください!


63バイトの非Numpyバージョン(の整数リストのリストを受け入れます{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と、ゼロと1のリストが生成され、の各行に1がv含まれているかどうかが示されます。このリストの文字列表現は、バッククォート(`...`)を使用して検索されます。これにより、先頭に[、その後に, (カンマ+スペース)で区切られたゼロと1 を含む文字列が得られます。[1::3]ゼロと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バイト
ビンセント

入力を非組み込み型として取得する場合、何らかの種類のインポートステートメントをカウントして、そうすることはできませんか?(投稿に「Python 2 with numpy」というタイトルを付けなければならないだけかもしれません-完全にはわかりません)...時間があれば、19バイト目のチャットルームで質問してもらえますか?
ジョナサンアラン

1
...また55バイトですよね?
ジョナサンアラン

1
PPCG Metaで明確な答えを見つけることができなかったので、これについてはわかりません。そして、はい、確かに55バイト:)
ビンセント

1
聞いただけ。この投稿によると、インポートを含める必要はありません。
ビンセント

1

Retina 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最後の行より上のすべてのsを削除します。すべての1s 2を削除しますが、1その場合、次の行の下にある数字をa に変更します。これはビット単位の論理和です。

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

行の数を改行の数に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)&

純粋な機能。整数のネストされたリストを入力として受け取り、2つの整数のリスト(高さに幅が続く)を出力として返します。Unicode文字はのU + F3C7です\[Transpose]



1

05AB1E11 9 バイト

ζ‚Oε0Û0Üg

@ Mr.Xcoderのおかげで-2バイト。

オンラインそれを試してみたり、すべてのテストケースを検証します

説明:

ζ            # 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Üg2バイト節約します。
Mr Xcoder

@ Mr.Xcoderああ、もちろん。私はすでにそのスワップについてあまり満足していませんでした。..>私は最初のペアをやって、その合計よりも考えていなかったと信じてすることはできません>。
ケビンCruijssen




弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.