Imprimer des tableaux du milieu vers l'extérieur

10

C'est une question de code-golf.

Étant donné les entiers s et n, la tâche consiste à sortir tous les tableaux de longueur n qui prennent des valeurs de -s à s. La seule torsion est que vous devez les sortir dans l'ordre suivant.

  • Le tableau de tous les zéros de longueur n.
  • Tous les tableaux de longueur n avec des éléments de -1 à 1, à l'exclusion de tout tableau que vous avez sorti auparavant.
  • Tous les tableaux de longueur n avec des éléments de -2 à 2, à l'exception de tout tableau que vous avez sorti auparavant.
  • Et ainsi de suite jusqu'à ce que vous arriviez à tous les tableaux de longueur n avec des éléments de -s à s, à l'exclusion de tout tableau que vous avez sorti auparavant.

Vous devez générer un tableau par ligne. Ils peuvent être séparés par des espaces ou des virgules.

Voici un code python non conforme qui génère les tableaux / listes / tuples dans le bon ordre.

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

Une gloire supplémentaire (et un vote positif de ma part) pour les réponses qui n'effectuent aucune soustraction d'ensemble ou équivalent.

Martin Ender
la source
1
Peut-on écrire une fonction qui imprime le résultat?
LegionMammal978
@ LegionMammal978 Je préférerais un programme complet. Si cela est jugé sérieusement controversé, je donnerai bien sûr :)
Y a-t-il un ordre requis dans chacun de vos puces?
Martin Ender
@ MartinBüttner Non, pas du tout.

Réponses:

6

Gelée, 9 octets

NRṗµAṀ€Ụị

Aucune soustraction de liste n'a été utilisée dans la rédaction de ce message. Essayez-le en ligne!

Comment ça fonctionne

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
la source
Maintenant, ça devient ridicule!
2
"Aucune liste n'a été endommagée lors de la rédaction de ce message"
Dennis van Gils
6

MATL , 18 octets

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

La première entrée est s, la seconde estn

Cela fonctionne dans la version actuelle (15.0.0) de la langue.

Essayez-le en ligne!

Explication

_      % 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
la source
1
18 octets est scandaleux :)
4

Haskell, 61 60 octets

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

Exemple d'utilisation: 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]].

Comment ça fonctionne:

   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

Edit: @xnor a fait remarquer que mapM idest sequence.

nimi
la source
mapM idest plus court que sequence.
xnor
@xnor: Vrai. Merci!
nimi
2

Mathematica, 83 octets

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

Pour l'utiliser, mettez un script et entrez nensuite ssur des lignes distinctes. Imprime chaque tableau comme une liste entre crochets et délimitée par des virgules (par exemple, {-1, 0, 1}). Il fonctionne en prenant chaque liste de longueur navec des nombres entre [-cur..cur]et en imprimant ceux qui incluent soit -curou cur. Il répète ensuite cela pour tous curdans [0..s]. (Ce message contient 19 caractères!)

LegionMammal978
la source
1

JavaScript (SpiderMonkey 30+), 134 octets

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

Utilise l'approche cartésienne du pouvoir et du tri, à laquelle j'ai pensé séparément, mais je recompilais SpiderMonkey à l'époque, donc je ne pouvais pas répondre à cela avant @Dennis.

Neil
la source