Drucken Sie Arrays von der Mitte aus

10

Dies ist eine Code-Golf-Frage.

Bei gegebenen ganzen Zahlen s und n besteht die Aufgabe darin, alle Arrays der Länge n auszugeben, die Werte von -s bis s annehmen. Die einzige Wendung ist, dass Sie sie in der folgenden Reihenfolge ausgeben müssen.

  • Das All-Zero-Array der Länge n.
  • Alle Arrays der Länge n mit Elementen von -1 bis 1, ausgenommen alle zuvor ausgegebenen Arrays.
  • Alle Arrays der Länge n mit Elementen von -2 bis 2, ausgenommen alle zuvor ausgegebenen Arrays.
  • Und so weiter, bis Sie zu allen Arrays der Länge n mit Elementen von -s bis s gelangen, mit Ausnahme aller zuvor ausgegebenen Arrays.

Sie sollten ein Array pro Zeile ausgeben. Sie können durch Leerzeichen oder Kommas getrennt sein.

Hier ist ein nicht konformer Python-Code, der die Arrays / Listen / Tupel in der richtigen Reihenfolge ausgibt.

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

Zusätzlicher Ruhm (und eine positive Bewertung von mir) für Antworten, die keine festgelegte Subtraktion oder Äquivalente ausführen.

Martin Ender
quelle
1
Können wir eine Funktion schreiben, die das Ergebnis druckt?
LegionMammal978
@ LegionMammal978 Ich würde ein komplettes Programm bevorzugen. Wenn dies als ernsthaft kontrovers angesehen wird, werde ich natürlich nachgeben :)
Gibt es in jedem Ihrer Aufzählungspunkte eine erforderliche Reihenfolge?
Martin Ender
@ MartinBüttner Nein, überhaupt nicht.

Antworten:

6

Gelee, 9 Bytes

NRṗµAṀ€Ụị

Bei der Erstellung dieses Beitrags wurde keine Listensubtraktion verwendet. Probieren Sie es online aus!

Wie es funktioniert

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
quelle
Jetzt wird es nur noch albern!
2
"Bei der Erstellung dieses Beitrags wurden keine Listen beschädigt"
Dennis van Gils
6

MATL , 18 Bytes

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

Die erste Eingabe ist s, die zweite istn

Das funktioniert in aktuellen Version (15.0.0) der Sprache.

Probieren Sie es online aus!

Erläuterung

_      % 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
quelle
1
18 Bytes ist unverschämt :)
4

Haskell, 61 60 Bytes

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

Anwendungsbeispiel: 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]] .

Wie es funktioniert:

   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 darauf hingewiesen , dass mapM idist sequence.

Nimi
quelle
mapM idist kürzer als sequence.
xnor
@xnor: Stimmt. Vielen Dank!
Nimi
2

Mathematica, 83 Bytes

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

Gebrauch, setzte in einem Skript und Eingabe ndann sin separaten Zeilen. Druckt jedes Array als durch Kommas getrennte Liste in geschweiften Klammern (z {-1, 0, 1}. B. ). Es funktioniert, indem jede Längenliste nmit Zahlen zwischen [-cur..cur]und diejenigen gedruckt wird, die entweder -curoder enthalten cur. Es wiederholt dies dann für alle curin [0..s]. (Dieser Beitrag enthält 19 `Zeichen!)

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

Verwendet den kartesischen Power-and-Sort-Ansatz, an den ich separat gedacht habe, aber ich habe SpiderMonkey zu diesem Zeitpunkt neu kompiliert, sodass ich dies vor @Dennis nicht beantworten konnte.

Neil
quelle