Nで満たされたN次元N ^ N配列


62

In:  十分なメモリと正の整数N

Out:  Nで埋められたN次元のN ^ N配列、ここでN ^ NはN行N列N列のN項を意味します...

例:

1:[1]長さ1の1D配列(リスト)で、単一の1を含む

2:[[2,2],[2,2]]2行2列の2D配列(テーブル)で、2で埋められます

3:[[[3,3,3],[3,3,3],[3,3,3]],[[3,3,3],[3,3,3],[3,3,3]],[[3,3,3],[3,3,3],[3,3,3]]]これは、3つのレイヤー、3行、3列で構成され、3で満たされた3D配列(立方体)です

4: [[[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]]],[[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]]],[[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]]],[[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]]]]

5と6:答えの1つをご覧ください。


私たちの言語が配列をサポートしていない場合、受け入れられる出力形式は何でしょうか?
Okx

17
「十分なメモリ」は入力の一部であるため、実際にメモリを入力として使用し、それを使用する前にプラグインするようにロボットを制御する答えを見たいと思います。
user2357112

1
すべての配列は個別のオブジェクトである必要がありますか?
ニール

1
@ user2357112それはもっと前提条件タイプの問題だと思います。opは、関数が入力としてメモリを受け入れることを実際に期待しているとは思わない。
グレートダック

2
@TheGreatDuck正しいですが、user2357112は冗談だと確信しています。
アダム

回答:


50

Python、32バイト

lambda n:eval('['*n+'n'+']*n'*n)

オンラインでお試しください!

multiplcationsのような文字列"[[[n]*n]*n]*n"n作成し、Pythonコードとして評価します。評価は関数スコープ内で行われるため、変数名nは関数入力に評価されます。


3
スコープトリックは天才
グリフィン

+1、その評価のトリックは実際に多くのバイトを下にゴルフします
MilkyWay90

31

J、4バイト

$~#~

オンラインでお試しください!

説明

$~#~  Input: integer n
  #~  Create n copies of n
$~    Shape n into an array with dimensions n copies of n

6
チャレンジタイトルを見たとき、私はすぐにJのことを考えました。JがJelly(Jに触発されたゴルフ言語)さえも打ち負かすのはかなりクールです。
デーン

1
また、$~$~それ自体を繰り返しながら同等のものがあります
マイル

2
$~$~英語に翻訳...お金、お金の多くを得る、の多くを得る...
マジックタコ壺



9

R、26

これは明らかな答えですが、おそらくもっと賢いものがありますか?

n=scan();array(n,rep(n,n))

であるscan()必要?
アダム

他の答えを見ると、それは機能であるか、何らかの形で入力を受け入れる必要があるように思えますか?
ヒラメ

1
そうです、私はRをまったく知りません。代わりに何らかの方法で関数を指定できると思っただけです。
アダム

はい、あなたは置き換えることができますn=scan();によるfunction(n)が、それはそれは長くなります。
ヒラメ

5
あなたは入れて1つのバイトを保存することができn内部の割り当てをarrayarray(n<-scan(),rep(n,n))
rturnbull


8

Haskell、52バイト

f n=iterate(filter(>'"').show.(<$[1..n]))(show n)!!n

オンラインでお試しください!

@nimiの回答に触発されましたが、より多くの定義済み関数を使用しています。

  • 再帰的なヘルプ関数の代わりにiterate!!を使用します。
  • リスト区切り文字を「手作業で」構築する代わりにfilter(>'"').show、文字列のリストをフォーマットするために使用し、余分な"文字を取り除きます。

8

05AB1E(レガシー)6 5バイト

-1 Kevin Cruijssenに感謝

F¹.D)

オンラインでお試しください!

F     # For 0 .. input
 ¹.D) # Push <input> copies of the result of the last step as an array

D入力が暗黙的に再び使用されるため、先頭を削除することができます(回答を投稿したときにこれが問題であったかどうかはわかりDませんが、今は明示的に入力する必要はありません)。
ケビンクルーッセン

