Індексуйте суму та закресліть мою матрицю


9

Індексуйте суму та закресліть мою матрицю

Дано матричний / 2d масив на бажаній мові

Вхід:

  • Матриця завжди матиме непарну довжину
  • Матриця завжди буде ідеально квадратною
  • Значення матриці можуть бути будь-яким цілим числом у вашій мові (позитивне чи негативне)

Приклад:

1  2  3  4  5  6  7
2  3  4  5  6  7  8
3  4  50 6  7  8  9
4  5  6 100 8  9  10
5  6  7  8 -9  10 11
6  7  8  9  10 11 12
7  8 900 10 11 12 0

Визначення:

  • "Центральне число" визначається як число, яке має однакову кількість цифр зліва, справа, вгору та вниз

У цьому випадку його середнє 100

  • "Зовнішня оболонка" - це сукупність чисел, їх індекс x і y дорівнює 0, або розмір матриці

1  2  3  4  5  6  7
2                 8
3                 9
4                 10
5                 11
6                 12
7  8 900 10 11 12 0

Ваше завдання:

Додайте до центрального числа суму кожного рядка та стовпця після множення значень у кожному на їх 1-базисний індекс

Наприклад, один рядок

4  5  6  7  8

для кожного числа

number * index + number * index.....

4*1 + 5*2 + 6*3 + 7*4 + 8*5 => 100

приклад:

 2 -3 -9  4  7  1  5  => 61
-2  0 -2 -7 -7 -7 -4  => -141
 6 -3 -2 -2 -3  2  1  => -10
 8 -8  4  1 -8  2  0  => -20
-5  6  7 -1  8  4  8  => 144
 1  5  7  8  7 -9 -5  => 10
 7  7 -2  2 -7 -8  0  => -60
                         |
78 65 60 45 -15 -89 10   => 154
                     |
                     => -16
  • Для всіх рядків і стовпців ви поєднуєте ці значення.
  • Тепер ви також сумуєте їх => 154-16 = 138
  • Ви додаєте це число до "центрального числа" та виймаєте "зовнішню оболонку" матриці

 0 -2 -7 -7 -7     => -88
-3 -2 -2 -3  2     => -15
-8  4 1+138 -8  2  => 395
 6  7 -1  8  4     => 69
 5  7  8  7 -9     => 26

19 69 442 30 -26

зробіть це до тих пір, поки у вас є одне число

-2 -2 -3     => -15
 4  1060 -8  => 2100
 7 -1  8     => 29

27 2115 5
  • Додайте 2114 + 2147 до 1060
  • Видаліть «зовнішню оболонку» і отримайте 5321
  • Тепер у нас залишився єдиний номер

це вихід!

тестові справи:

-6

-6

-7 -1  8
-4 -6  7
-3 -6  6

2

 6  7 -2  5  1
-2  6 -4 -2  3
-1 -4  0 -2 -7
 0  1  4 -4  8
-8 -6 -5  0  2

-365

 8  3  5  6  6 -7  5
 6  2  4 -2 -1  8  3
 2  1 -5  3  8  2 -3
 3 -1  0  7 -6  7 -5
 0 -8 -4 -9 -4  2 -8
 8 -9 -3  5  7  8  5
 8 -1  4  5  1 -4  8

17611

-9 -7  2  1  1 -2  3 -7 -3  6  7  1  0
-7 -8 -9 -2  7 -2  5  4  7 -7  8 -9  8
-4  4 -1  0  1  5 -3  7  1 -2 -9  4  8
 4  8  1 -1  0  7  4  6 -9  3 -9  3 -9
