Индекс суммы и лишить мою матрицу


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

Это вызов Codegolf, поэтому программа с самым низким числом побед побеждает


вы правы, вот опечатка
downrep_nation

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

@ LuisMendo Я думаю, что это не проблема, правило «Значения матрицы может быть любым целым числом на вашем языке» означает для меня, что если ваш язык не имеет отрицательных чисел, он не должен их поддерживать.
Роковая

на самом деле это правильно. но тогда контрольные примеры не будут работать должным образом
downrep_nation

2
«Я не думаю, что задача должна приспосабливаться к esolangs, но, возможно, другой подход более уместен», что должно быть выгравировано на камне
edc65

Ответы:


4

MATL , 36 34 байта

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

Ввод - это двумерный массив с ;разделителем строк

Попробуйте онлайн! Или проверьте все тестовые случаи .

объяснение

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 байт

вот ответ не esolang

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]);

ungolfed:

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 не esolang.
миль

Это не компилируется, если вы не включите using System.Linqи using System. Я не уверен, если это требуется по правилам, хотя.
Yytsi

это не полная программа, это только функция, так что все хорошо, насколько я знаю. я имею в виду, нужно ли мне также включать App.config и все байты в свойствах и make-файле? нет
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.

Я удивлен, что это даже работает, если честно. По крайней мере, я понял, что Brachylog действительно нуждается в «изменении значения этого элемента» в качестве встроенного ...

Пример использования:

?- 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.: возьмите 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. Этот предикат существенно воссоздает матрицу за исключением того, что центральный элемент добавляется к сумме.

  • Предикат 4 $\:?c:5a+.: примените предикат 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×⍴⍵)↑ преобразовать результат в матрицу, дополненную нулями
  • 1 1↓¯1 ¯1↓ удаляет внешнюю оболочку
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.