Array cetak dari tengah ke luar

10

Ini adalah pertanyaan kode-golf.

Diberikan bilangan bulat s dan n tugasnya adalah untuk mengeluarkan semua larik panjang n yang mengambil nilai dari -s ke s. Satu-satunya twist adalah bahwa Anda harus menampilkannya dalam urutan berikut.

  • Seluruh nol array panjang n.
  • Semua array panjang n dengan elemen dari -1 hingga 1 tidak termasuk array yang telah Anda hasilkan sebelumnya.
  • Semua array panjang n dengan elemen dari -2 hingga 2 tidak termasuk array yang telah Anda hasilkan sebelumnya.
  • Dan seterusnya sampai Anda mendapatkan semua array dengan panjang n dengan elemen dari -s ke s tidak termasuk array yang telah Anda hasilkan sebelumnya.

Anda harus menampilkan satu array per baris. Mereka bisa terpisah ruang atau koma.

Berikut adalah beberapa kode python yang tidak patuh yang menampilkan array / daftar / tupel dalam urutan yang benar.

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

Kemuliaan ekstra (dan upvote dari saya) untuk jawaban yang tidak melakukan pengurangan set atau setara.

Martin Ender
sumber
1
Bisakah kita menulis fungsi yang mencetak hasilnya?
LegionMammal978
@ LegionMammal978 Saya lebih suka program yang lengkap. Jika ini dianggap sangat kontroversial saya akan menyerah tentu saja :)
Apakah ada pesanan yang diperlukan dalam masing-masing poin Anda?
Martin Ender
@ MartinBüttner Tidak, tidak sama sekali.

Jawaban:

6

Jelly, 9 byte

NRṗµAṀ€Ụị

Tidak ada pengurangan daftar yang digunakan dalam pembuatan posting ini. Cobalah online!

Bagaimana itu bekerja

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
sumber
Sekarang semakin konyol!
2
"Tidak ada daftar yang dirugikan dalam pembuatan pos ini"
Dennis van Gils
6

MATL , 18 byte

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

Input pertama adalah s, kedua adalahn

Ini berfungsi dalam versi bahasa saat ini (15.0.0) .

Cobalah online!

Penjelasan

_      % 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
sumber
1
18 byte memalukan :)
4

Haskell, 61 60 byte

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

Contoh penggunaan: 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]].

Bagaimana itu bekerja:

   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 keluar menunjuk bahwa mapM idadalah sequence.

nimi
sumber
mapM idlebih pendek dari sequence.
xnor
@ xnor: Benar. Terima kasih!
nimi
2

Mathematica, 83 byte

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

Untuk menggunakan, masukkan skrip dan masukan nkemudian spada baris yang terpisah. Mencetak setiap larik sebagai daftar yang dikurung kurawal, dibatasi koma (misalnya, {-1, 0, 1}). Ini bekerja dengan mengambil setiap daftar panjang ndengan angka di antara [-cur..cur], dan dan mencetak yang termasuk salah satu -curatau cur. Kemudian mengulangi ini untuk semua curdi [0..s]. (Posting ini berisi 19 `karakter!)

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

Menggunakan pendekatan cartesian-power-and-sort, yang saya pikirkan secara terpisah, tetapi saya sedang mengkompilasi ulang SpiderMonkey pada saat itu sehingga saya tidak dapat menjawab ini sebelum @ Dennis.

Neil
sumber