Rimbalzare in un array


25

introduzione

Le matrici possono anche essere viste come un campo per una palla che rimbalza. Questo ovviamente suona molto vago, quindi ecco un esempio di input:

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

La sfida è quella di produrre gli array rimbalzati . Questi sono fatti da motivi diagonali che rimbalzano ai bordi del campo. Questo percorso è rivolto verso l' alto . Il percorso per il primo array rimbalzato (in cui il percorso viene rimbalzato direttamente dall'egde) è:

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

Da sinistra a destra, ciò comporterebbe [1, 8, 3, 6, 5, 4, 7, 2, 9]. Questo è il nostro primo array rimbalzato. Il percorso per il secondo array rimbalzato:

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

Ciò si traduce in [9, 2, 7, 4, 5, 6, 3, 8, 1]. Il percorso per il terzo array rimbalzato è:

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

Ciò si traduce in [1, 8, 3, 6, 5, 4, 7, 2, 9]. Quindi i tre array rimbalzati sono:

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

Compito

Dato almeno 1 array contenente solo numeri interi non negativi, con tutti gli array con la stessa lunghezza, vengono emessi tutti gli array rimbalzati.

Casi test

Caso di prova 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]

Questo è , quindi vince l'invio con il minor numero di byte!


2
Jelly vince questo.
lirtosiast,

Potete per favore aggiungere un testcase a tre array in cui l'ultimo array è diverso dal primo e un testcase a quattro array?
ETHproductions

1
Non riesco a trovare la descrizione del problema. Qualcuno può dirmi dove si trova?
feersum

Sì. Non riesco a trovare una descrizione dell'attività.
feersum

1
@LuisMendo è l'unico modo per rimbalzare, alla linea 0 non può salire di più
edc65

Risposte:


7

Pyth, 17 byte

>lQC.e.>bkC+_PtQQ

Spiegazione:

                      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

Provalo qui .


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

TEST

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 byte

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

Input e output come un elenco di array in stile CJam.

Provalo qui.

Sicuramente golfabile ...


3

Gelatina, 29 25 24 byte

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

Grazie per @ Sp3000 per avermi aiutato a giocare a golf con 5 byte!

Provalo online!


2

Rubino (2.2.2p95), 124 byte

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

Questo potrebbe probabilmente essere molto meglio. Capirò come dopo!


2

Japt, 55 49 41 39 byte

Wow, è stato sia davvero complicato che follemente divertente.

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

Provalo online!

Emette in ordine inverso agli esempi. Ciò si interromperà leggermente sugli input di oltre 100 array; speriamo che questo non faccia troppa differenza.

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

Versione non competitiva, 36 byte

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

Prima della sfida avevo implementato queste due funzioni numeriche:

  • ò- uguale a o, ma restituisce [X..Y]invece di[X..Y)
  • ó- uguale a o, ma restituisce [X..X+Y)invece di[X..Y)

Ma a causa di una posizione fuori posto 0, erano difettosi e restituivano sempre array vuoti. Questo è stato risolto.

Provalo online!


2

Python 2, 107 106 108 105 104 byte

(Sono saltate alcune parentesi extra) (Posizione di partenza errata (ب_ب)) (aveva già un elenco di quella lunghezza)

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

È legale avere l'input come argomento per una funzione, giusto? Questa è la prima volta che invio la mia risposta di golf del codice.


Sì, è legale :)
Adnan,

1

APL, 33 caratteri

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

Assumi ⎕IO ← 0. L'idea è che il movimento di rimbalzo può essere ottenuto semplicemente spostando verso l'alto di una matrice, se la matrice originale viene aumentata lungo la prima dimensione con la matrice invertita con la sua prima e ultima riga rasate. Graficamente:

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

a partire dal

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

In APL reversee upward rotatesono lo stesso simbolo: .


USA IL PRIMO STEFANO. invece di 0⌷.
Zacharý,

Temo che "first" e "0⌷" forniscano due risultati molto diversi se applicati a un array nidificato. Provalo tu stesso. Primo vs. 0⌷
lstefano il

1

Clojure, 125 byte

Caspita, questo ha accumulato personaggi abbastanza velocemente.

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

Sto solo cercando di salvare byte di letSto definendo i valori usati di frequente.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.