Rebotando en una matriz

25

Introducción

Las matrices también se pueden ver como un campo para una pelota que rebota. Por supuesto, esto suena muy vago, así que aquí hay un ejemplo de una entrada:

[1, 2, 3, 4, 5, 6, 7, 8, 9]
[9, 8, 7, 6, 5, 4, 3, 2, 1]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

El desafío es generar las matrices devueltas . Estos están hechos de patrones diagonales que rebotan en los bordes del campo. Este camino apunta hacia arriba . La ruta para la primera matriz rebotada (en la que la ruta se rebota directamente del egde) es:

[1, -, -, -, 5, -, -, -, 9]
[-, 8, -, 6, -, 4, -, 2, -]
[-, -, 3, -, -, -, 7, -, -]

De izquierda a derecha, esto resultaría en [1, 8, 3, 6, 5, 4, 7, 2, 9]. Este es nuestro primer conjunto rebotado. La ruta para la segunda matriz rebotada:

[-, 2, -, -, -, 6, -, -, -]
[9, -, 7, -, 5, -, 3, -, 1]
[-, -, -, 4, -, -, -, 8, -]

Esto da como resultado [9, 2, 7, 4, 5, 6, 3, 8, 1]. La ruta para el tercer conjunto rebotado es:

[-, -, 3, -, -, -, 7, -, -]
[-, 8, -, 6, -, 4, -, 2, -]
[1, -, -, -, 5, -, -, -, 9]

Esto da como resultado [1, 8, 3, 6, 5, 4, 7, 2, 9]. Entonces las tres matrices devueltas son:

[1, 8, 3, 6, 5, 4, 7, 2, 9]
[9, 2, 7, 4, 5, 6, 3, 8, 1]
[1, 8, 3, 6, 5, 4, 7, 2, 9]

Tarea

Dado que al menos 1 matriz contiene solo enteros no negativos, con todas las matrices que tienen la misma longitud, genera todas las matrices devueltas.

Casos de prueba

Caso de prueba 1:

Input:                       Output:
[1, 2, 3, 4, 5]              [1, 7, 3, 9, 5]
[6, 7, 8, 9, 0]              [6, 2, 8, 4, 0]


Input:                       Output:
[1, 2, 3, 4, 5]              [1, 2, 3, 4, 5]


Input:                       Output:
[0, 0, 0, 0, 0, 0, 0, 0]     [0, 9, 0, 9, 0, 9, 0, 100]
[9, 9, 9, 9, 9, 9, 9, 100]   [9, 0, 9, 0, 9, 0, 9, 0]
[0, 0, 0, 0, 0, 0, 0, 0]     [0, 9, 0, 9, 0, 9, 0, 100]


Input:                       Output:
[0, 1, 2, 3, 4, 5]           [0, 7, 14, 9, 4, 11]
[6, 7, 8, 9, 10, 11]         [6, 1, 8, 15, 10, 5]
[12, 13, 14, 15, 16, 17]     [12, 7, 2, 9, 16, 11]


Input:                       Output:
[0, 0, 0, 0, 0, 0]           [0, 2, 2, 6, 2, 6]
[1, 2, 3, 4, 5, 6]           [1, 0, 3, 2, 5, 2]
[2, 2, 2, 2, 2, 2]           [2, 2, 0, 4, 2, 4]
[9, 8, 7, 6, 5, 4]           [9, 2, 3, 0, 5, 2]

Este es el , por lo que gana el envío con la menor cantidad de bytes.

Adnan
fuente
2
Jelly gana esto.
lirtosiast
¿Puede agregar un caso de prueba de tres conjuntos donde el último conjunto es diferente al primero, y un caso de prueba de cuatro conjuntos?
ETHproductions
1
No puedo encontrar la descripción del problema. ¿Alguien puede decirme dónde está?
feersum
Sí. No puedo encontrar una descripción de la tarea.
fiesta
1
@LuisMendo es la única forma de rebotar, en la línea 0 no puede subir más
edc65

Respuestas:

7

Pyth, 17 bytes

