Imprimir matrices desde la mitad

10

Esta es una pregunta de código de golf.

Dados los enteros syn, la tarea es generar todas las matrices de longitud n que toman valores de -s a s. El único giro es que debe generarlos en el siguiente orden.

  • La matriz de ceros de longitud n.
  • Todas las matrices de longitud n con elementos de -1 a 1, excluyendo cualquier matriz que haya generado anteriormente.
  • Todas las matrices de longitud n con elementos de -2 a 2, excluyendo cualquier matriz que haya generado anteriormente.
  • Y así sucesivamente hasta llegar a todas las matrices de longitud n con elementos de -s a s, excluyendo cualquier matriz que haya generado anteriormente.

Debe generar una matriz por línea. Pueden ser espacios o comas separados.

Aquí hay un código de Python que no cumple con los requisitos que genera las matrices / listas / tuplas en el orden correcto.

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 (y un voto positivo de mi parte) para las respuestas que no realizan restas establecidas o equivalentes.

Martin Ender
fuente
1
¿Podemos escribir una función que imprima el resultado?
LegionMammal978
@ LegionMammal978 Preferiría un programa completo. Si esto se considera seriamente controvertido
¿Hay algún pedido requerido dentro de cada uno de sus puntos?
Martin Ender
@ MartinBüttner No, en absoluto.

Respuestas:

6

Jalea, 9 bytes

NRṗµAṀ€Ụị

No se utilizó ninguna resta de lista en la realización de esta publicación. Pruébalo en línea!

Cómo funciona

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.
Dennis
fuente
¡Ahora se está volviendo tonto!
2
"No se perjudicaron las listas en la realización de esta publicación"
Dennis van Gils
6

MATL , 18 bytes

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

La primera entrada es s, la segunda esn

Esto funciona en la versión actual (15.0.0) del lenguaje.

Pruébalo en línea!

Explicación

_      % 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
Luis Mendo
fuente
1
18 bytes es indignante :)
4

Haskell, 61 60 bytes

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

Ejemplo de uso: 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]].

Cómo funciona:

   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

Editar: @xnor a cabo en punta que mapM ides sequence.

nimi
fuente
mapM ides más corto que sequence.
xnor
@xnor: Cierto. ¡Gracias!
nimi
2

Mathematica, 83 bytes

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

Para usar, ingrese un script e ingrese nluego sen líneas separadas. Imprime cada matriz como una lista delimitada por comas entre corchetes (por ejemplo, {-1, 0, 1}). Funciona tomando cada lista de longitud ncon números entre [-cur..cur], e imprimiendo los que incluyen -curo cur. Luego repite esto para todos curadentro [0..s]. (¡Esta publicación contiene 19 caracteres!)

LegionMammal978
fuente
1

JavaScript (SpiderMonkey 30+), 134 bytes

(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))):[[]]

Utiliza el enfoque cartesiano de poder y clasificación, que pensé por separado, pero estaba recompilando SpiderMonkey en ese momento, así que no pude responder esto antes de @Dennis.

Neil
fuente