Stampa array dal centro


10

Questa è una domanda di code-golf.

Dati numeri interi s e n il compito è quello di produrre tutti gli array di lunghezza n che assumono valori da -s a s. L'unica svolta è che è necessario emetterli nel seguente ordine.

  • La matrice di tutti zeri di lunghezza n.
  • Tutti gli array di lunghezza n con elementi da -1 a 1 escluso qualsiasi array che è stato emesso in precedenza.
  • Tutti gli array di lunghezza n con elementi da -2 a 2 escluso qualsiasi array che è stato emesso in precedenza.
  • E così via fino ad arrivare a tutti gli array di lunghezza n con elementi da -s a s escluso qualsiasi array che hai emesso in precedenza.

Dovresti produrre un array per riga. Possono essere separati da spazio o virgola.

Ecco un codice Python non conforme che genera le matrici / liste / tuple nell'ordine giusto.

import itertools

s =  3
n = 2

oldsofar = set()
newsofar = set()
for i in xrange(s):
    for k in itertools.product(range(-i,i+1), repeat = n):
        newsofar.add(k)
    print newsofar - oldsofar
    oldsofar = newsofar.copy()
    print "***"

Gloria extra (e un mio voto) per le risposte che non eseguono alcuna sottrazione stabilita o equivalente.


1
Possiamo scrivere una funzione che stampa il risultato?
LegionMammal978,

@ LegionMammal978 Preferirei un programma completo. Se questo è ritenuto gravemente controverso, lo darò ovviamente :)

C'è un ordine richiesto all'interno di ciascuno dei tuoi punti elenco?
Martin Ender,

@ MartinBüttner No, per niente.

Risposte:


6

Gelatina, 9 byte

NRṗµAṀ€Ụị

Nessuna sottrazione di elenco è stata utilizzata nella realizzazione di questo post. Provalo online!

Come funziona

NRṗµAṀ€Ụị  Main link. Arguments: s, n

N          Negate; yield -s.
 R         Range; yield [-s, ..., s].
  ṗ        Cartesian power; push all vectors of length n of those elements.
   µ       Begin a new, monadic link. Argument: L (list of vectors)
    A      Compute the absolute values of all vector components.
     Ṁ€    Get the maximum component of each vector.
       Ụ   Sort the indices of A according to the maximal absolute value of the
           corresponding vector's components.
        ị  Retrieve the vectors of A at those indices.

Ora sta diventando sciocco!

2
"Nessun elenco è stato danneggiato nella realizzazione di questo post"
Dennis van Gils,

6

MATL , 18 byte

_G2$:iZ^t!|X>4#SY)

Il primo input è s, il secondo èn

Funziona con la versione corrente (15.0.0) della lingua.

Provalo online!

Spiegazione

_      % take input s implicitly. Negate to obtain -s
G      % push input s again
2$:    % inclusive range from -s to s
i      % take input n
Z^     % Cartesian power. Gives 2D array, with each result on a row
t!     % duplicate and transpose
|      % absolute value
X>     % maximum of each column 
4#S    % sort and push the indices of the sorting
Y)     % apply as row indices into the 2D array. Display implicitly

1
18 byte è scandaloso :)

4

Haskell, 61 60 byte

n#s=[c|b<-[0..s],c<-mapM id$[-b..b]<$[1..n],any((b==).abs)c]

Esempio di utilizzo: 2#2-> [[0,0],[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1],[-2,-2],[-2,-1],[-2,0],[-2,1],[-2,2],[-1,-2],[-1,2],[0,-2],[0,2],[1,-2],[1,2],[2,-2],[2,-1],[2,0],[2,1],[2,2]].

Come funziona:

   b<-[0..s]                           -- loop b through 0 .. s
        c<-mapM id$[-b..b]<$[1..n]     -- loop c through all lists of length n
                                       -- made out of the numbers -b .. b
                                       -- ("[-b..b]<$[1..n]" is "replicate n [-b..b]";
                                       --  "mapM id" is "sequence")
[c|                 ,any((b==).abs)c]  -- keep c if it contains b or -b

Modifica: @xnor ha sottolineato che lo mapM idè sequence.


mapM idè più corto di sequence.
xnor

@xnor: True. Grazie!
nimi

2

Mathematica, 83 byte

Print/@Select[Range[-#,b=#]~Tuples~a,Abs@#~MemberQ~b&]&/@Range[0,a=Input[];Input[]]

Per usare, inserisci uno script e inseriscilo nquindi ssu righe separate. Stampa ogni array come un elenco tra parentesi graffe, delimitato da virgole (ad es {-1, 0, 1}.). Funziona prendendo ogni elenco di lunghezza ncon numeri tra [-cur..cur]e e stampando quelli che includono -curo cur. Quindi ripete questo per all curin [0..s]. (Questo post contiene 19 `personaggi!)


1

JavaScript (SpiderMonkey 30+), 134 byte

(s,n)=>n?[for(a of f(s,n-1))for(i of Array(s*2+1).keys())[i-n,...a]].sort((a,b)=>g(a)-g(b),g=a=>Math.max(...a,-Math.min(...a))):[[]]

Utilizza l'approccio cartesiano del potere e dell'ordinamento, che ho pensato separatamente, ma al momento stavo ricompilando SpiderMonkey, quindi non sono stato in grado di rispondere prima di @Dennis.

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.