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


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.