Перетворіть матрицю


16

Напишіть програму або функцію, де матриця A (максимальне значення розмірів матриці 100) перетворюється на нову матрицю B. Кожен елемент нової матриці B є сумою позитивних сусідів відповідного елемента матриці A .

Розглядаються лише сусіди в чотирьох ортогональних напрямках, а краї не обмотуються.

Приклад введення:

 1  2  3
 4 -1 -2
-3 -4 10
 1  2 10

Вихід:

 6  4  2
 1  6 13
 5 12 10
 2 11 12

Правила:

  • В якості введення використовують цілі числа.
  • Це , тому найкоротший код у байтах виграє.

3
Ласкаво просимо до головоломки програмування та коду для гольфу! Усі виклики тут потребують об'єктивного критерію виграшу, щоб безперечно визначити, яке рішення має бути переможене. Як правило, це код-гольф , що означає, що виграє найкоротший код у байтах. Крім того, було б корисно вказати дійсні формати вводу / виводу (2d масив? Один рядок? Тощо). Нарешті, є деякі крайові випадки, які ви не висвітлювали; наприклад, чи буде колись число оточене лише від'ємними числами?
Дверна ручка

Дякую. Я здогадуюсь до [100] [100], і так, число буде оточене від’ємними числами.
MT

Якими способами можна взяти внесок?
Мальтісен

1
@Doorknob Сума порожнього набору чисел дорівнює 0.
orlp

@Maltysen STDIN, я думаю.
MT

Відповіді:


10

MATL , 9 байт

t0>*1Y6Z+

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

Пояснення

Матриця введення множиться на відповідну маску, щоб зробити від'ємні значення рівними 0. Потім застосовується 2D згортка для обчислення суми сусідів кожного запису.

t     % Take input implicitly: 2D array. Duplicate
0>    % Is each entry positive? This gives a mask of positive values
*     % Multiply: set negative values of input array to zero
1Y6   % Predefined literal: [0 1 0; 1 0 1; 0 1 0]
Z+    % 2D convolution preserving size. Implicitly display

4
Чи дозволені телефони як введення / виведення?
orlp

Ну тоді я сумніваюся, чи можна це перемогти: p
Аднан

@Adnan У Python це не так
R. Kap

4
Цей хлопець робив це по телефону, і ось я, приділяючи частину свого часу намаганням вирішити деякі з цих проблем ...
Р. Кап

@ R.Kap Я мав на увазі "набрав з телефону" (не "набрав під час розмови по телефону"). Вибачте за мою англійську :-)
Луїс Мендо,

7

Октава, 46 44 40 байт

Збережено 2 байти завдяки ядра @flawr
@ LuisMendo на 4 байти коротше, ніж у @ flawr.

@(M)conv2(M.*(M>0),(x='aba')~=x','same')

Так само, як відповідь @ LuisMendo ! Тільки менше ... гольфі.

Ви можете побачити це тут на ideone .


КОМОН, я збирався опублікувати цю точну відповідь.
flawr

1
Ви можете використовувати зберегти 6 байт, використовуючи (x='aba')~=x'замість[0 1 0;1 0 1;0 1 0]
Луїс Мендо,

2
@LuisMendo Що це за чаклунство?
стакан

1
@cat .*- це елементарне множення матриць. Булева матриця полягає в тому, що MATLAB є в основному безтиповим і розглядається як числовий. Так M>0це просто діяти як маска.
стакан

1
(x='aba')~=x'. Це просто приголомшливо @Luis!
Стюі Гріффін

2

JavaScript (ES6), 99 94 байт

a=>a.map((b,i)=>b.map((_,j)=>(g=(c=j,k=j)=>c[k]>0&&c[k])(a[i-1])+g(a[i+1])+g(b,j-1)+g(b,j+1)))

Приймає та повертає двовимірний масив.

Редагувати: Повністю переписаний, коли я виявив, що аргументи за замовчуванням працюють, коли ви передаєте явно невизначене значення, наприклад, коли ви індексуєте кінець масиву.



Версія @Socialz Neils старша.
flawr

@flawr Деякі люди, можливо, дивляться на цю ланцюжок повідомлень у порядку голосування, а не на дату публікації, тому я прокоментував цю відповідь. Цей на 4 байти довший, ніж користувач.
ascx

Отже, ви в основному хочете рекламувати інший пост ??
flawr

@Socialz був на 4 байти довше, так ;-)
Ніл



0

Mathcad, байти

Використовується стандартна 2D згортка відфільтрованого масиву з ядром 3x3. Варіанти з від'ємними сумами елементів та діагональним ядром також додаються як компенсація частини для програми, яка не працює щонайменше в байтах.

введіть тут опис зображення


Ще не визначено кількість байтів, введених як оцінка Mathcad. Однак, використовуючи еквівалентність клавіатури, це область з 28 байтів, припускаючи, що введення матриці не зараховується до загального.

Зауважте, що ви бачите на зображенні вище саме те, як розчинn вводиться та відображається в Mathcad.


0

Желе, 23 20 18 байт

0;+ḊṖ
ZÇ€Z+Ç€
+AHÇ

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

Алгоритм

Скажімо, є лише один ряд: [1,2,3,4].

Скажімо, A - результат попереднього нулю, тобто [0,1,2,3,4].

B - результат вилучення першого пункту, тобто [2,3,4].

Тоді кінцевий результат просто A + B векторизований, потім видаляється останній елемент.

Тепер алгоритм повинен застосовувати це до кожного рядка, а також до кожного стовпця, а потім знаходити їх векторизовану суму.

До кожного стовпчика ?! Я думав, що Джелі це не підтримує ...

Ти маєш рацію. Тому я перемістив його, застосувавши до кожного ряду, потім знову перемістив.

Алгоритм вилучення від’ємних чисел

Тут ви просто додаєте до кожного числа їх абсолютний. Це ефективно виключає від’ємні числа при подвоєнні кожного додатного числа. Потім просто вдвічі зменшити всю матрицю.


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