Convierte esta matriz en una matriz


13

Tome una matriz no anidada como entrada. Conviértalo en una matriz utilizando el siguiente método:

Digamos que mi matriz es [1, 2, 3, 4, 5]

Primero, repito esa matriz 5 veces: (la longitud)

[[1, 2, 3, 4, 5],
 [1, 2, 3, 4, 5],
 [1, 2, 3, 4, 5],
 [1, 2, 3, 4, 5],
 [1, 2, 3, 4, 5]]

Entonces, lo leí a lo largo de las diagonales:

[[1],
 [2, 1],
 [3, 2, 1],
 [4, 3, 2, 1],
 [5, 4, 3, 2, 1],
 [5, 4, 3, 2],
 [5, 4, 3],
 [5, 4],
 [5]]

Aplané esta matriz y la dividí en cinco (la longitud):

[[1, 2, 1, 3, 2],
 [1, 4, 3, 2, 1],
 [5, 4, 3, 2, 1],
 [5, 4, 3, 2, 5],
 [4, 3, 5, 4, 5]]

Este es el código de golf. Pocos bytes ganan.


La próxima vez, CAPITALIZA las cosas.
Oliver Ni

¿Cómo funciona esto si la matriz original tiene una longitud distinta de 5?

@ ais523 Supongo que es lo mismo, simplemente reemplazas 'cinco' con la longitud
Oliver Ni el

¿Podemos suponer que los números siempre son enteros positivos?
Luis Mendo

77
@JohnCena No debes aceptar la primera respuesta, debes darle a la publicación algo de tiempo para ganar tracción y algunas respuestas más.
Kade

Respuestas:


2

05AB1E, 13 bytes

.p¹.sR¦«í˜¹gä

Pruébalo en línea!

Explicación:

                # Implicit input
 .p             # Get prefixes
   ¹            # Get first input
    .s          # Get suffixes
      R         # Reverse
       ¦        # Remove first element
        «       # Concatenate
         í      # Reverse every one
          ˜     # Flatten
           ¹gä  # Split into pieces of the length
                # Implicit print

no es necesario imprimirlo

y cómo solicitó entrada

1
Muchos de estos lenguajes de golf, como 05AB1E, han incorporado reglas predeterminadas para solicitar entradas y producir salidas, de modo que el programador no tenga que desperdiciar bytes en ellas.

1
La salida realmente no coincide con la salida deseada. No es una matriz y los números no coinciden.
Karl Napf

1
Bueno, es una matriz, pero los números no son correctos (o tryitonline.net calcula mal)
Karl Napf

6

Jalea , 11 bytes

WẋLŒDUṙLFsL

Pruébalo en línea!

Explicación

               Input: array z
WẋL            length(z) copies of z
   ŒD          Diagonals (starting with main diagonal)
     U         Reverse each
      ṙL       Rotate left length(z) places
               (now the top-left diagonal is in front)
        F      Flatten
         sL    Split into chunks of size length(z)

Hmm cuando lo probé con Lél, hice cosas raras, por lo tanto, utilicé el registro: / Simplemente lo intenté de nuevo y funciona ... básicamente lo mismo, así que supongo que simplemente eliminaré el mío.
Jonathan Allan el

1
Por supuesto, Jelly tiene "diagonales" incorporadas .... :)
Greg Martin

3

Python 2, 105 96 bytes

-1 y -4 y -4 bytes gracias a Flp.Tkc

a=input()
n=len(a)
L,M=[],[]
for i in range(n):L+=a[i::-1];M+=a[:i:-1]
print zip(*[iter(L+M)]*n)

El bucle for agrega los elementos como en la descripción, la magia real ocurre en el zip que es desde aquí


perdón por el spam, pero ahora que R solo se usa una vez, puedes ponerlo allí directamente: P
FlipTack

@ Flp.Tkc no hay problema, estoy feliz :)
Karl Napf

3

