Виріжте цей відволікаючий фон!


13

Хіба це не дратує, коли ви фотографуєте, але фон відбиває від фактичної сутності зображення? Я б сказав, що так і є. Мені потрібно знати, скільки треба обрізати, щоб я позбувся цієї проблеми! Але - як завжди - я дуже ледачий, тому мені потрібен хтось для мене це ...

Завдання та правила

Давши двійкову матрицю, що представляє зображення, виведіть розміри (ширину та висоту) найменшої підматриці, яка містить усі с у вихідній матриці. Суб-матриця являє собою блок суміжних записів з вихідної матриці. Еквівалентно це нова матриця, утворена перекриттям підмножини сусідніх рядків та підмножиною сусідніх стовпців оригіналу.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
Це дійсно дуже близько до пов'язаного питання, але я думаю, що його можна вважати досить віддаленим підмножиною, оскільки генерування матриці не є абсолютно необхідним для обчислення фактичної ширини та висоти. Наприклад, одним із можливих алгоритмів було б підрахувати мінімальну кількість граничних нулів для кожного рядка та стовпця та відняти їх від початкових розмірів.
— Містер Xcoder

Відповіді:



5

APL (Dyalog Unicode) , 10 байт SBCS

Функція анонімного мовчазного префікса.

(1+⌈/-⌊/)⍸

Спробуйте в Інтернеті!

⍸ індекси 1с.

(… ) Застосувати до цього таку негласну функцію:

 ⌊/ мінімальний (найнижча координата 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 байт

-8 за допомогою Vincent (візьміть матрицю введення як Numpy масив)

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

Безіменна функція , приймаюча 2-d Numpy масив цілих чисел (в {0,1}) , який повертає список цілих чисел, [width,height].

Спробуйте в Інтернеті!


Версія без чисел у 63 байти (приймаючи список списків цілих чисел у {0,1}):

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

Спробуйте в Інтернеті!

Як?

З огляду на матрицю, a, forкожен ( v) з транспонованих, zip(*a)і aсам знаходять висоту , необхідну ( з урахуванням транспонування Це шириною).

Зіставлення maxвпоперек vдає список нулів та одиниць, що представляють, чи vмістить кожен рядок . Представлення рядків цього списку знаходимо за допомогою зворотних посилань ( `...`), це дає рядок з провідним [, потім нулями та одиницями, обмеженими , (кома + пробіл). Ми розрізаємо цей рядок, починаючи з індексу один із кроків три, [1::3]отримуючи нам рядок лише нулів та одиниць, що дозволяє нам використовувати функцію string 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]

57 байт з використанням масиву numpy.
— Вінсент

Якщо ми сприймаємо дані як невбудований тип, чи не слід вважати якусь заяву про імпорт, щоб ми могли це зробити? (Можливо, ми маємо назвати цей пост як "Python 2 з numpy" - я не зовсім впевнений) ... якщо у вас є якийсь час, ви могли б запитати в дев'ятнадцятому байтовому чаті?
— Джонатан Аллан

1
... також 55 байт правильно?
— Джонатан Аллан

1
Я не міг знайти чіткої відповіді на PPCG Meta , тому я не впевнений у цьому. І так, 55 байтів дійсно :)
— Вінсент

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

Видаліть усі 0s на рядках над останніми. Видаліть усі 1s два, але змініть цифру під наступним рядком на a 1в цьому випадку. Це побіжно або рядки разом.

(¶?)*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

Математика, 34 байти

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

Чиста функція. Бере вкладений список цілих чисел як вхідний і повертає список двох цілих чисел (висота з наступною шириною) як вихід. Символ Unicode - U + F3C7 для \[Transpose].



1

05AB1E , 11 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

@ Mr.Xcoder Ах, звичайно. Я вже не надто тішився цим свопом. Не можу повірити, що я не замислювався над тим, щоб зробити першу пару і ніж сума ..>.>
— Кевін Круїйсен




Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.