Określanie pionowych plasterków

23

Biorąc pod uwagę obraz, wypisz [szerokość w pikselach pełnej sekcji pionowej] 1 (jeśli taki istnieje). Jeśli nie ma przekroju pionowego, wyjście0 .

Dane wejściowe mogą być dostarczane jako plik lokalny lub tablica zagnieżdżona. Jeśli wybierzesz opcję wprowadzania jako tablicę zagnieżdżoną, białe piksele powinny być reprezentowane przez prawdziwą wartość, podczas gdy niebiałe piksele powinny być reprezentowane przez wartość falsey.

1. liczba sąsiadujących, całkowicie białych kolumn


Możesz to założyć

  • żaden obraz nie będzie większy niż 1000 pikseli kwadratowych

  • na obrazie będzie nie więcej niż jedna pełna sekcja pionowa


Przykłady

Wejścia:

Wyjścia:

50
57
0
0

Oto dwa pierwsze przykłady, podświetlone (na żółto), aby pokazać ich sekcje:

Zach Gates
źródło
Czy na środku mogą znajdować się wyspy czerni, aby było wiele pionowych odcinków?
xnor
@xnor: Zawsze będzie tylko jedna pełna pionowa sekcja na obraz. Dodam to do specyfikacji.
Zach Gates
Mój kod wypisuje 50 dla pierwszego przypadku testowego, ale poprawne liczby dla ostatnich 3, z pionowym wycięciem z kolumn 233 do 282 (= 50 pikseli w poprzek). Czy możesz potwierdzić, że 48 to poprawny numer?
David
@David: Widzę prawidłowy wycinek z kolumn 232 do 282 (wyłącznie). Wierzę, że masz rację.
Zach Gates
2
Nie sądzę, żeby ktokolwiek miał problemy, ale warto wyraźnie wspomnieć, że szukasz liczby ciągłych, całkowicie białych kolumn. Wyraźnie wynika to z przykładu, ale ogólnie zaleca się, aby nie polegać na przykładach lub testach.
MichaelS

Odpowiedzi:

36

Galaretka, 2 bajty

PS

Wypróbuj tutaj!

Jeśli koduję taki obraz:

0000111111111100000
0000000111111111000
0000000001111100000
0000000011111000000
0001111111111111100
0000001111110000000
0000000111111110000
0000111111111100000

W zagnieżdżoną tablicę:

[[0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0],...]

Następnie Ppobiera iloczyn elementarny wszystkich wektorów rzędowych i Ssumuje wszystkie z nich, uzyskując długość pionowego wycinka. (Działa to tylko dlatego, że jest gwarancją tylko jeden przylegający plaster). W naszym przypadku, odpowiedź brzmi 3.

Lynn
źródło
21
ಠ_ಠ Ten poziom golfa mnie zadziwia.
Addison Crump
Do czego służy wyjście, gdy nie ma ciągłych wycinków? (ważne dane wejściowe)
Addison Crump
3
psdziała również w MATL!
David
Wtedy nie będzie kolumny wszystkich 1s, co oznacza, że ​​wynikiem Pbędzie [0,0,0...0], którego Sum jest 0, zgodnie z oczekiwaniami.
Lynn
@David Opublikuj to? Może być Xpsjednak konieczne , jeśli obraz może być pojedynczym wierszem (lub zapytać OP, czy istnieje minimalny rozmiar)
Luis Mendo
7

APL, 4 bajty

+/×⌿

Try it here.

To jest moja pierwsza odpowiedź APL!

Dzięki @ jimmy23013 i @NBZ za oszczędzanie bajtów!

Mama Fun Roll
źródło
To nie jest funkcja. (+/×/⍉)nie działa
jimmy23013
1
Ale możesz użyć (+/×⌿)i to o 1 bajt krócej.
jimmy23013
Zapisz kolejne 2 bajty, usuwając nawiasy. Wiele innych odpowiedzi APL ma tylko anonimowy ciąg funkcji, który należy nazwać lub podać w nawiasach, aby go użyć:+/×⌿ f←+/×⌿ f picture
Adám
6

Bash + wspólne narzędzia, 17

rs -Tc|grep -vc 0

Jeśli nie używasz grepdo , robisz to źle ;-).

Wykorzystuje to rsnarzędzie do transpozycji. rsjest zawarty w OSX , ale będzie wymagał instalacji w większości systemów Linux z czymś takimsudo apt-get install rs .

Kolumny wejściowe są TABrozdzielone, a wiersze są oddzielone znakiem nowej linii:

0   0   0   0   1   1   1   1   1   1   1   1   1   1   0   0   0   0   0   
0   0   0   0   0   0   0   1   1   1   1   1   1   1   1   1   0   0   0   
0   0   0   0   0   0   0   0   0   1   1   1   1   1   0   0   0   0   0   
0   0   0   0   0   0   0   0   1   1   1   1   1   0   0   0   0   0   0   
0   0   0   1   1   1   1   1   1   1   1   1   1   1   1   1   1   0   0   
0   0   0   0   0   0   1   1   1   1   1   1   0   0   0   0   0   0   0   
0   0   0   0   0   0   0   1   1   1   1   1   1   1   1   0   0   0   0   
0   0   0   0   1   1   1   1   1   1   1   1   1   1   0   0   0   0   0

Jeśli chcesz, możesz wstępnie przetworzyć przykładowe obrazy wejściowe do tego formatu za pomocą imagemagick i (GNU) sed. Na przykład:

$ for img in "AmXiR.jpg" "vb2Yt.jpg" "1V7QD.jpg" "MqcDJ.jpg" ; do
>     convert -depth 1 "$img" xpm:- | \
>     sed -nr '/pixels/{:l;n;/}/q;s/^"(.*)",?$/\1/;y/ ./01/;s/./&\t/g;p;bl}' | \
>     rs -Tc|grep -vc 0
> done
50
57
0
0
$
Cyfrowa trauma
źródło
6

Perl, 21 22 bajtów

Naprawiona wersja

Obejmuje +2 za -lp (-l można pominąć i nadal byłoby poprawnym rozwiązaniem, ale jest brzydkie bez ostatniej linii)

Podaj sekwencje 1 i 0 na 0 lub więcej liniach na STDIN. Możesz dodawać spacje, przecinki lub cokolwiek między cyframi, jeśli chcesz tak długo, jak jest to użycie. Spójne na wszystkich liniach.