-6 -8 -4 -8 -9  2  1  1 -8  8  2  6 -4
-8 -5  1  1  2 -9  3  7  2  5 -6 -1  2
-8 -5 -7 -4 -9 -2  5  0  2 -4  2  0 -2
-3 -6 -3  2 -9  8  1 -5  5  0 -4 -1 -9
-9 -9 -8  0 -5 -7  1 -2  1 -4 -1  5  7
-6 -9  4 -2  8  7 -9 -5  3 -1  1  8  4
-6  6 -3 -4  3  5  6  8 -2  5 -1 -7 -9
-1  7 -9  4  6  7  6 -8  5  1  0 -3  0
-3 -2  5 -4  0  0  0 -1  7  4 -9 -4  2

-28473770

Це виклик кодегольфа, тому програма з найнижчим числом рахунків виграє


ви маєте рацію, це помилка
друку

3
чому негативні числа будуть проблемою? Я не думаю, що виклик повинен підлаштовуватися під езоланг, але, можливо, навпаки є більш підходящим
downrep_nation

@LuisMendo Я думаю, що це не проблема, правило "Значення матриці може бути будь-яким цілим числом у вашій мові" означає для мене, що якщо у вашій мові немає негативних чисел, вона не повинна їх підтримувати.
Фаталізувати

насправді це правильно. але тоді тестові випадки не працюватимуть належним чином
downrep_nation

2
"Я не думаю, що виклик повинен підлаштовуватися під езоланг, але, можливо, навпаки є більш підходящим", який повинен бути вигравійований у камені
edc65

Відповіді:


4

MATL , 36 34 байт

tnq?`t&+stn:*sytn2/)+ 7M(6Lt3$)tnq

Вхід - це 2D масив з ;роздільником рядків

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Пояснення

tnq       % Take input. Duplicate, get number of elements, subtract 1
?         % If greater than 0
  `       %   Do...while
    t     %     Duplicate
    &+    %     Sum matrix with its transpose
    s     %     Sum each column. Gives a row vector
    tn:   %     Vector [1 2 ...] with the same size
    *     %     Multiply element-wise
    s     %     Sum of vector. This will be added to center entry of the matrix
    y     %     Duplicate matrix
    tn2/  %     Duplicate, get half its number of elements. Gives non-integer value
    )     %     Get center entry of the matrix, using linear index with implicit rounding
    +     %     Add center entry to sum of previous vector
    7M    %     Push index of center entry again
    (     %     Assgined new value to center of the matrix
    6Lt   %     Array [2 j1-1], twice. This will be used to remove shell
    3$)   %     Apply row and col indices to remove outer shell of the matrix
    tnq   %     Duplicate, number of elements, subtract 1. Falsy if matrix has 1 entry
          %   End do...while implicitly. The loop is exited when matrix has 1 entry
          % End if implicitly
          % Display stack implicitly

4

Python 2.7, 229 байт

Це моя перша спроба чогось подібного, тому, сподіваюся, я дотримувався всіх правил із цим поданням. Це лише функція, яка бере в списку списки як свій параметр. Я відчуваю, що суми та розуміння списків, певно, можна було б трохи скоротити, але це було занадто важко для мене. : D

def r(M):
  t=len(M)
  if t==1:return M[0][0]
  M[t/2][t/2]+=sum(a*b for k in [[l[x] for l in M]for x in range(0,t)]for a,b in enumerate(k,1))+sum([i*j for l in M for i,j in enumerate(l,1)])
  return r([p[+1:-1]for p in M[1:-1]])

Думаю на пасхальний Ірк за те, що він допомагав мені відголити кілька байтів.


