N次元のアイデンティティ「マトリックス」


30

正の整数を指定すると、インデックスのすべてのコンポーネントが等しい場合とそうでない場合の配列である-次元単位「マトリックス」をn出力します。は、N x N x N xを意味します...NN^N10N^N

1 -> [1]

2 -> [[1,0],[0,1]]

3 -> [[[1,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,1,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,1]]]

4 -> [[[[1,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]],[[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],[[0,0,0,0],[0,1,0,0],[0,0,0,0],[0,0,0,0]],[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]],[[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],[[0,0,0,0],[0,0,0,0],[0,0,1,0],[0,0,0,0]],[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]],[[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,1]]]]

たとえば、aある4次元のアイデンティティ「マトリックス」、そして持つエントリのみを1だろうa[0][0][0][0]a[1][1][1][1]a[2][2][2][2]、とa[3][3][3][3]

これはです。バイト単位の最短回答が優先されます。標準の抜け穴が適用されます。



11
ここではあなたのためにそれをやって組み込みとMATLの答えは...来る
coinheringaahing caird

回答:



9

ゼリー、8バイト

×=¥þ’¡`Ṡ

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

ああ、彼の母国語で@Dennisに再び出たようです:-)

これは引数が1つの関数です(ネストされたリストに対するJellyのデフォルトの出力形式は少し曖昧であるため、完全なプログラムとして仕様を満たすことはほぼ不可能です)。

説明

×=¥þ’¡`Ṡ
     ¡    Repeatedly apply the following operation,
    ’     {input-1} times in total:
   þ        For each element of the current value {perhaps made into a range}
      `     and of {the range from 1 to the} {input}:
 =            Compare corresponding elements, giving 0 for equal or 1 for unequal
× ¥           then multiply by one of the elements
       Ṡ  then replace each element with its sign

これを理解するために、中間ステップを見ることは役立ちます。入力が3の場合、次の中間ステップが得られます。

  1. [1,2,3](入力、によって暗黙的に範囲にされるþ
  2. [[1,0,0],[0,2,0],[0,0,3]](でテーブルを作成し、[1,2,3]getと等しいかどうかを比較してから、比較し[[1,0,0],[0,1,0],[0,0,1]]た値の1つを掛けます)
  3. [[[1,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,2,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,3]]] (再び同じ考え)
  4. [[[1,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,1,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,1]]](を使用して各要素をその記号で置き換えます

入力が1次元で始まるという事実は、(入力1)次元を追加し、入力次元リストを作成するために(入力1)回ループする必要があることを意味します。

面白い事実:このプログラムには5つのクイックが連続して含まれています¥þ’¡`。(クイックとは、「リンク」またはビルトインの修飾子であり、その動作を変更したり、別のリンクと組み合わせたりするために使用されます。


+ !、ゼリーでデニスを倒したから。
ザカリー

7

Mathematica、30バイト

Array[Boole@*Equal,#~Table~#]&

1
@FryAmTheEggmanの2番目の引数としての整数パラメーターTableは、最近の追加です。Mathicsにはまだシングルトンリストが必要です。tio.run
Martin Ender

1
@FryAmTheEggman Mathicsで動作するように変更する必要があるようですArray[Boole@*Equal,#~Table~{#}]&。旧バージョンのMathematicaは、の2番目の引数として整数をサポートしていませんTable。Mathicsはそれに基づいていると思います。
ngenisis

1
@MartinEnderピンチ、突く、あなたは私にコーラを借りている:)
ngenisis


5

ゼリー、9バイト

ðṗE€ṁ+þ’¡

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

使い方

タスクを直接達成するのは難しいようですが(方法は見つかりませんでした)、同じ数の配列と同じ形状の配列を構築するのは非常に簡単です。

ðチェーンを二項にし、整数入力nはチェーンの左右両方の引数として機能します。代わりにモナドチェーンを使用することもできますが、ダイアディックチェーンの解析ルールでは、ここで3バイト(を計算した後2バイト)節約できますð

デカルト動力原子は、左右の引数が等しいと、N、長さの全てのベクトルの配列を構築するn個の要素からなること[1、...、n]は、辞書ソート。

n = 3のとき、これは

[[1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 2, 1], [1, 2, 2], [1, 2, 3], [1, 3, 1], [1, 3, 2], [1, 3, 3], [2, 1, 1], [2, 1, 2], [2, 1, 3], [2, 2, 1], [2, 2, 2], [2, 2, 3], [2, 3, 1], [2, 3, 2], [2, 3, 3], [3, 1, 1], [3, 1, 2], [3, 1, 3], [3, 2, 1], [3, 2, 2], [3, 2, 3], [3, 3, 1], [3, 3, 2], [3, 3, 3]]

同等の各クイックリンクE€は、構築されたすべてのベクトルの要素の同等性をテストします。

n = 3のとき、

[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]

これは、フラット配列の3次元単位行列の要素です。

二項クイックリンク+þ’¡は、左引数と右引数nで呼び出されます。クイック¡は、デクリメントアトムを呼び出してn-1を生成し、その後、テーブルのクイックリンクをn-1回呼び出します。

最初、の引数は両方ともnです。各呼び出しの後、右側の引数は左側の引数に置き換えられ、左側の引数は呼び出しの戻り値に置き換えられます。

テーブルの迅速なコールアド原子+戻り値のテーブル/マトリックスを構築し、その左側の引数とその右引数の各要素の各要素のために。初期整数引数nは、範囲[1、... n]に昇格されます。

ときのn = 3、昇進後で最初の反復の前に、両方の引数があります

[1, 2, 3]

この配列の各整数をこの配列の各整数に追加すると、

[[2, 3, 4], [3, 4, 5], [4, 5, 6]]

次の呼び出しでは、これらの各配列を[1、2、3]の整数に追加します。加算はベクトル化されます(配列に整数を追加すると、各要素に追加されます)。

[[[3, 4, 5], [4, 5, 6], [5, 6, 7]],
 [[4, 5, 6], [5, 6, 7], [6, 7, 8]],
 [[5, 6, 7], [6, 7, 8], [7, 8, 9]]]

この配列の形状は3次元の単位行列と同じですが、正しい要素ではありません。

最後に、型のアトムは結果の整数エントリを右側に破棄し、それらを左の結果の要素で順番に置き換えます。


4

Python、70バイト

f=lambda n,l=[]:[f(n,l+[i])for i in(len(l)<n)*range(n)]or+(l==l[:1]*n)

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

再帰的なソリューション。マトリックスを1次元小さいマトリックスのリストと考えると、そのリストを反復してツリーをたどります。それはで選んだインデックスを覚えてl、そして時にnインデックスが選ばれている、我々は割り当てる10、彼らがすべて同じであるかどうかに応じて。


Python 2、73バイト

n=input();r=0
exec'r=eval(`[r]*n`);'*n+('n-=1;r'+'[n]'*n+'=1;')*n
print r

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

ゼロのマトリックスを作成し、対角に1を割り当てる完全に人間の方法の改善。


Python 2、88バイト

n=input()
t=tuple(range(n))
print eval('['*n+'+(i0'+'==i%d'*n%t+')'+'for i%d in t]'*n%t)

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

eval、ネストされたリストの生成、および文字列形式の置換を使用したナンセンス。評価される文字列は次のようになります。

[[[+(i0==i0==i1==i2)for i0 in t]for i1 in t]for i2 in t]

4

Python 2 + NumPy80 72 70バイト

Pythonのトップの答えと結び付けられました!

from numpy import*
n=input()
a=zeros((n,)*n)
a[[range(n)]*n]=1
print a

オンラインで試す

Andras Deakのおかげで8バイト、officialaimmで2バイト節約


2
a[[range(n)]*n]=1execではなく、fancy indexingを使用してください。
アンドラスディーク

(実際にfill_diagonal(a,1)はこの目的のためにありますが、それは1バイト長くなります)
アンドラスDeak

1
プリティ出力の場合は+1。また、変数の使用が表示さiれないため、2バイト節約できます。
officialaimm

3

パイソン299の 93 90バイト

用ロッドのおかげで、いくつかのそれが働いても剃っ6バイト降りても、より多くの助け!xnorのおかげで-3バイト。

n=input()
r=eval(`eval('['*n+'0'+']*n'*n)`)
for i in range(n):exec'r'+`[i]`*n+'=1'
print r

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


1
def/returninput/print(最高のシナリオでは等しい)よりも優れていることはありません、93バイト()('[%d]'%i)減らすことでドロップすることもできます
Rod

1
'[%d]'%iたまたまのrepという文字列です[i]
XNOR

2

JavaScript(ES6)、67バイト

f=(n,d=n-1,i)=>[...Array(n)].map((_,j)=>d?f(n,d-1,j-i?n:j):j-i?0:1)

説明:iセルが主対角線上にあるかどうかを追跡するために使用されます。最初は定義されていないため、最初の再帰呼び出しでは常に最初の次元を渡しますが、後続の再帰呼び出しでは、現在の次元インデックスが以前のすべての次元と等しい場合にのみ渡します。そうでない場合nは、すべての再帰セルはゼロでなければなりません。


2

Brainfuck、61バイト

>,[->+>+<<]>[-<<+>>]>-[->+.-<<<<[->+>+<<]>[-<+>]>[->>.<<]>]+.

非ゴルフ

山括弧の後の数字は、頭が上にあるセルを示します。

>,                   read n to 1
[->+>+<<]            move 1 to 2 and 3
>2[-<<+>>]>3         move 2 to 0 
                     (tape: n 0 0 n 0)
-[                   while cell 3 {
    -                  dec 3
    >4+.-<3            print \x1
    <<<0[->+>+<<]      move 0 to 1 and 2
    >1[-<+>]>2         move 1 to 0
                       (tape: 0 0 n rows_left 0)
    [                  while cell 2 {
        -                dec 2
        >>4.<<           print \x0
    ]>3                }
]                    }
+.                   print \x1

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

入力は2進数です。出力は、行優先の順序で格納された行列です。


回答にはすでにいくつかの異なる出力形式がありますので、唯一の要件は「何らかの標準マトリックス表現」であると想定しています。特定の形式にする必要がある場合は、それに応じてコードを変更します。
レイ

この特定の場合の行メジャーは、列メジャー
タコ

@Octopus実際には、プログラムはBrainfuckインタープリターが記述されている言語に基づいて、行優先か列優先かを決定します。ただし、FortranまたはMATLABで作成されたインタープリターを使用すると、それを検出し、自動的に列のメジャー順に切り替わります。(Brainfuck自体で記述されたインタープリターを使用した場合、テキストエディターの記述言語に基づいてあいまいさを解決します。):
Ray

2

R64 49バイト

Jarko Dubbeldamのおかげで-15バイト

x=array(0,rep(n<-scan(),n));x[seq(1,n^n,l=n)]=1;x

stdinから読み取り、配列を返し、行列として出力します。toからlength seqまでの等間隔のシーケンスを生成します。これは、1がどこに行くかをインデックスするための非常にうまく機能します。1n^nl=n

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

古いバージョン:

n=scan();x=rep(0,n^n);x=array(x,rep(n,n));x[matrix(1:n,n,n)]=1;x

nstdinから読み取ります。配列を返し、結果を行列として出力します。[マトリックスの各行がインデックスのセットを表す行列を使用して配列のインデックスを作成できることを示すのドキュメントを読むまで、しばらくこれに苦労しました。きちんとした!

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


array(0, rep(n,n)動作するので、行う必要はありませんrep。それからまたn通り抜けることができarray(0, rep(n<-scan(),n))ます。
JAD

また、x[seq(1,n^n,l=n)]=11バイト短くなります。
JAD

ありがとうございます!良いですね。
ジュゼッペ


1

Python 3 + numpy、81 77バイト

from numpy import*
f=lambda n:all([a==range(n)for a in indices((n,)*n)],0)+0

上記がすべてのガイドラインに適合するかどうかは完全にはわかりません。指定されたプロパティを持つndarrayを返します。匿名関数は通常は問題ないことを知っていますが、実際にはインタラクティブなシェルが印刷されます

>>> f(2)
array([[1, 0],
       [0, 1]])

配列のフラッフが上記を無効にする場合、print()7バイト追加するためにaをスローする必要があります。

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


1

Pyth、14バイト

ucGQtQms!t{d^U

テストスイート

説明:^U、暗黙的^UQQにでQあり、は入力であり、範囲の可能なすべてのQ要素リストを計算します0 ... n-1ms!t{dすべての要素が1に等しいものをマップし、残りを0にマップします。これにより、出力が平坦化されます。

ucGQtQ Q-1回、次を実行します。入力をサイズQのリストに切り刻みます。



1

Common Lisp、147 133バイト

(defun i(n)(flet((m(x)(fill(make-list n)x)))(let((a(make-array(m n):initial-element 0)))(dotimes(i n)(incf(apply #'aref a(m i))))a)))

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

通常の超長Lisp。@ceilingcatに感謝して12バイトを削減しました!

説明:

(defun i (n)
  (flet ((m (x) (fill (make-list n) x)))            ; function to build a list of n values x
    (let ((a (make-array (m n) :initial-element 0))); build the array with all 0
      (dotimes (i n)                                ; for i from 0 to n-1
        (incf (apply #'aref a (m i))))              ; add 1 to a[i]..[i] 
      a)))                                          ; return the array

@ ceilingcat、ops、ゴルフバージョンで愚かなエラーがありました。修正、ありがとう!
レンゾ

0

SOGL V0.12、22のバイト

.^κ.H/ 0* 1.H≤Οčr.H{.n

ここで試してみてください!
出力をスタックに残し、コンソールで表示可能にします。出力内の数字が文字列であることが許可されている場合、その数字はr削除できます。
チャレンジにおけるSOGLの動作の楽しいテストと同様に、:p

input: x
.^                      push  x^x
  κ                     subtract x    (x^x)-x
   .H/                  divide by x   ((x^x) - x)/x
       0*               get that many zeroes
          1             push "1"
           .H           push x-1
             ≤          pull the first item from the stack to the top
              Ο         encase (x-1 times the zeroes, separated, started and ended with 1s)
               č        chop to a char-array
                r       convert each character to a number
                 .H{    repeat x-1 times:
                    .n    in the top array, for each group of x contents, encase that in an array

0

Clojure、92バイト

#(reduce(fn[v i](assoc-in v(repeat % i)1))(nth(iterate(fn[v](vec(repeat % v)))0)%)(range %))

assoc-inは、ハッシュマップだけでなくベクトルでも機能するのは嬉しいことです。

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