Saltando em uma matriz


25

Introdução

As matrizes também podem ser vistas como um campo para uma bola quicando. Claro que isso parece muito vago, então aqui está um exemplo de uma 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]

O desafio é gerar as matrizes devolvidas . Eles são feitos de padrões diagonais que saltam nas bordas do campo. Este caminho está apontado para cima . O caminho para a primeira matriz devolvida (na qual o caminho é devolvido diretamente do egde) é:

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

Da esquerda para a direita, isso resultaria em [1, 8, 3, 6, 5, 4, 7, 2, 9]. Esta é a nossa primeira matriz devolvida. O caminho para a segunda matriz devolvida:

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

Isso resulta em [9, 2, 7, 4, 5, 6, 3, 8, 1]. O caminho para a terceira matriz devolvida é:

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

Isso resulta em [1, 8, 3, 6, 5, 4, 7, 2, 9]. Portanto, as três matrizes devolvidas são:

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

Tarefa

Dado pelo menos 1 array contendo apenas números inteiros não negativos, com todas as matrizes tendo o mesmo comprimento, produza todas as matrizes devolvidas.

Casos de teste

Caso de teste 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]

Isso é , então a submissão com a menor quantidade de bytes ganha!


2
Jelly ganha isso.
precisa saber é o seguinte

Você pode adicionar um caso de teste de três matrizes, onde o último array é diferente do primeiro e um caso de teste de quatro matrizes?
ETHproductions

1
Não consigo encontrar a descrição do problema. Alguém pode me dizer onde fica?
feersum

Sim. Não consigo encontrar uma descrição da tarefa.
feersum

1
@LuisMendo é a única forma de salto, na linha 0 não pode subir mais
edc65

Respostas:


7

Pitão, 17 bytes

>lQC.e.>bkC+_PtQQ

Explicação:

                      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

Experimente aqui .


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

TESTE

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>


3

CJam, 31 30 bytes

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

Entrada e saída como uma lista de matrizes no estilo CJam.

Teste aqui.

Definitivamente jogável ...


3

Geléia, 29 25 24 bytes

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

Obrigado pelo @ Sp3000 por me ajudar a jogar fora 5 bytes!

Experimente online!


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}}}

Provavelmente isso poderia ser muito melhor. Eu vou descobrir o quanto mais tarde!


2

Japt, 55 49 41 39 bytes

Uau, isso foi realmente complicado e incrivelmente divertido.

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

Teste online!

Saídas na ordem inversa aos exemplos. Isso quebrará um pouco nas entradas de mais de 100 matrizes; espero que isso não faça muita diferença.

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

Versão não concorrente, 36 bytes

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

Eu havia implementado essas duas funções numéricas antes do desafio:

  • ò- igual a o, mas retorna em [X..Y]vez de[X..Y)
  • ó- igual a o, mas retorna em [X..X+Y)vez de[X..Y)

Mas devido a um local errado 0, eles eram de buggy e sempre retornavam matrizes vazias. Isso foi consertado agora.

Teste online!


2

Python 2, 107 106 108 105 104 bytes

(Caiu algumas parênteses extras) (Localização inicial incorreta (ب_ب)) (já tinha uma lista desse tamanho)

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

É legal ter a entrada como argumento para uma função, certo? Esta é minha primeira vez enviando minha resposta de código de golfe.


Sim, é :) legal
Adnan

1

APL, 33 caracteres

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

Suponha ⎕IO ← 0. A ideia é que o movimento de salto possa ser obtido com um simples deslocamento para cima de uma matriz, se a matriz original for aumentada ao longo da primeira dimensão com a matriz invertida com a primeira e a última linha raspada. Graficamente:

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

a partir de

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

Em APL reversee upward rotatesão o mesmo símbolo: .


USE O PRIMEIRO STEFANO. em vez de 0⌷.
Zacharý

Receio que "first" e "0⌷" dêem dois resultados muito diferentes quando aplicados a uma matriz aninhada. Experimente você mesmo. Primeiro vs. 0⌷
lstefano 2/17/17

1

Clojure, 125 bytes

Uau, este caracteres acumulados 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))))))))))

Apenas tentando salvar bytes, letdefinindo os valores usados ​​com freqüência.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.