1
Ви можете видалити пару пробілів між операторами ( ...) + sum([i*j...-> ...)+sum([i*j...), але загалом, чудовий перший пост !!!!
Rɪᴋᴇʀ

ооо пропустив це. Дякую!
Джеремі

1
Також ...]for ...працює. Ви можете прибрати як мінімум 2 місця таким чином. (кінець списку хітів для циклу for)
Rɪᴋᴇʀ

3

C #, 257 байт

ось невідповідна відповідь

void f(int[][]p){while(p.Length>1){int a=p.Length;int r=0;for(int i=0;i<a;i++)for(int j=0;j<a;j++)r+=(i+j+2)*p[i][j];p[a/2][a/2]+=r;p=p.Where((i,n)=>n>0&&n<p.Length-1).Select(k=>k.Where((i,n)=>n>0&&n<p.Length-1).ToArray()).ToArray();}Console.Write(p[0][0]);

неозорений:

void f(int[][]p)
    {
        while (p.Length>1)
        {
            int a=p.Length;
            int r=0; //integer for number to add to middle
            for (int i = 0; i < a; i++)
                for (int j = 0; j < a; j++)
                    r +=(i+j+2)*p[i][j]; //add each element to counter according to their 1 based index
            p[a / 2][a / 2] += r; //add counter to middle
            p = p.Where((i, n) => n > 0 && n < p.Length - 1).Select(k => k.Where((i, n) => n > 0 && n < p.Length - 1).ToArray()).ToArray(); //strip outer shell from array
        }
        Console.Write(p[0][0]); //print last and only value in array
    }

2
Гей тепер, J не езоланг.
милі

Це не компілюється, якщо ви не включаєте using System.Linqта using System. Я не впевнений, якщо цього вимагають правила.
Yytsi

це не повна програма, її єдина функція, настільки добре, наскільки я знаю. я маю на увазі, чи потрібно мені також включати App.config та всі байти у властивості та makefile? ні
downrep_nation

@downrep_nation Це просто дивно, оскільки я бачив, як деякі люди включають їх у джерело, коли це була лише функція, і вони включали байти в рахунок.
Yytsi

Тепер, коли я замислююсь над цим, я перебуваю на тому, що вам слід імпортувати щонайменше System.Linq. Інші мови, які потребують імпорту для використання певних функцій, проходять той самий процес, тому я вважаю, що несправедливо вважати, що кожен модуль завантажується в пам'ять на C #.
Yytsi

2

J, 66 байт

([:}:@}."1@}:@}.]+(i.@,~=](]+*)<.@-:)@#*[:+/^:2#\*]+|:)^:(<.@-:@#)

Прямий підхід на основі процесу, описаного в виклику.

[:+/^:2#\*]+|:отримує суму. ]+(i.@,~=](]+*)<.@-:)@#*є особливо некрасивим способом збільшення центру на суму. [:}:@}."1@}:@}.видаляє зовнішню оболонку. Напевно, є кращий спосіб зробити це.

Використання

   f =: ([:}:@}."1@}:@}.]+(i.@,~=](]+*)<.@-:)@#*[:+/^:2#\*]+|:)^:(<.@-:@#)
   f _6
_6
   f _7 _1 8 , _4 _6 7 ,: _3 _6 6
2
   f 6 7 _2 5 1 , _2 6 _4 _2 3 , _1 _4 0 _2 _7 , 0 1 4 _4 8 ,: _8 _6 _5 0 2 
_365
   f 8 3 5 6 6 _7 5 , 6 2 4 _2 _1 8 3 , 2 1 _5 3 8 2 _3 , 3 _1 0 7 _6 7 _5 , 0 _8 _4 _9 _4 2 _8 ,8 _9 _3 5 7 8 5 ,: 8 _1 4 5 1 _4 8
17611
   f (13 13 $ _9 _7 2 1 1 _2 3 _7 _3 6 7 1 0 _7 _8 _9 _2 7 _2 5 4 7 _7 8 _9 8 _4 4 _1 0 1 5 _3 7 1 _2 _9 4 8 4 8 1 _1 0 7 4 6 _9 3 _9 3 _9 _6 _8 _4 _8 _9 2 1 1 _8 8 2 6 _4 _8 _5 1 1 2 _9 3 7 2 5 _6 _1 2 _8 _5 _7 _4 _9 _2 5 0 2 _4 2 0 _2 _3 _6 _3 2 _9 8 1 _5 5 0 _4 _1 _9 _9 _9 _8 0 _5 _7 1 _2 1 _4 _1 5 7 _6 _9 4 _2 8 7 _9 _5 3 _1 1 8 4 _6 6 _3 _4 3 5 6 8 _2 5 _1 _7 _9 _1 7 _9 4 6 7 6 _8 5 1 0 _3 0 _3 _2 5 _4 0 0 0 _1 7 4 _9 _4 2)
_28473770

2

Брахілог , 114 байт

{l1,?hh.|:{:Im:I:?:{[L:I:M]h:JmN,Ll:2/D(IJ,M{$\:?c:{:{:ImN,I:1+:N*.}f+.}a+.}:N+.;'(DIJ),N.)}f.}f:7a$\:7a&.}.
brbr.

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

Приклад використання:

?- run_from_file('code.brachylog', '[[0:_2:_7:_7:_7]:[_3:_2:_2:_3:2]:[_8:4:139:_8:2]:[6:7:_1:8:4]:[5:7:8:7:_9]]', Z).
Z = 5321 .

Пояснення

Більш прочитана (і довша) версія:

{l1,?hh.|:2f:7a$\:7a&.}.
:Im:I:?:3f.
[L:I:M]h:JmN,Ll:2/D(IJ,M:4&:N+.;'(DIJ),N.)
$\:?c:5a+.
:6f+.
:ImN,I:1+:N*.
brbr.

Я просто поясню приблизно, що робить кожен предикат (тобто кожен рядок, за винятком першого, головний предикат + предикат 1):

  • Основний предикат + предикат 1 {l1,?hh.|:2f:7a$\:7a&.}.: Якщо вхід має лише один рядок, то закінчіть алгоритм і поверніть єдине значення. Ще знайдіть усі рядки, які задовольняють присудок 2, потім застосуйте предикат 7 до отриманої матриці, потім присудок 7 на переміщення, а потім викликайте рекурсивно.

  • Предикат 2 :Im:I:?:3f.: Візьміть 3- Iй рядок матриці, знайдіть усі значення цього рядка, які задовольняють предикат 3, Iі матрицю як додаткові входи.

  • Предикат 3 [L:I:M]h:JmN,Ll:2/D(IJ,M:4&:N+.;'(DIJ),N.): Lце рядок, Iіндекс рядка, Mє матриця. Nє Jелементом L. Якщо довжина, Lподілена на 2, дорівнює обом Iі J, тоді вихід є сумою Nз результатом предиката 4 на матриці. Інакше вихід справедливий N. Цей предикат суттєво відтворює матрицю за винятком того, що центральний елемент додається до суми.

  • $\:?c:5a+.Присудок 4 : Застосуйте предикат 5 до кожного рядка та стовпця матриці, уніфікуйте результат із сумою результатів.

  • Предикат 5 :6f+.: Знайдіть усі дійсні результати предиката 6 у рядку, уніфікуйте результат із сумою результуючого списку.

  • Присудок 6 :ImN,I:1+:N*.N- це Iчисло рядка, уніфікуйте результат з N * (I+1).

  • Присудок 7 brbr.: Видаліть перший і останній ряд матриці.


2

APL, 56 символів

{{1 1↓¯1 ¯1↓⍵+(-⍴⍵)↑(⌈.5×⍴⍵)↑+/(⍵⍪⍉⍵)+.×⍳≢⍵}⍣(⌊.5×≢⍵)⊣⍵}

Англійською:

  • ⍣(⌊.5×≢⍵) повторити "половину розміру округленого розміру" -рази
  • (⍵⍪⍉⍵)+.×⍳≢⍵ внутрішній добуток матриці та її транспозиція з індексним вектором
  • (-⍴⍵)↑(⌈.5×⍴⍵)↑ результат перетворення в матрицю з 0s
  • 1 1↓¯1 ¯1↓ видаляє зовнішню оболонку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.