1
@KevinCruijssenこれは、暗黙的に複数回入力を行うというアイデアを私たちに与えた答えの1つだと思います:)
ライリー

わかった 投稿の時点ではまだ暗黙のうちにそれが期待されていましたが、コメントを投稿した後(編集した)に気付きました。;)古い回答(通常は2017年以前)で明示的なことをどれだけ行っているか、そして今どのくらい短くできるかがおかしい場合があります。
ケビンクルーッセン

7

オクターブ、35 33 25 23 20バイト

@(N)ones(N+!(1:N))*N

オンラインでお試しください!

@(N)ones(N*ones(1,N))*N

@(N)repmat(N,N*ones(1,N))

@LuisMendoのおかげで8バイト節約

@(N)ones(num2cell(!(1:N)+N){:})*N

オンラインでお試しください!

前の答え:

@(N)repmat(N,num2cell(!(1:N)+N){:})

オンラインでお試しください!


@LuisMendo Rats、私はちょうどそれを投稿するつもりだった;)
ビーカー

@beaker Whoops :-)
ルイスメンドー

7

Haskell、62バイト

n#0=show n
n#l='[':tail((',':)=<<n#(l-1)<$[1..n])++"]"
f n=n#n

使用例:f 2-> "[[2,2],[2,2]]"オンラインでお試しください!

Haskellの厳密な型システムは、異なる深さのネストされたリストを返す関数を防ぐため、結果を文字列として作成します。

使い方:

n#l=                         n with the current level l is
    '[':                     a literal [ followed by
           n#(l-1)<$[1..n]   n copies of   n # (l-1)
        (',':)=<<            each prepended by a , and flattened into a single list
      tail                   and the first , removed
                  ++"]"      followed by a literal ]

n#0=show n                   the base case is n as a string

f n=n#n                      main function, start with level n         

より多くの組み込み関数を使用して、同じアイデアをより短く行うことができますf n=iterate(filter(>'#').show.(<$[1..n]))(show n)!!n
Ørjanヨハンセン

@ØrjanJohansen:それは素晴らしいアイデアです。別の回答として投稿してください。
-nimi

