Soma de índice e tira minha matriz

9

Soma de índice e tira minha matriz

Dada uma matriz / matriz 2D em seu idioma preferido

Entrada:

  • A matriz sempre terá um comprimento ímpar
  • A matriz sempre será perfeitamente quadrada
  • Os valores da matriz podem ser qualquer número inteiro no seu idioma (positivo ou negativo)

Exemplo:

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

Definições:

  • O "número central" é definido como o número que tem a mesma quantidade de números à esquerda, direita, para cima e para baixo

Neste caso, o seu meio intermediário 100

  • O "invólucro externo" é a coleção de números cujo índice x e y é ou 0 ou o tamanho da matriz

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

Sua tarefa:

Adicione ao número central a soma de cada linha e coluna após multiplicar os valores em cada um pelo índice baseado em 1

Uma única linha, por exemplo

4  5  6  7  8

para cada número

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

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

exemplo:

 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
  • Para todas as linhas e colunas, você combina esses valores.
  • Agora você soma isso também => 154-16 = 138
  • Você adiciona esse número ao "número central" e remove a "casca externa" da matriz

 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

faça isso até você terminar com um único número

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

27 2115 5
  • Adicione 2114 + 2147 a 1060
  • Remova o "escudo externo" e obtenha 5321
  • Agora temos um único número restante

esta é a saída!

casos de teste:

-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

Esse é um desafio do codegolf, de modo que o programa com o menor número de vitórias vence

downrep_nation
fonte
você está correto, isso é um erro de digitação
downrep_nation
3
por que números negativos seriam um problema? Eu não acho que o desafio deve ajustar para esolangs mas talvez o contrário é mais apropriado
downrep_nation
@LuisMendo Eu acho que não é um problema, a regra "Os valores da matriz podem ser qualquer número inteiro no seu idioma" significa para mim que, se o seu idioma não tiver números negativos, não deverá apoiá-los.
Fatalize
na verdade isso é correto. mas, em seguida, os casos de teste não vai funcionar corretamente
downrep_nation
2
"Eu não acho que o desafio deve ajustar para esolangs mas talvez o contrário é mais apropriado" que deve ser gravado em pedra
edc65

Respostas:

4

MATL , 36 34 bytes

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

Input é uma matriz 2D com ;como separador de linhas

Experimente online! Ou verifique todos os casos de teste .

Explicação

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
Luis Mendo
fonte
4

Python 2.7, 229 bytes

Esta é a minha primeira tentativa de algo assim, então espero ter seguido todas as regras com este envio. Esta é apenas uma função que recebe uma lista de listas como parâmetro. Eu sinto que as somas e a compreensão da lista provavelmente poderiam ser reduzidas um pouco, mas foi muito difícil para mim. : 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]])

Agradecemos a Easterly Irk por me ajudar a eliminar alguns bytes.

Jeremy
fonte
11
Você pode remover alguns espaços entre operadores ( ...) + sum([i*j...-> ...)+sum([i*j...), mas no geral, ótimo primeiro post !!!!
Rɪᴋᴇʀ
oooh senti falta disso. Obrigado!
Jeremy
11
Além disso, ...]for ...funciona. Você pode remover pelo menos 2 espaços assim. (fim da lista atinge o loop)
Rɪᴋᴇʀ
3

C #, 257 bytes

aqui está uma resposta não 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
    }
downrep_nation
fonte
2
Ei, agora, J não é um esolang.
miles
Isso não compila se você não incluir using System.Linqe using System. Não tenho certeza se é exigido pelas regras.
Yytsi
não é um programa completo, é apenas uma função, então está tudo bem até onde eu sei. Quero dizer, eu também precisaria incluir o App.config e todos os bytes nas propriedades e makefile? no
downrep_nation
@downrep_nation É estranho, já que eu vi algumas pessoas incluí-las na fonte quando ela era apenas uma função e elas incluíram os bytes na partitura.
Yytsi
Agora, quando penso nisso, estou na linha de que você deve importar pelo menos System.Linq. Outras linguagens que exigem importação para usar certos recursos passam pelo mesmo processo, por isso acho injusto supor que todos os módulos estejam carregados na memória em C #.
Yytsi
2

J, 66 bytes

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

Abordagem direta com base no processo descrito no desafio.

[:+/^:2#\*]+|:recebe a soma. ]+(i.@,~=](]+*)<.@-:)@#*é uma maneira particularmente feia de aumentar o centro pela soma. [:}:@}."1@}:@}.remove a casca externa. Provavelmente existe uma maneira melhor de fazer isso.

Uso

   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
milhas
fonte
2

Braquilog , 114 bytes

{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.

Estou surpreso que isso funcione para ser honesto. Pelo menos eu percebi que o Brachylog realmente precisa de um "valor de alteração desse elemento" como um recurso interno…

Exemplo de uso:

?- 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 .

Explicação

Versão mais legível (e mais longa):

{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.

Eu só vou explicar mais ou menos o que cada predicado (ou seja, cada linha, exceto a primeira que é predicado principal + predicado 1) faz:

  • Predicado principal + predicado 1 {l1,?hh.|:2f:7a$\:7a&.}.: se a entrada tiver apenas uma linha, encerre o algoritmo e retorne o único valor. Caso contrário, encontre todas as linhas que satisfazem o predicado 2, aplique o predicado 7 na matriz resultante, depois o predicado 7 na transposição e chame recursivamente.

  • Predicado 2 :Im:I:?:3f.: Pegue a Iquinta linha da matriz, encontre todos os valores dessa linha que satisfaçam o predicado 3 Ie a matriz como entradas adicionais.

  • Predicado 3 [L:I:M]h:JmN,Ll:2/D(IJ,M:4&:N+.;'(DIJ),N.): Lé a linha, Ié o índice da linha, Mé a matriz. Né o Jth elemento de L. Se o comprimento de Ldividido por 2 for igual a ambos Ie J, a saída será a soma de Ncom o resultado do predicado 4 na matriz. Caso contrário, a saída é justa N. Esse predicado recria essencialmente a matriz, com a exceção de que o elemento central é adicionado à soma.

  • Predicado 4 $\:?c:5a+.: aplique o predicado 5 em cada linha e coluna da matriz, unifique a saída com a soma dos resultados.

  • Predicado 5 :6f+.: encontre todas as saídas válidas do predicado 6 na linha, unifique a saída com a soma da lista resultante.

  • Predicado 6 :ImN,I:1+:N*.Né o Ivalor th da linha, unifique a saída com N * (I+1).

  • Predicado 7 brbr.: Remova a primeira e a última linha da matriz.

Fatalizar
fonte
2

APL, 56 caracteres

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

Em inglês:

  • ⍣(⌊.5×≢⍵) repita "metade do tamanho de uma dimensão arredondada" - vezes
  • (⍵⍪⍉⍵)+.×⍳≢⍵ produto interno da matriz e sua transposição com o vetor de índice
  • (-⍴⍵)↑(⌈.5×⍴⍵)↑ transformar resultado em matriz acolchoada com 0s
  • 1 1↓¯1 ¯1↓ remove casca externa
lstefano
fonte