>lQC.e.>bkC+_PtQQ

Explicación:

                      implicit: Q=input
>                     First
  l Q                   len(Q) elements of the
  C .e                  Transpose of enumerated map lambda b,k:
       .>                 Rotate the kth element rightwards by
          b
          k               k.
       C +              Transpose of: Q concatenated to
           _ P t Q        itself reversed without first and last elements.
           Q

Probarlo aquí .

lirtosiast
fuente
7

JavaScript (ES6), 70

a=>a.map((r,k)=>r.map((e,j)=>(a[k-=d]||a[d=-d,k-=d+d]||r)[j],d=1,++k))

PRUEBA

F = a=>a.map((r,k)=>r.map((e,j)=>(a[k-=d]||a[d=-d,k-=d+d]||r)[j],d=1,++k))

test = [{
  I: [
    [1, 2, 3, 4, 5],
    [6, 7, 8, 9, 0]
  ],
  O: [
    [1, 7, 3, 9, 5],
    [6, 2, 8, 4, 0]
  ]
}, {
  I: [
    [1, 2, 3, 4, 5]
  ],
  O: [
    [1, 2, 3, 4, 5]
  ]
}, {
  I: [
    [0, 0, 0, 0, 0, 0, 0, 0],
    [9, 9, 9, 9, 9, 9, 9, 100],
    [0, 0, 0, 0, 0, 0, 0, 0]
  ],
  O: [
    [0, 9, 0, 9, 0, 9, 0, 100],
    [9, 0, 9, 0, 9, 0, 9, 0],
    [0, 9, 0, 9, 0, 9, 0, 100]
  ]
}, {
  I: [
    [0, 1, 2, 3, 4, 5],
    [6, 7, 8, 9, 10, 11],
    [12, 13, 14, 15, 16, 17]
  ],
  O: [
    [0, 7, 14, 9, 4, 11],
    [6, 1, 8, 15, 10, 5],
    [12, 7, 2, 9, 16, 11]
  ]
}, {
  I: [
    [0, 0, 0, 0, 0, 0],
    [1, 2, 3, 4, 5, 6],
    [2, 2, 2, 2, 2, 2],
    [9, 8, 7, 6, 5, 4]
  ],
  O: [
    [0, 2, 2, 6, 2, 6],
    [1, 0, 3, 2, 5, 2],
    [2, 2, 0, 4, 2, 4],
    [9, 2, 3, 0, 5, 2]
  ]
}];

console.log = x => O.textContent += x + '\n';

test.forEach(t => {
  var r = F(t.I),
    ok = r.join `\n` == t.O.join `\n`
  console.log((ok ? 'OK' : 'KO') + '\nInput\n' + t.I.join `\n` + '\nOutput\n' + r.join `\n` + '\n')
})
<pre id=O></pre>

edc65
fuente
3

CJam, 31 30 bytes

q~__W%1>W<+_z,_@*<zee::m>z\,<p

Entrada y salida como una lista de matrices de estilo CJam.

Pruébalo aquí.

Definitivamente golfable ...

Martin Ender
fuente
3

Jalea, 29 25 24 bytes

ṖḊm-³;Z
,ZL€R_€/‘ż€Çị/€€

¡Gracias por @ Sp3000 por ayudarme a jugar golf en 5 bytes!

Pruébalo en línea!

Dennis
fuente
2

Ruby (2.2.2p95), 124 bytes

->*a{b=a.length;b<2?a:b.times.map{|i|d=i>0?-1:1;c=i;a[0].length.times.map{|j|r=a[c][j];c+=d;d*=-1if c==0||c==a.length-1;r}}}

Esto probablemente podría ser mucho mejor. ¡Descubriré cómo más tarde!

Connor Clark
fuente
2

Japt, 55 49 41 39 bytes

Wow, eso fue muy complicado y muy divertido.

C=2*Nl -2Nw £YoY+Ul)£NgLmX%CC-X%C)gY} ·

¡Pruébelo en línea!

