Przytnij rozpraszające tło!

13

Czy to nie denerwujące, gdy robisz zdjęcie, ale tło szkodzi rzeczywistej treści obrazu? Powiedziałbym, że tak. Muszę wiedzieć, ile powinienem przyciąć, aby pozbyć się tego problemu! Ale - jak zwykle - jestem dość leniwy, więc potrzebuję kogoś, kto by to dla mnie zrobił ...

Zadanie i zasady

Biorąc pod uwagę macierz binarną reprezentującą obraz, wyprowadzaj wymiary (szerokość i wysokość) najmniejszej podmacierzy, która zawiera wszystkie 1 s oryginalnej matrycy. Pod-macierzą jest blok sąsiadujących pozycji z oryginalnej macierzy. Odpowiednio jest to nowa matryca utworzona przez nakładanie się podzbioru sąsiednich rzędów i podzbioru sąsiednich kolumn oryginału.

  • Dozwolone jest również przyjmowanie szerokości i wysokości matrycy jako danych wejściowych.
  • Gwarantowane wejście zawiera co najmniej jeden 1 .
  • Możesz przyjmować dane wejściowe i dostarczać dane wyjściowe dowolną standardową metodą , zwracając uwagę, że te luki są domyślnie zabronione. To jest , więc spróbuj wykonać zadanie w jak najmniejszej liczbie bajtów, którymi możesz zarządzać w wybranym języku .

Przykład

[000000010100011011001010000000][101001101101010](5,3)

Przypadki testowe

Wejście | Wynik

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

[[0,0,0,0,0], [0,1,0,1,0], [0,0,1,0,0]]
-> (3,2) lub (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,0]]
-> (5,1) lub (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) lub (3,5)
Pan Xcoder
źródło
1
To wydaje się bardzo znajome; był przez jakiś czas w piaskownicy?
Kudłaty
8
Jest to rzeczywiście bardzo zbliżone do powiązanego pytania, ale myślę, że można je uznać za wystarczająco odległy ich podzbiór, ponieważ generowanie macierzy nie jest absolutnie konieczne do obliczenia rzeczywistej szerokości i wysokości. Na przykład jednym z możliwych algorytmów byłoby zliczanie minimalnej liczby zerowych zer dla każdego wiersza i kolumny i odejmowanie ich od pierwotnych wymiarów.
Pan Xcoder,

Odpowiedzi:

5

APL (Dyalog Unicode) , 10 bajtów SBCS

Anonimowa ukryta funkcja prefiksu.

(1+⌈/-⌊/)⍸

Wypróbuj online!

 wskaźniki 1s.

() Zastosuj do tego następującą milczącą funkcję:

⌊/ minimum (najniższa współrzędna y i najniższa współrzędna x )

⌈/- maksimum minus to (daje nam to zasięg)

1+ jeden plus, że (do włączenia)

Adám
źródło
5

Oktawa , 57 56 45 bajtów

Tutaj findwykonuje się ciężkie podnoszenie: to findsindeksy rzędów i kolumn niezerowych wpisów. Następnie musimy tylko znaleźć różnicę między maksimum a minimum (plus jeden) dla każdego z nich osobno.

Dzięki @beaker i @AndrasDeak za -1 bajtów, a @LuisMendo za -11 bajtów!

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

Wypróbuj online!

wada
źródło
3

Python 2 , 92 86 bajtów

def f(a,L=len):exec"a=zip(*a[1-any(a[0]):])[::-1];"*4*L(a[0])*L(a);return L(a[0]),L(a)

Wypróbuj online!

Chas Brown
źródło
3

Galaretka , 7 bajtów

S,§t€0Ẉ

Wypróbuj online!

Jak to działa

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.
Dennis
źródło
3

Python 2 ,  63  55 bajtów

-8 z pomocą Vincenta (weź macierz wejściową jako tablicę Numpy)

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

Anonimowa funkcja przyjmując 2-d NumPy tablicę liczb całkowitych (W {0,1}), która zwraca listę liczb całkowitych [width,height].

Wypróbuj online!


Wersja inna niż Numpy w 63 bajtach (akceptacja listy list liczb całkowitych w {0,1}):

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

Wypróbuj online!