JavaScript (ES6) 100 101 105

a=>eval("for(u=r=[],i=l=a.length;i+l;i--)for(j=l;j--;v&&((u%=l)||r.push(s=[]),s[u++]=v))v=a[j-i];r")

Menos golf

a => {
  u = 0
  for(r=[], i=l=a.length; i+l>0; i--)
    for(j=l; j--; )
    {
      v = a[j-i]
      if (v) 
      {
        u %= l
        if (u==0) r.push(s=[])
        s[u++] = v
      }
    }
  return r
}

Prueba

F=
a=>eval("for(u=r=[],i=l=a.length;i+l;i--)for(j=l;j--;v&&((u%=l)||r.push(s=[]),s[u++]=v))v=a[j-i];r")

function update() {
  var a=I.value.match(/\d+/g)
  if (a) {
    var r=F(a)
    O.textContent = r.join`\n`
  }
}

update()
<input id=I value='1 2 3 4 5' oninput='update()'>
<pre id=O></pre>


1
Wow, esa es una forma muy inteligente de evitar el return. Debería publicar un consejo sobre eso en el hilo de consejos ES6.
ETHproductions

@ETHproductions tiene un alcance muy limitado. La mayoría de las veces, eval es mejor.
edc65

@ETHproductions de hecho evales mejor incluso esta vez :(
edc65

@ETHproductions Publiqué el consejo, incluso si rara vez es útil, por si acaso
edc65

2

MATL , 17 bytes

!Gg*tRwZRhPXzGne!

Pruébalo en línea!

Cómo funciona

La siguiente explicación utiliza la entrada [1 2 3 4 5]como ejemplo. Para visualizar los resultados intermedios, inserte% (símbolo de comentario) después de cualquier declaración en el código.

Tenga en cuenta que ;es el separador de filas para matrices. Entonces, [1 2]es un vector de fila, [1; 2]es un vector de columna y [1 0; 0 1]es la matriz de identidad 2 × 2.

!     % Implicitly input a row vector. Transpose. Gives a column vector
      % STACK: [1; 2; 3; 4; 5]
Gg    % Push input with all (nonzero) values replaced by ones
      % STACK: [1; 2; 3; 4; 5], [1 1 1 1 1]
*     % Multiply, with broadcast. Gives a square matrix
      % STACK: [1 1 1 1 1;
                2 2 2 2 2;
                3 3 3 3 3;
                4 4 4 4 4;
                5 5 5 5 5]
tR    % Duplicate. Upper triangular part
      % STACK: [1 1 1 1 1;
                2 2 2 2 2;
                3 3 3 3 3;
                4 4 4 4 4;
                5 5 5 5 5],
               [1 1 1 1 1
                0 2 2 2 2;
                0 0 3 3 3;
                0 0 0 4 4;
                0 0 0 0 5]
wZR   % Swap. Lower triangular part, below main diagonal 
      % STACK: [1 1 1 1 1;
                0 2 2 2 2;
                0 0 3 3 3;
                0 0 0 4 4;
                0 0 0 0 5],
               [0 0 0 0 0;
                2 0 0 0 0;
                3 3 0 0 0;
                4 4 4 0 0;
                5 5 5 5 0]
h     % Concatenate horizontally
      % STACK: [1 1 1 1 1 0 0 0 0 0;
                0 2 2 2 2 2 0 0 0 0;
                0 0 3 3 3 3 3 0 0 0;
                0 0 0 4 4 4 4 4 0 0;
                0 0 0 0 5 5 5 5 5 0]
P     % Flip vertically
      % STACK: [0 0 0 0 5 5 5 5 5 0;
                0 0 0 4 4 4 4 4 0 0;
                0 0 3 3 3 3 3 0 0 0;
                0 2 2 2 2 2 0 0 0 0;
                1 1 1 1 1 0 0 0 0 0]
Xz    % Column vector of nonzeros, taken in column-major order
      % STACK: [1;2;1;3;2;1;4;3;2;1;5;4;3;2;1;5;4;3;2;5;4;3;5;4;5]
Gne   % Reshape into a matrix with as many rows as input size
      % STACK: [1 1 5 5 4;
                2 4 4 4 3;
                1 3 3 3 5;
                3 2 2 2 4;
                2 1 1 5 5]
 !    % Transpose. Implicitly display
      % STACK: [1 2 1 3 2;
                1 4 3 2 1;
                5 4 3 2 1;
                5 4 3 2 5;
                4 3 5 4 5]

1

JavaScript (ES6), 116 bytes

a=>a.map(_=>b.splice(0,a.length),b=[].concat(...a.map((_,i)=>a.slice(~i)),...a.map((_,i)=>a.slice(0,~i))).reverse())

Bueno, es un comienzo ...


1

R, 84 bytes

t(matrix(unlist(split(m<-t(matrix(rev(x<-scan()),l<-sum(1|x),l)),row(m)-col(m))),l))

Lee la entrada de stdin y produce / devuelve una matriz R.

reversed_x <- rev(x<-scan())                # Read input from stdin and reverse
m <- t(matrix(reversed_x,l<-sum(1|x),l))    # Repeat and fit into matrix
diag_list <- split(m,row(m)-col(m))         # Split into ragged list of diagonals
t(matrix(unlist(diag_list),l))              # Flatten and transform back to matrix

Explicado

El aspecto más interesante de esta respuesta es cómo se recuperan las diagonales. En general, un objeto se puede dividir usando la splitfunción si se le proporciona un objeto que contiene factores en los que se divide el objeto. Para crear estos factores podemos usar coly rowque devuelven una matriz que contiene los índices de columna y fila respectivamente. Al tomar las diferencias: row(m)-col(m)obtenemos una matriz como:

     [,1] [,2] [,3] [,4] [,5]
[1,]    0   -1   -2   -3   -4
[2,]    1    0   -1   -2   -3
[3,]    2    1    0   -1   -2
[4,]    3    2    1    0   -1
[5,]    4    3    2    1    0

en el que cada diagonal se identifica de forma única. Ahora podemos dividirnos en base a esta matriz y convertirla en una lista irregular aplicandosplit :

$`-4`
[1] 1
$`-3`
[1] 2 1 
$`-2`
[1] 3 2 1
$`-1`
[1] 4 3 2 1
$`0`
[1] 5 4 3 2 1
$`1`
[1] 5 4 3 2
$`2`
[1] 5 4 3
$`3`
[1] 5 4
$`4`
[1] 5

(Observe cómo el nombre de cada vector corresponde a los valores diagonales en la matriz anterior).

El último paso es simplemente aplanar y convertirlo en una matriz de la forma:

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    1    3    2
[2,]    1    4    3    2    1
[3,]    5    4    3    2    1
[4,]    5    4    3    2    5
[5,]    4    3    5    4    5

0

Mathematica 93 Bytes

Partition[Flatten[Table[If[i>n,#[[n;;(i-n+1);;-1]],#[[i;;1;;-1]]],{i,1,2(n=Length@#)-1}]],n]&

Así es como normalmente escribiría este código (109 Bytes):

Partition[Reverse@Flatten[Table[Reverse@Diagonal[ConstantArray[Reverse@#,n],k],{k,-(n=Length@#)+1,n-1}]],n]&

Este diagrama matricial da una buena idea de la estructura debido a un vector de entrada secuencialmente creciente.

ingrese la descripción de la imagen aquí

Aquí está la gráfica de matriz con un vector de entrada aleatorio. Obviamente, todavía existe alguna estructura.

ingrese la descripción de la imagen aquí


0

Mathematica, 92 bytes

n=NestList[#2,(r=Reverse)@#,(l=Length@#)-1]&;{Most@r[#~n~Rest],#~n~Most}~ArrayReshape~{l,l}&

Función sin nombre que toma una lista como argumento. Puede haber otras estructuras para tal función, pero espero haber jugado bastante bien esta estructura ...

La primera parte n=NestList[#2,(r=Reverse)@#,(l=Length@#)-1]&define una función nde dos argumentos: la primera es una lista de longitud ly la segunda es una función para aplicar a las listas. naplica los l-1tiempos de esa función a la lista de argumentos invertidos, guardando todos los resultados en su lista de salida. (Definir ry len el camino es solo jugar al golf).

nse llama dos veces en la lista original, una vez con la función Rest(descartar el primer elemento de la lista) y una vez con la función ser Most(descartar el último elemento). Esto produce todas las sublistas deseadas, pero la lista completa está allí dos veces (de ahí la extra Most) y la primera mitad está en orden inverso (de ahí la r[...]). Finalmente, ~ArrayReshape~{l,l}olvida la estructura de la lista actual y la obliga a ser una matriz lx l.


0

Mathematica, 85 bytes

Realizando literalmente los pasos sugeridos:

(l=Length@#;Partition[Flatten@Table[Reverse@Diagonal[Table[#,l],i],{i,-l+1,l-1}],l])&

Mi instinto dice que debería haber una forma inteligente de usar Partpara hacer esto más corto, pero cada intento que hice fue más largo que 85 bytes.


0

Rubí (110 bytes)

n=a.size
b=[*(0...n)]
b.product(b).group_by{|i,j|i+j}.flat_map{|_,f|f.sort.map{|i,j|a[i][j]}}.each_slice(n).to_a
  #=> [[1, 2, 1, 3, 2],
  #    [1, 4, 3, 2, 1],
  #    [5, 4, 3, 2, 1],
  #    [5, 4, 3, 2, 5],
  #    [4, 3, 5, 4, 5]]

los sort posible que la operación no sea necesaria, pero el documento para Enumerable # group_by no garantiza el orden de los valores en los valores hash (que son matrices), pero las versiones actuales de Ruby proporcionan el orden que uno esperaría y el orden que necesitaría si sortfuera eliminado de mi código.

Los pasos son los siguientes.

n=a.size 
  #=> 5 
b=[*(0...n)]
  #=> [0, 1, 2, 3, 4] 
c = b.product(b)
  #=> [[0, 0], [0, 1], [0, 2], [0, 3], [0, 4], [1, 0], [1, 1], [1, 2], [1, 3],
  #    [1, 4], [2, 0], [2, 1], [2, 2], [2, 3], [2, 4], [3, 0], [3, 1], [3, 2],
  #    [3, 3], [3, 4], [4, 0], [4, 1], [4, 2], [4, 3], [4, 4]] 
d=c.group_by{|i,j|i+j}
  #=> {0=>[[0, 0]],
  #    1=>[[0, 1], [1, 0]],
  #    2=>[[0, 2], [1, 1], [2, 0]],
  #    3=>[[0, 3], [1, 2], [2, 1], [3, 0]],
  #    4=>[[0, 4], [1, 3], [2, 2], [3, 1], [4, 0]],
  #    5=>[[1, 4], [2, 3], [3, 2], [4, 1]],
  #    6=>[[2, 4], [3, 3], [4, 2]],
  #    7=>[[3, 4], [4, 3]],
  #    8=>[[4, 4]]} 
e=d.flat_map{|_,f|f.sort.map{|i,j|a[i][j]}}
  #=> [1, 2, 1, 3, 2, 1, 4, 3, 2, 1, 5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5] 
f=e.each_slice(n)
  #=> #<Enumerator: [1, 2, 1, 3, 2, 1, 4, 3, 2, 1, 5, 4, 3, 2, 1, 5, 4, 3, 2,
  #                  5, 4, 3, 5, 4, 5]:each_slice(5)>

Por último, f.to_adevuelve la matriz mostrada anteriormente.

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.