$a|=~$_}{$_=$a=~y;\xce;

Działa to jak pokazano, ale zamień \xce literalną wartością bajtu, aby uzyskać deklarowany wynik

Jeśli jest wiele przekrojów pionowych, to zwraca sumę wszystkich szerokości przekroju. Jeśli chcesz szerokość w pionie użytku odcinek

$a|=~$_}{$a=~/\xce+/;$_="@+"-"@-"

Stara wersja

Pierwotnie źle zrozumiałem wyzwanie i wdrożyłem program, który podaje wartość prawda lub fałsz na podstawie tego, czy w ogóle istnieje linia pionowa. Kod i objaśnienie tutaj dotyczą tej starej wersji

$a|=~$_}{$_|=~$a=~1

Gdybym tylko mógł dodać 1 = ~ po lewej stronie dla prawie idealnej symetrii ... Przypuszczam, że najbliższa byłaby

1=>$a|=~$_}{$_|=~$a=~1

Wyjaśnienie

$a|=~$_     The bitwise operators in perl (&, |, ^, ~) also work on strings by 
            working on the sequence of byte values. The digits "0" and "1" happen
            to have the same ASCII value differing only in the last bit which is
            0 for "0" and 1 for "1". So I would really like to do an "&" here.
            Unfortunately "&" of two different length strings shortens the result
            to the shortest of the strings and my accumulator starts as an empty 
            string. The "|" of two strings however extends to the longest string.
            So instead I will apply De Morgan's law and use "|" on the
            complemented byte string 
}{          Standard perl golf trick. "-p code" transforms to (simplified)
            "while (<>) { code; print }". So if code is "code1 } { code2" this
            becomes "while (<>) { code1 } {code2; print }". So you can use code1
            for the loop operation, use code2 for the final calculation and get a
            free print by assigning to $_
$_|=~$a=~1  I would like to match the accumulator with the bit complement of "1",
            but $a=~~1 doesn't work because the 1 is not a string but a number.
            $a=~~"1" would work but is too long. Next up is complementing $a back
            and matching with 1, so $_=~$a=~1. That also doesn't work since the
            first =~ will be interpreted as a string match insteads of equals
            followed by complement. Easily solved by writing it as $_= ~a=~1. But
            if I am going to give up a byte I can at least have some fun with it.
            Using $_|= also makes the parse work and has the advantage that the
            failure case will give 0 instead of an empty string, which looks
            nicer. It also makes the code look very symmetric. I can also bring
            out the symmetry more by putting 1=> in front (which evaluates 1
            before the assignment and then immediately discards it)
Ton Hospel
źródło
4

Python 2, 30 bajtów

Istnieje zaskakująco eleganckie rozwiązanie wykorzystujące wiele moich ulubionych wbudowanych funkcji połączonych razem.

lambda c:sum(map(all,zip(*c)))

Używając obrazu testowego z @ Lynn:

>>> image = [[0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]]
>>> func = lambda c:sum(map(all,zip(*c)))
>>> func(image)
3
Logic Knight
źródło
4

Pyth, 5

s*VFQ

Wypróbuj tutaj

Wykorzystuje algorytm Lynna, ale postanowiłem go opublikować, aby pokazać, jak grać w golfa w wektorach w Pyth. Sztuką jest tu Łańcuch „cukier” pomocnicy składniowe Vi Ftak, że klapka jest stosowana jako operacja wektorowych. Operator, który jest złożony, jest oczywiście mnożeniem, a następnie wynik jest sumowany, aby uzyskać ostateczną odpowiedź.

FryAmTheEggman
źródło
4

JavaScript (ES6), 54 45 43 bajtów

a=>a[s=0].map((_,i)=>s+=a.every(b=>b[i]))|s
a=>a[s=0].map((_,i)=>s+=!a.some(b=>b[i]))|s

Na podstawie odpowiedzi Jelly @ Lynn, ale ponieważ grał w golfa za pomocą everylub somezamiastreduce . Pierwsza wersja koduje kolor czarny = 0, a druga koduje kolor czarny = 1.

Edycja: Zapisano 2 kolejne bajty dzięki @ edc65.

Neil
źródło
3
Spróbuj użyćmap
CalculatorFeline
Według mnie to 45. I nie próbowałeś wystarczająco mocno, ponieważ może to być 43.
edc65
a => a [s = 0] .mapa ((_, i) => s + =! a.some (b => b [i])) | s
edc65
1
@ edc65 Cóż, wiesz, dwa trudne problemy z obliczeniami to unieważnienie pamięci podręcznej, nazewnictwo i błędy off-by-one ...
Neil
4

J , 5 6 bajtów

Jako argument przyjmuje macierz boolowską.

[:+/*/

To jest moja pierwsza odpowiedź J! (mylił się przez 1,5 roku…)

*/ produkt kolumnowy

+/ suma

[: cap (służy jako symbol zastępczy, ponieważ +/nie powinien przyjmować lewego argumentu)

Wypróbuj online!

Adám
źródło
3

CJam, 7 bajtów

q~:.*:+

Wypróbuj online!

q~      e# read input and evaluate: push nested array
:.*     e# fold vectorized product over nested array: element-wise product of rows
:+      e# fold addition over array: compute its sum
Luis Mendo
źródło
2

Mathematica 24

Length@Cases[Total@#,0]&

Przyjmuje tablicę w następującej formie:

{{1, 0, 0, 0, 1, 0},
{1, 0, 0, 1, 1, 1},
{1, 1, 0, 0, 0, 0},
{1, 1, 0, 0, 1, 1},
{1, 0, 0, 1, 1, 1}}

I w tym przypadku wyniki:

1
Zestawienie
źródło
Lub liczba takich Length[Total@#~Cases~0]&samych bajtów
CalculatorFeline
1 i 0 nie są w Mathematica prawdą ani fałszem (a gdyby tak było, zadanie prawdopodobnie byłoby odwrotnie).
Martin Ender
1

𝔼𝕊𝕄𝕚𝕟, 7 znaków / 9 bajtów

⨭МƟïⓜ⨴$

Try it here (Firefox only).

To świetny algorytm @ Lynn, ale znalazłem go niezależnie. (Myślałem, że gdzieś tam jest wbudowane, wciąż wyglądające: P)

Wyjaśnienie

МƟï transponuje tablicę wejściową, ⓜ⨴$ zamienia każdy wektor wewnętrzny w jego iloczyn i sumuje wynikową tablicę.

Mama Fun Roll
źródło
1

Japt , 6 4 bajtów

Pobiera dane wejściowe jako tablicę wierszy, 1będąc białymi i0 czarnym.

y xe
  • 2 bajty zapisane dzięki ETH .

Sprawdź to


Wyjaśnienie

y xe
          :Implicit input of array U.
y         :Transpose.
   e      :Map over each sub-array, checking if every element is truthy.
  x       :Reduce by summing, converting booleans to 1 or 0.
          :Implicit output of resulting integer.
Kudłaty
źródło
Myślę, że dasz radę zrobić y x_×5. Właściwie to edziała równie dobrze ×, więc y xedla 4 :-)
ETHproductions
Brakowało mi tego komentarza w weekend, @ETHproductions - dzięki :)
Kudłaty