W jaki sposób?

Biorąc pod uwagę macierz, a, foreach ( v) w transpozycji zip(*a), a asam znaleźć wymaganą wysokość (biorąc pod uwagę transpozycję to jest szerokość).

Mapowanie w maxpoprzek vdaje listę zer i jedynek, reprezentujących, czy każdy wiersz vzawiera jedynki. Ciąg znaków reprezentujący tę listę można znaleźć za pomocą backticks ( `...`), co daje ciąg z wiodącym [, a następnie zerami i zerami oddzielonymi , (przecinek + spacja). Przecinamy ten ciąg, zaczynając od indeksu jeden w krokach trzy, używając [1::3]do tego ciągu samych zer i jedynek, co pozwala nam użyć funkcji ciąg stripdo usunięcia zewnętrznych zer ( strip('0')).

Na przykład:

      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]
Jonathan Allan
źródło
57 bajtów przy użyciu tablicy numpy.
Vincent
Jeśli przyjmiemy dane wejściowe jako typ niewbudowany, czy nie powinniśmy liczyć jakiegoś rodzaju instrukcji importu, która nam na to pozwoli? (Być może po prostu musimy nadać tytuł postowi „Python 2 with numpy” - nie jestem do końca pewien) ... jeśli masz trochę czasu, możesz zapytać w dziewiętnastobajtowym pokoju czatowym?
Jonathan Allan
1
... także 55 bajtów, prawda?
Jonathan Allan
1
Naprawdę nie mogłem znaleźć jasnej odpowiedzi na PPCG Meta , więc nie jestem tego pewien. I tak, 55 bajtów rzeczywiście :)
Vincent
1
Tylko spytałam. Zgodnie z tym postem import nie musi być dołączony.
Vincent
1

Retina 0.8.2 , 83 bajty

+`^0+¶|¶0+$

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

Wypróbuj online! Wyjaśnienie:

+`^0+¶|¶0+$

Usuń początkowe i końcowe zero wierszy.

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

Usuń wszystkie 0s z linii powyżej ostatniego. Usuń wszystkie 1dwa, ale 1w takim przypadku zmień cyfrę pod następnym wierszem na a . To bitowe lub wiersze razem.

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

Policz liczbę wierszy jako liczbę znaków nowego wiersza plus 1, a liczbę kolumn jako liczbę cyfr między pierwszym a ostatnim 1.

Neil
źródło
1

J , 31 bajtów

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

Wypróbuj online!

Wyjaśnienie:

                            ^:_ - 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?
Galen Iwanow
źródło
1

q / kdb +, 16 bajtów

sum@'(|/;|/')@\:
Thomas Smyth
źródło
1

Mathematica, 34 bajty

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

Czysta funkcja. Pobiera na wejściu zagnieżdżoną listę liczb całkowitych i zwraca na wyjściu listę dwóch liczb całkowitych (wysokość, a następnie szerokość). Znak Unicode to U + F3C7 dla \[Transpose].

LegionMammal978
źródło
1

R , 48 46 bajtów

function(m)1+diff(apply(which(m>0,T),2,range))

Wypróbuj online!

-2 bajty zapisane przez Giuseppe.

Kirill L.
źródło
1

05AB1E , 11 9 bajtów

ζ‚Oε0Û0Üg

-2 bajty dzięki @ Mr.Xcoder .

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

ζ            # 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
Kevin Cruijssen
źródło
1
ζ‚Oε0Û0Ügoszczędza 2 bajty.
Pan Xcoder,
@ Mr.Xcoder Ah, oczywiście. Już nie byłem zbyt szczęśliwy z powodu tej zamiany. Nie mogę uwierzyć, że nie pomyślałem o zrobieniu pary jako pierwszej, a nie o sumie ..>.>
Kevin Cruijssen
0

Haskell , 76 bajtów

f x=length.s.reverse.s<$>[foldr(zipWith(:))e x,x]
e=[]:e
s=snd.span(all(<1))

Wypróbuj online!

Laikoni
źródło
0

Japt, 16 15 bajtów

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

Wypróbuj lub uruchom wszystkie przypadki testowe


Wyjaśnienie

[   ]               :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
Kudłaty
źródło