でバイトを削ってもらえます(#0)=showか?Haskellにあまり詳しくない
チョイス

@Cyoce:いいえ、それは構文エラーです。正しい構文を得るには、引数を反転してを使用でき(#)0=showますが、関数のすべての定義には同じ数の引数が必要です。2行目(n#l='['...)には2つの引数が必要なので、最初の行にも2つの引数が必要です。
nimi

6

MATL、8バイト

ttY"l$l*

MATL Onlineで試してみてください(MATLのすべてのn次元出力は2次元マトリックスとして表示され、2次元を超えるすべての次元が2番目の次元にフラット化されるため、出力の実際のサイズを示すコードを追加しました)。

説明

        % Implicitly grab the input (N)
tt      % Make two copies of N
Y"      % Perform run-length decoding to create N copies of N
l$1     % Create a matrix of ones that is this size  
*       % Multiply this matrix of ones by N
        % Implicitly display the result  

あなたの提出が正しいことをするかどうかはMATL Onlineからは本当にわかりません。すべての答えは広いマトリックスのように見えます。
アダム

4
2番目を超える@Adámディメンションは、2番目に折りたたまれて表示されます。したがって、この例では、生成された3x3x3配列の代わりに3x9配列を示しています。Zyコードの最後に追加すると、実際のサイズが
わかり

6

Python 2、36バイト

@CalculatorFelineのおかげで-2バイト

a=n=input()
exec"a=[a]*n;"*n
print a

オンラインでお試しください!


~-n== (n-1)
CalculatorFeline

TIOリンクを含めることは可能ですか?
アダム

1
実際、これ!(最適化されたアルゴリズムのために8バイト、出力を追加するために+9バイト)
CalculatorFeline

@CalculatorFelineヘッダーとフッターに物を入れて、バイトカウントに含まれないようにすることができます。
アダム

1
プログラムの完全な提出には入出力が必要ではありませんか?
CalculatorFeline


5

ゼリー、5 バイト

⁾Wẋẋv

オンラインでお試しください!

どうやって?

⁾Wẋẋv - Main link: n                            e.g.       3
⁾Wẋ   - character pair literal ['W','ẋ']                  "Wẋ"
   ẋ  - repeat list n times                               "WẋWẋWẋ"
    v - evaluate as Jelly code with input n          eval("WẋWẋWẋ", 3)
      - ...
        WẋWẋ... - toEval: n                e.g. 3
        W        - wrap                        [3]
         ẋ       - repeat list n times         [3,3,3]
          Wẋ     - wrap and repeat            [[3,3,3],[3,3,3],[3,3,3]]
            ...  - n times total             [[[3,3,3],[3,3,3],[3,3,3]],[[3,3,3],[3,3,3],[3,3,3]],[[3,3,3],[3,3,3],[3,3,3]]]

2番目の 5バイトのゼリーの回答。比べて、まだ許容できないほど長いJの :-)
アダム

2
D:...そしてないようにしようの希望のために
ジョナサン・アラン

5

Java 97 96 95バイト

Object c(int n,int i){Object[]a=new Object[n];for(int j=0;j<n;)a[j++]=i<2?n:c(n,i-1);return a;}

ゴルフをしていない:

public class N_Dim {

    public static Object create(int n) {
        return create(n, n);
    }

    public static Object create(int n, int i) {
        Object[] array = new Object[n];
        for(int j=0;j<n;j++) {
            array[j] = i<2?n:create(n, i - 1);
        }
        return array;
    }

    public static void main(String[] args) {
        System.out.println(Arrays.deepToString((Object[]) create(3)));
    }

}

1
あなたは置き換えることができi<=1i<2
クリフルート

はい@cliffrott。うまくいきました。ありがとう!!
アナクロン

1
ラムダで数バイトを節約できます(n,i)->{...}

Java 8ラムダftw

1
うーん、これは余分な入力が必要なようです。これを有効にするには、1つのパラメーターのみの別のメソッドを作成する必要があります。
ヤコブ

5

JavaScript(ES6)、38バイト

f=(n,m=n)=>m?Array(n).fill(f(n,m-1)):n

これのメモリを大量に消費するバージョンは45バイトです。

f=(n,m=n)=>m?[...Array(n)].map(_=>f(n,m-1)):n

5

Bash + GNUユーティリティ、117バイト

n=$[$1**$1]
seq -f$1o%.fd$n+1-p $n|dc|rev|sed -r "s/(0+|$[$1-1]*).*$/\1/;s/^(0*)/\1$1/;s/^1/[1]/"|tr \\n0$[$1-1] \ []

オンラインでお試しください!


プログラムは基本的に、ベースnで0から(n ^ n)-1までカウントします。nは入力です。カウント内の各ベースn数kに対して、次のことを行います。

  1. kが少なくとも1桁の数字0で終わる場合、kの末尾の数字0ごとに「[」を出力します。
  2. nを印刷します。
  3. kが少なくとも1桁のn-1で終わる場合、kの末尾の各桁n-1に対して ']'を出力します。

(値n = 1には、特別なケースとして括弧を追加する必要があります。この入力値は、標準のPPCGルールでは無視できるstderrへの出力も生成します。)

たぶん、このアイデアを実装するより短い方法があります。


サンプル実行:

./array 3
[[[3 3 3] [3 3 3] [3 3 3]] [[3 3 3] [3 3 3] [3 3 3]] [[3 3 3] [3 3 3] [3 3 3]]]



4

Pythonの357の 53 50 38バイト

f=lambda n,c=0:n-c and[f(n,c+1)*n]or 1

オンラインでお試しください!


@CalculatorFelineのおかげで-4バイト


34バイト:

f=lambda c,n:c and[f(c-1,n)*n]or 1

として呼び出す必要があります f(4,4)


TIOリンクと比較してコード行が逆になっているのはなぜですか?
アダム

で置き換えc>1c 1バイト節約できます。(値下げ、`sのスペースの重複排除を停止)
CalculatorFeline

@CalculatorFeline私は彼ができるとは思わない。それは希望c>0この特定のケースでは。
エリックアウトゴルファー

次に、末尾をに変更し<space>nます。問題が解決し、ボーナスが追加され、バイト数が増えました!:D(それは奇妙だ初め可能ですが、ないインラインコードの末尾のスペースはそう...?)TIOリンク
CalculatorFeline

@Adám:TIOでヘッダーにメイン関数を割り当てることができ、ここでメイン関数を最後の行に保持します。
CalculatorFeline


4

ルビー、27バイト

->a{(z=a).times{z=[z]*a};z}

たった1バイトだけですが、xnorのすばらしいPythonの答えである 'eval'トリックの代わりに別のアプローチを使用しています。


3

Perl 6、25バイト

{($^n,{$_ xx$n}...*)[$n]}

で始まり、追加のレベルのネストを作成するたびに、n「n回繰り返す」変換n時間を繰り返し適用しListます。

オンラインでお試しください!


$_代わりにバイトを保存するために使用してください
ジョーキング

@JoKing:$_内側のブロックのパラメーターとして既に使用しているため、外側のブロックのパラメーターとしても使用できません。
smls

はい、しかし、$n$_常に同じ値を持っています。オンラインでお試しください!
ジョーキング

3

PHP、70 62バイト

これは私が思いつく最も簡単な方法です。

for(;$i++<$n=$argv[1];)$F=array_fill(0,$n,$F?:$n);print_r($F);

入力を最初の引数として受け取り、結果の配列を画面に出力します。


8バイト節約してくれた@ user59178に感謝します


そのような変数を事前に割り当てる必要はありません$l。ドロップして$i=0,&に置き換える$lと、$n 7バイト節約されます。追加のバイトが割り当てないことにより保存することができ$F、割り当て$n条件および三元を使用$F?:$narray_fill()
user59178

@ user59178これがあなたの心にあったものかどうかはわかりませんが、ヒントをありがとうございます。あなたは私を8バイト節約しました!
イスマエルミゲル

3

Clojure、36バイト

#(nth(iterate(fn[a](repeat % a))%)%)

引数を繰り返す関数を繰り返し、そのnような要素の無限のシーケンスを生成し、そのnth番目の要素を取得します。

オンラインで見る



3

バッチ、141バイト

@set t=.
@for /l %%i in (2,1,%1)do @call set t=%%t%%,.
@set s=%1
@for /l %%i in (1,1,%1)do @call call set s=[%%%%t:.=%%s%%%%%%]
@echo %s%

バッチには実際には配列がないため、これは配列の文字列表現を出力するだけです。説明:最初の2行は、変数でN .sで区切られたN-1 ,s の繰り返しパターンを構築しますt。4行目では、これを置換パターンとして使用Nして、- N次元配列を作成します。ダブルcallforsetステートメントの動作方法のために必要です。まず、forコマンドは変数を置き換えます。偶然にも、私の%サインはすべて2倍になっているため、すべてのクォートを解除する以外は何もしませんcall call set s=[%%t:.=%s%%%]。次に、結果のステートメントをN繰り返します。毎回、callコマンドは変数を置き換えます。この時点で、s変数には単一のセットのみがあります%s、置換されるため、結果は(eg)になりcall set s=[%t:.=[2,2]%]ます。次に、内部呼び出しがt変数を置換し、結果として(たとえば)set s=[[2,2],[2,2]]、目的の割り当てを実行します。の最終値が出力sされます。


+1うわー、私はそれを期待していなかったでしょう。すべてが謙虚な.batファイルを称賛します!
アダム

3

Clojure、49バイト

(defmacro r[n]`(->> ~n ~@(repeat n`(repeat ~n))))

最短のClojureの例ではありませんが、引用と引用解除を楽しんでいます。


3

I、7バイト

私の同僚であるIの作成者からこれを受け取りました。

#Bbhph~

#Bb     コピー#機能Bのためのound bは inding
   hp  時間(の右側)にOOKを引数のP ower機能(リピート)
     h~Hの左側にOOKを引数を~(全体得られた関数の)

オンラインでお試しください!


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.