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!

Adnan
fonte
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 .

lirtosiast
fonte
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>

edc65
fonte
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 ...

Martin Ender
fonte
3

Geléia, 29 25 24 bytes

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

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

Experimente online!

Dennis
fonte
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!

Connor Clark
fonte
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!

ETHproductions
fonte
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.

Orez
fonte
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: .

lstefano
fonte
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.

NikoNyrh
fonte
0

Gelatina *, 15 bytes

JṚŒḄṖṙ’Ʋị⁸Jị"$€

Experimente online!

* Versão mais recente

Erik, o Outgolfer
fonte