Salidas en orden inverso a los ejemplos. Esto se romperá ligeramente en las entradas de más de 100 matrices; Esperemos que esto no haga mucha diferencia.

           // Implicit: N = array of input arrays, U = first input array, J = -1, L = 100
           // Let's use the first example. 3 input arrays, each of length 9.
C=2*Nl -2  // Set variable C to 2*N.length - 2. In the example, C is 4.
Nw      }  // Reverse N and map each index Y to:
YoY+Ul)    //  Create the range [Y...U.length+Y).
           //  The first time through (Y=0), we have   [0, 1, 2, 3, 4, 5, 6, 7, 8]
£       }  //  Map each item X and index Y to:
X%C        //   Take X mod C.                          [0, 1, 2, 3, 0, 1, 2, 3, 0]
C-X%C      //   Take C - (X mod C).                    [4, 3, 2, 1, 4, 3, 2, 1, 4]
Lm         //   Take the minimum of these and 100.     [0, 1, 2, 1, 0, 1, 2, 1, 0]
Ng         //   Get the array at the resulting index.
gY         //   Get the item at index Y in this array. [1, 8, 3, 6, 5, 4, 2, 7, 9]
·          // Join the result with newlines. I guess this isn't necessary, but it helps with readability.

Versión no competitiva, 36 bytes

C=J+Nl)òC±C ®óUl)£NgLmX%CC-X%C)gY} ·

Había implementado estas dos funciones numéricas antes del desafío:

  • ò- igual que o, pero devuelve en [X..Y]lugar de[X..Y)
  • ó- igual que o, pero devuelve en [X..X+Y)lugar de[X..Y)

Pero debido a una ubicación incorrecta 0, tenían errores y siempre devolvían matrices vacías. Esto ahora ha sido arreglado.

¡Pruébelo en línea!

ETHproducciones
fuente
2

Python 2, 107 106 108 105 104 bytes

(Se eliminaron algunos parens adicionales) (Ubicación de inicio incorrecta (ب_ب)) (ya tenía una lista de esa longitud)

def b(a):
 r,e=len(a)-1,enumerate
 print[[a[abs((i-o-r)%(r*2or 1)-r)][i]for i,_ in e(q)]for o,q in e(a)]

Es legal tener la entrada como argumento para una función, ¿verdad? Esta es la primera vez que envío mi código de respuesta de golf.

Orez
fuente
Sí, es legal :)
Adnan
1

APL, 33 caracteres

{(⍳≢⍵){0⌷(⍺-⍳≢⍉⍵)⊖⍵⍪1↓¯1↓⊖⍵}¨⊂↑⍵}

Suponga ⎕IO ← 0. La idea es que el movimiento de rebote se puede obtener mediante un simple desplazamiento hacia arriba de una matriz, si la matriz original se aumenta a lo largo de la primera dimensión con la matriz invertida con su primera y última fila afeitada. Gráficamente:

1 - - - - - 1 - - - -
- 2 - - - 2 - 2 - - -
- - 3 - 3 - - - 3 - 3
- - - 4 - - - - - 4 -

desde

1 - - - - - 1 - - - -
- 2 - - - - - 2 - - -
- - 3 - - - - - 3 - -
- - - 4 - - - - - 4 -
- - - - 3 - - - - - 3
- - - - - 2 - - - - -

En APL reversey upward rotateson el mismo símbolo: .

lstefano
fuente
UTILIZA EL PRIMER STEFANO. en lugar de 0⌷.
Zacharý
Me temo que "primero" y "0⌷" dan dos resultados muy diferentes cuando se aplican a una matriz anidada. Pruébalo por ti mismo. Primero vs. 0⌷
lstefano
1

Clojure, 125 bytes

Wow, esto acumuló personajes bastante rápido.

(fn[v](let[H(count v)r range R(r H)](for[i R](map #((v %2)%)(r(count(v 0)))(drop i(cycle(concat R(reverse(r 1(dec H))))))))))

Solo trato de guardar bytes letdefiniendo valores de uso frecuente.

NikoNyrh
fuente