Dikkat dağıtan arka planı kesin!


13

Fotoğraf çekerken sinir bozucu değil mi, ancak arka plan görüntünün gerçek maddesinden uzaklaşıyor mu? Öyle olduğunu söyleyebilirim. Bu problemden kurtulmak için ne kadar kırpmam gerektiğini bilmem gerekiyor! Ama - her zamanki gibi - oldukça tembelim, bu yüzden bunu benim için yapacak birine ihtiyacım var ...

Görev ve Kurallar

Görüntüyü temsil eden bir ikili matris verildiğinde , orijinal matristeki 1 saniyenin tümünü içeren en küçük alt matrisin boyutlarını (genişlik ve yükseklik) çıktılayın. Bir alt-matris orijinal matris bitişik girişlerinin bir bloktur. Eşdeğer olarak, bitişik satırların bir alt kümesinin ve orijinalin bitişik sütunlarının bir alt kümesinin üst üste binmesiyle oluşan yeni bir matristir.

  • Matrisin genişliğini ve yüksekliğini girdi olarak da almasına izin verilir.
  • Giriş, en az birini içeren garantilidir .1
  • Bu boşlukların varsayılan olarak yasaklandığını dikkate alırken, herhangi bir standart yöntemle girdi alabilir ve çıktı sağlayabilirsiniz . Bu , bu yüzden görevi kendi dilinizde yönetebileceğiniz en az bayt ile tamamlamaya çalışın .

Misal

[000000010100011011001010000000][101001101101010](5,3)

Test senaryoları

Girdi | Çıktı

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

[[0,0,0,0,0], [0,1,0,1,0], [0,0,1,0,0]]
-> (3,2) veya (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) veya (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) veya (3,5)

1
Bu hissediyor çok tanıdık; bir süre Sandbox'ta mıydı?
Shaggy

8
Bu gerçekten bağlantılı soruya çok yakın, ancak bence yeterince uzak bir alt küme olarak düşünülebilir, çünkü matrisin üretilmesi gerçek genişlik ve yüksekliği hesaplamak için kesinlikle gerekli değildir. Örneğin, olası bir algoritma, her satır ve sütun için minimum sayıda marjinal sıfır saymak ve bunları orijinal boyutlarından çıkarmak olacaktır.
Bay Xcoder

Yanıtlar:



5

APL (Dyalog Unicode) , 10 bayt SBCS

Anonim zımni önek fonksiyonu.

(1+⌈/-⌊/)⍸

Çevrimiçi deneyin!

 1s endeksleri.

(… Buna ) aşağıdaki örtük işlevini uygulayın:

⌊/ minimum (en düşük y koordinatı ve en düşük x koordinatı)

⌈/- maksimum eksi (bu bize menzili verir)

1+ bir artı bu (kapsayıcı olmak için)


5

Oktav , 57 56 45 bayt

İşte findağır kaldırma: findsSıfır olmayan girişlerin satır ve sütun indeksleri. O zaman sadece her biri için maksimum ve minimum (artı bir) arasındaki farkı bulmak zorundayız.

-1 byte için @beaker ve @AndrasDeak ve -11 bayt için @LuisMendo!

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

Çevrimiçi deneyin!



3

Jöle , 7 bayt

S,§t€0Ẉ

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

Vincent yardımıyla -8 (giriş matrisini Numpy dizisi olarak alır)

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

Bir tamsayı {0,1}listesi döndüren 2-d Numpy tamsayı dizisini (in ) kabul eden isimsiz bir işlev [width,height],.

Çevrimiçi deneyin!


63 bayt cinsinden Numpy olmayan sürüm (içindeki tamsayıların listesini kabul ederek {0,1}):

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

Çevrimiçi deneyin!

Nasıl?

Bir matris, verilen a, forher bir ( vdevriğin), zip(*a)ve akendisi, (bu devrik genişliği verilen) gerekli yüksekliği bulabilirsiniz.

Haritalama maxboyunca v, verim sıfırlar ve olanların bir listesini her satır halinde temsil eden vherhangi olanlar içerir. Bu listenin dize temsili backticks ( `...`) kullanılarak bulunur, bu önce bir satır başı [, ardından sıfırlar ve , (virgül + boşluk) ile ayrılmış olan bir dize verir . Dıştaki sıfırları ( ) kaldırmak için [1::3]dize işlevini kullanmamızı sağlayan, yalnızca sıfır ve birlerden oluşan bir dize alarak, dizeyi üç adımdan birinden başlayarak bu dizeyi stripdilimliyoruz strip('0').

Örneğin:

      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 dizi kullanarak 57 bayt .
Vincent

Yerleşik olmayan bir tür olarak girdi alırsak, bunu yapmamıza izin vermek için bir tür içe aktarma ifadesi saymıyor muyuz? (Sadece yazıyı "numpy ile Python 2" olarak adlandırmak zorunda olabiliriz - Tamamen emin değilim) ... eğer biraz zamanınız varsa on dokuzuncu bayt sohbet odasında sorabilirsiniz?
Jonathan Allan

1
... ayrıca 55 bayt değil mi?
Jonathan Allan

1
PPCG Meta'da gerçekten net bir cevap bulamadım , bu yüzden bundan emin değilim. Ve evet, 55 bayt gerçekten :)
Vincent

1
Sadece sordum. Bu gönderiye göre , ithalatın dahil edilmesi gerekmiyor.
Vincent

1

Retina 0.8.2 , 83 bayt

+`^0+¶|¶0+$

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

Çevrimiçi deneyin! Açıklama:

+`^0+¶|¶0+$

Baştaki ve sondaki sıfır satırlarını silin.

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

0Son satırın üstündeki satırlardaki tüm işaretleri kaldırın . İkisini de kaldırın 1, ancak bir sonraki satırın altındaki rakamı 1bu durumda a olarak değiştirin. Bu bitsel veya satırlar birlikte.

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

Satır sayısını yeni satır sayısı artı 1 ve sütun sayısını ilk ve son 1 arasındaki basamak sayısı olarak sayın.


1

J , 31 bayt

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

Çevrimiçi deneyin!

Açıklama:

                            ^:_ - 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 bayt

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

Saf fonksiyon. Yuvalanmış tamsayılar listesini girdi olarak alır ve çıktı olarak iki tamsayı (yükseklik ve ardından genişliği) bir liste döndürür. Unicode karakteri U + F3C7'dir \[Transpose].



1

05AB1E , 11 9 bayt

ζ‚Oε0Û0Üg

@ Mr.Xcoder sayesinde -2 bayt .

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

ζ            # 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 bayt kaydeder.
Bay Xcoder

@ Mr.Xcoder Ah, elbette. Bu takas konusunda çok mutlu değildim. Önce çifti ve toplamı yapmayı düşünmediğime inanamıyorum ..>.>
Kevin Cruijssen



0

Japt, 16 15 bayt

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

Deneyin veya tüm test senaryolarını çalıştırın


açıklama

[   ]               :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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.