Índice de suma y tira de mi matriz


9

Índice de suma y tira de mi matriz

Dada una matriz / matriz 2d en su idioma preferido

Entrada:

  • La matriz siempre tendrá una longitud impar.
  • La matriz siempre será perfectamente cuadrada.
  • Los valores de la matriz pueden ser cualquier número entero en su idioma (positivo o negativo)

Ejemplo:

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

Definiciones:

  • El "número central" se define como el número que tiene la misma cantidad de números a la izquierda, derecha, arriba y abajo

En este caso, sus 100 más intermedios

  • La "capa externa" es la colección de números cuyo índice xey es 0 o el tamaño de la 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

Tu tarea:

Agregue al número central la suma de cada fila y columna después de multiplicar los valores en cada uno por su índice basado en 1

Una sola fila por ejemplo

4  5  6  7  8

para cada número

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

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

ejemplo:

 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 las filas y columnas, combina estos valores.
  • Ahora sumas esto también => 154-16 = 138
  • Agrega ese número al "número central" y elimina la "capa externa" de la 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

haz esto hasta que termines con un solo número

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

27 2115 5
  • Agregar 2114 + 2147 a 1060
  • Retire la "cubierta exterior" y obtenga 5321
  • Ahora nos queda un solo número

esta es la salida!

Casos de prueba:

-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

Este es un desafío de codegolf, por lo que gana el programa con el bytecount más bajo


tienes razón, eso es un error tipográfico
downrep_nation

3
¿Por qué los números negativos serían un problema? No creo que el desafío deba ajustarse a esolangs, pero tal vez al revés sea más apropiado
downrep_nation

@LuisMendo Creo que no es un problema, la regla "Los valores de la matriz pueden ser cualquier número entero en su idioma" significa que si su idioma no tiene números negativos, no debería admitirlos.
Fatalize

En realidad eso es correcto. pero los casos de prueba no funcionarán correctamente
downrep_nation

2
"No creo que el desafío deba ajustarse a esolangs, pero tal vez al revés sea más apropiado" que debería estar grabado en piedra
edc65

Respuestas:


4

MATL , 36 34 bytes

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

La entrada es una matriz 2D con un ;separador de filas

Pruébalo en línea! O verificar todos los casos de prueba .

Explicación

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 bytes

Este es mi primer intento de algo como esto, así que espero seguir todas las reglas con esta presentación. Esta es solo una función que toma una lista de listas como su parámetro. Siento que las sumas y la comprensión de la lista probablemente podrían acortarse un poco, pero fue demasiado difícil para mí. :RE

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

Gracias a Easterly Irk por ayudarme a reducir algunos bytes.


1
Puede eliminar un par de espacios entre operadores ( ...) + sum([i*j...-> ...)+sum([i*j...), pero en general, ¡¡¡excelente primera publicación !!!!
Rɪᴋᴇʀ

oooh me perdí eso. ¡Gracias!
Jeremy

1
Además, ...]for ...funciona. Puede eliminar al menos 2 espacios como ese. (el final de la lista toca el ciclo for)
Rɪᴋᴇʀ

3

C #, 257 bytes

aquí hay una respuesta que no es 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]);

sin golf:

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
Hola, J no es un esolang.
millas

Esto no se compila si no incluye using System.Linqy using System. Sin embargo, no estoy seguro de si es requerido por las reglas.
Yytsi

no es un programa completo, es solo una función, así que está bien hasta donde yo sé Quiero decir, ¿también necesitaría incluir App.config y todos los bytes en las propiedades y el archivo MAKE? no
downrep_nation

@downrep_nation Es extraño, ya que he visto a algunas personas incluirlos en la fuente cuando solo ha sido una función y han incluido los bytes en la partitura.
Yytsi

Ahora, cuando lo pienso, estoy en la línea de que deberías importar al menos System.Linq. Otros lenguajes que requieren importación para usar ciertas funciones pasan por el mismo proceso, por lo que creo que es injusto suponer que cada módulo se carga en la memoria en C #.
Yytsi

2

J, 66 bytes

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

Enfoque directo basado en el proceso descrito en el desafío.

[:+/^:2#\*]+|:obtiene la suma ]+(i.@,~=](]+*)<.@-:)@#*es una forma particularmente fea de incrementar el centro por la suma. [:}:@}."1@}:@}.Quita la cubierta exterior. Probablemente hay una mejor manera de hacer esto.

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

2

Brachylog , 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.

Me sorprende que esto funcione para ser sincero. Al menos me di cuenta de que Brachylog realmente necesita un "valor de cambio de ese elemento" como algo incorporado ...

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

Explicación

Versión más legible (y más larga):

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

Solo explicaré aproximadamente lo que hace cada predicado (es decir, cada línea, excepto la primera que es Predicado principal + predicado 1):

  • Predicado principal + predicado 1 {l1,?hh.|:2f:7a$\:7a&.}.: si la entrada tiene solo una fila, finalice el algoritmo y devuelva el único valor. De lo contrario, encuentre todas las filas que satisfagan el predicado 2, luego aplique el predicado 7 en la matriz resultante, luego el predicado 7 en la transposición, luego llame recursivamente.

  • Predicado 2 :Im:I:?:3f.: tome la Ifila de la matriz, encuentre todos los valores de esa fila que satisfagan el predicado 3 Iy la matriz como entradas adicionales.

  • Predicado 3 [L:I:M]h:JmN,Ll:2/D(IJ,M:4&:N+.;'(DIJ),N.): Les la fila, Ies el índice de la fila, Mes la matriz. Nes el Jelemento º de L. Si la longitud de Ldividido por 2 es igual a ambos Iy J, entonces la salida es la suma de Ncon el resultado del predicado 4 en la matriz. De lo contrario, la salida es justa N. Este predicado recrea esencialmente la matriz con la excepción de que el elemento central se agrega a la suma.

  • Predicado 4 $\:?c:5a+.: aplique el predicado 5 en cada fila y columna de la matriz, unifique la salida con la suma de los resultados.

  • Predicado 5 :6f+.: Encuentre todas las salidas válidas del predicado 6 en la fila, unifique el resultado con la suma de la lista resultante.

  • Predicado 6 :ImN,I:1+:N*.Nes el Ivalor de la fila, unifica la salida con N * (I+1).

  • Predicado 7 brbr.: elimine la primera y la última fila de la matriz.


2

APL, 56 caracteres

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

En inglés:

  • ⍣(⌊.5×≢⍵) repita "la mitad del tamaño de una dimensión redondeada"
  • (⍵⍪⍉⍵)+.×⍳≢⍵ producto interno de la matriz y su transposición con el vector índice
  • (-⍴⍵)↑(⌈.5×⍴⍵)↑ transformar resultado en matriz rellenada con 0s
  • 1 1↓¯1 ¯1↓ elimina la cubierta exterior
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.