配列を真ん中から印刷する


10

これはコードゴルフの質問です。

与えられた整数sおよびnは、-sからsまでの値を取る長さnのすべての配列を出力することです。唯一の工夫は、次の順序で出力する必要があることです。

  • 長さがnのすべてゼロの配列。
  • 以前に出力した配列を除く、要素が-1から1までの長さnのすべての配列。
  • 以前に出力した配列を除く、-2〜2の要素を持つ長さnのすべての配列。
  • そして、前に出力した配列を除いて-sからsまでの要素を持つ長さnのすべての配列に到達するまで続けます。

1行に1つの配列を出力する必要があります。スペースまたはカンマで区切ることができます。

以下は、配列/リスト/タプルを正しい順序で出力する非準拠のpythonコードです。

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 2016年

@ 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、2番目は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

Haskell、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 2016年

@xnor:はい。ありがとう!
nimi 2016年

2

Mathematica、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

JavaScript(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.