Преобразовать матрицу


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
Добро пожаловать в Программирование Пазлов и Code Golf! Все проблемы здесь требуется объективный критерий победы, для того , чтобы неоспоримо определить , какие решения должны выиграть. Как правило, это код-гольф , что означает, что выигрывает самый короткий код в байтах. Кроме того, было бы полезно указать допустимые форматы ввода / вывода (2d массив «одна строка» и т. Д.). Наконец, есть некоторые крайние случаи, которые вы не рассмотрели; например, будет ли число когда-либо окружено только отрицательными числами?
Ручка двери

Спасибо. Я предполагаю до [100] [100], и да, число будет окружено отрицательными числами.
МТ

Каким образом мы можем принять участие?
Maltysen

1
@Doorknob Сумма пустого набора чисел равна 0.
orlp

@ Малтисен STDIN, я думаю.
MT

Ответы:


10

MATL , 9 байт

t0>*1Y6Z+

Попробуйте онлайн!

объяснение

Входная матрица умножается соответствующей маской, чтобы сделать отрицательные значения равными 0. Затем применяется двумерная свертка, чтобы вычислить сумму соседей каждой записи.

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

Ну, тогда я сомневаюсь, что это можно победить: р
Аднан

@Adnan В Python это не так
Р. Кап

4
Этот парень сделал это, когда разговаривал по телефону, и здесь я вынужден посвятить часть своего времени попыткам решить некоторые из этих проблем ...
Р. Кап

@ R.Kap Я имел в виду «набрал с телефона» (не «набрал во время разговора по телефону»). Извините за мой английский :-)
Луис Мендо

7

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

Сохранено 2 байта благодаря ядру @flawr
@ LuisMendo на 4 байта короче, чем @ flawr.

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

Так же, как ответ @ LuisMendo ! Только меньше ... гольф.

Вы можете увидеть это здесь на ideone .


COMON, я как раз собирался опубликовать этот точный ответ.
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 байта длиннее, да ;-)
Нейл

2

JavaScript (ES6), 95 93 байта

document.write("<pre>"+(

m=>m.map((a,r)=>a.map((_,c)=>(s=(x,y=0)=>(n=(m[r+y]||0)[c+x])>0&&n)(1)+s(-1)+s(0,1)+s(0,-1)))

)([[  1,  2,  3 ],
   [  4, -1, -2 ],
   [ -3, -4, 10 ],
   [  1,  2, 10 ]])

.join`\n`)



0

Mathcad, байты

Использует стандартную двумерную свертку отфильтрованного массива с ядром 3х3. Варианты с отрицательными суммами элементов и диагональным ядром также добавляются как компенсация части для программы, которая не работает в течение наименьшего количества байтов.

enter image description here


Число байтов не введено, поскольку оценка Mathcad еще не определена. Однако, используя эквивалентность клавиатуры, это область из 28 байтов, при условии, что матричный ввод не учитывается в общем объеме.

Обратите внимание, что то, что вы видите на изображении выше, это то, как решение вводится и отображается в 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.