가운데에서 배열을 인쇄


10

이것은 코드 골프 질문입니다.

주어진 정수 s와 n은 -s에서 s까지 값을 취하는 길이 n의 모든 배열을 출력하는 것입니다. 유일한 순서는 다음 순서로 출력해야한다는 것입니다.

  • 길이가 n 인 모든 0 배열.
  • 이전에 출력 한 배열을 제외하고 -1에서 1까지의 요소가있는 길이 n의 모든 배열.
  • 이전에 출력 한 배열을 제외하고 -2에서 2까지의 요소가있는 길이 n의 모든 배열.
  • 그리고 이전에 출력 한 배열을 제외하고 -s에서 s까지의 요소가있는 길이 n의 모든 배열에 도달 할 때까지 계속됩니다.

한 줄에 하나의 배열을 출력해야합니다. 공백이나 쉼표로 구분할 수 있습니다.

다음은 배열 / 목록 / 튜플을 올바른 순서로 출력하는 비준수 파이썬 코드입니다.

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

정해진 뺄셈이나 그에 상응하는 것을 수행하지 않는 답변에 대한 여분의 영광 (그리고 나에게 찬성).


1
결과를 인쇄하는 함수를 작성할 수 있습니까?
LegionMammal978

@ LegionMammal978 완전한 프로그램을 선호합니다. 이것이 심각하게 논란의 여지가있는 것으로

각 글 머리 기호 내에 필요한 순서가 있습니까?
Martin Ender

@ MartinBüttner 아니오, 전혀 아닙니다.

답변:


6

젤리, 9 바이트

NRṗµAṀ€Ụị

이 게시물을 만들 때 목록 빼기가 사용되지 않았습니다. 온라인으로 사용해보십시오!

작동 원리

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.

이제는 어리석어지고 있습니다!

2
"이 게시물을 만들 때 어떤 목록도 손상되지 않았습니다"
Dennis van Gils

6

MATL , 18 바이트

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

첫 번째 입력은 s이고 두 번째 입력 은n

이 언어의 현재 버전 (15.0.0) 에서 작동 합니다.

온라인으로 사용해보십시오!

설명

_      % 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 바이트는 터무니 없다 :)

4

하스켈, 61 60 바이트

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

사용 예 : 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]].

작동 방식 :

   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

편집 : @xnor 지적 밖으로 mapM id이다 sequence.


mapM id보다 짧습니다 sequence.
xnor

@ xnor : 맞습니다. 감사!
nimi

2

수학, 83 바이트

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

사용하려면, 스크립트 및 입력에 넣어 ns별도의 줄에. 각 배열을 괄호로 묶은 쉼표로 구분 된 목록으로 인쇄합니다 (예 :) {-1, 0, 1}. 그것은 길이의 모든 목록을 복용에 의해 작동 n사이의 숫자를 [-cur..cur]하고, 그리고 중 하나를 포함하는 그 인쇄 -cur또는 cur. 그런 다음에서 모두 cur를 위해 이것을 반복합니다 [0..s]. (이 포스트는 19 개의`를 포함합니다!)


1

자바 스크립트 (SpiderMonkey 30+), 134 바이트

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

별도로 생각했던 직교-전력-정렬 접근법을 사용하지만 당시에 SpiderMonkey를 다시 컴파일하고 있었기 때문에 @Dennis 이전에는 대답 할 수 없었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.