Mảng in từ giữa ra


10

Đây là một câu hỏi mã-golf.

Cho các số nguyên s và n, nhiệm vụ là xuất ra tất cả các mảng có độ dài n lấy các giá trị từ -s đến s. Nút thắt duy nhất là bạn phải xuất chúng theo thứ tự sau.

  • Các mảng số không có độ dài n.
  • Tất cả các mảng có độ dài n với các phần tử từ -1 đến 1 không bao gồm bất kỳ mảng nào bạn đã xuất ra trước đó.
  • Tất cả các mảng có độ dài n với các phần tử từ -2 đến 2 không bao gồm bất kỳ mảng nào bạn đã xuất ra trước đó.
  • Và cứ như vậy cho đến khi bạn nhận được tất cả các mảng có độ dài n với các phần tử từ -s đến s không bao gồm bất kỳ mảng nào bạn đã xuất ra trước đó.

Bạn nên xuất một mảng trên mỗi dòng. Chúng có thể là không gian hoặc dấu phẩy được phân tách.

Dưới đây là một số mã python không tuân thủ xuất ra các mảng / danh sách / bộ dữ liệu theo đúng thứ tự.

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

Vinh quang thêm (và một upvote từ tôi) cho câu trả lời thực hiện không có phép trừ hoặc tương đương.


1
Chúng ta có thể viết một hàm in kết quả không?
LegionMammal978

@ LegionMammal978 Tôi muốn một chương trình hoàn chỉnh. Nếu điều này được coi là gây tranh cãi nghiêm trọng, tất nhiên tôi sẽ đưa ra :)

Có bất kỳ thứ tự cần thiết trong mỗi điểm đạn của bạn không?
Martin Ender

@ MartinBüttner Không, hoàn toàn không.

Câu trả lời:


6

Thạch, 9 byte

NRṗµAṀ€Ụị

Không có phép trừ danh sách được sử dụng trong việc tạo ra bài đăng này. Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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.

Bây giờ nó chỉ là ngớ ngẩn!

2
"Không có danh sách nào bị tổn hại trong việc tạo ra bài đăng này"
Dennis van Gils

6

MATL , 18 byte

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

Đầu vào là s, thứ hai làn

Điều này hoạt động trong phiên bản hiện tại (15.0.0) của ngôn ngữ.

Hãy thử trực tuyến!

Giải trình

_      % 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 là thái quá :)

4

Haskell, 61 60 byte

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

Ví dụ sử dụng: 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]].

Làm thế nào nó hoạt động:

   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

Chỉnh sửa: @xnor ra nhọn đó mapM idsequence.


mapM idngắn hơn sequence.
xnor

@xnor: Đúng. Cảm ơn!
nimi

2

Toán học, 83 byte

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

Để sử dụng, đặt trong một kịch bản và đầu vào nsau đó strên dòng riêng biệt. In từng mảng dưới dạng một danh sách được phân tách bằng dấu phẩy, được phân cách bằng dấu phẩy (ví dụ {-1, 0, 1}:). Nó hoạt động bằng cách lấy mọi danh sách độ dài nvới các số ở giữa [-cur..cur]và in những cái có chứa -curhoặc cur. Sau đó nó lặp lại điều này cho tất cả curtrong [0..s]. (Bài đăng này chứa 19 `ký tự!)


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

Sử dụng cách tiếp cận cartesian-power-and-sort, mà tôi nghĩ riêng, nhưng tôi đã biên dịch lại SpiderMonkey vào thời điểm đó nên tôi không thể trả lời điều này trước @Dennis.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.