アイデンティティマトリックスの構築


43

課題は非常に簡単です。入力が整数のn場合、n x n単位行列を出力します。単位行列は、1sが左上から右下に及ぶものです。作成した単位行列を返すまたは出力するプログラムまたは関数を作成します。出力は、2D配列、またはスペース/タブと改行で区切られた数値です。

入出力の例

1: [[1]]
2: [[1, 0], [0, 1]]
3: [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
4: [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]
5: [[1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 1, 0], [0, 0, 0, 0, 1]]

1
===
1

2
===
1 0
0 1

3
===
1 0 0
0 1 0
0 0 1

etc.

これはであるため、バイト単位の最短コードが優先されます。


1
整数入力nが与えられた場合 --私はあなたが自然数を意味すると思いますか?
ジョナサンフレッチ

回答:


26

MATL、2バイト

Xy

オクターブ回答の翻訳。

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

組み込みのない4バイトバージョン(Luis Mendoのおかげ):

:t!=
:     take input n and a generate row array [1,2,...n]
 t    duplicate
  !   zip
   =  thread compare over the result

7
この非常に洗練されたコードを翻訳するのは難しいに違いありません:D
flawr

11
@flawrわかりません。これは本当に私の傑作です。
spaghetto


1
今、私はあなたが尋ねていた理由を見る!:-D
ルイスメンドー

5
組み込みなし::t!=
ルイスメンドー

20

TI-BASIC、2バイト

identity(Ans

楽しい事実:リストを取得する最短の方法{N,N}dim(identity(Nです。

組み込みなしの最短の方法を8バイトで示します。

randM(Ans,Ans)^0

randM(-9から9までのすべての整数を含むエントリを持つランダム行列を作成します(これは奇妙に特定されているためです)。次に、この行列を0乗します。


1
それは奇妙だからです」TI-BASICは奇妙です。O_o
ドアノブ

もちろん。TI-BASIC。+1
bearacuda13

リストを取得する最短の方法ではありません{N,N}、うーん、{N,N}
チョイス

1
@Cyoce No; dim(そして、identity(TI-BASICがトークン化されているので、それぞれ1バイトです。
リルトシアスト

19

ジュリア、9 3バイト

eye

これは、整数を受け入れnnxn Array{Float64,2}(つまり、2D配列)を返す組み込み関数です。次のように呼び出しeye(n)ます。

この方針に従ってこのフォームの提出が許容できることに注意してください。


あなたがそこで何をしたかわかる!良いですね!
イスマエルミゲル

これはまたで働くMath.JS
ATaco


14

オクターブ、10 4バイト

@eye

数値を受け取りn、単位行列を返す匿名関数を返します。


@eye十分なものです。
-flawr

@flawrありがとう、私はそのようにする方法があることを知っていましたが、私はいつも忘れています:P
スパゲッティ

eye多く/いくつかの数値指向言語で単位行列を生成します。
-flawr

何をし@ますか?
チョイス

@Cyoce @は「関数ハンドル演算子」であり、aのようにlambda機能し、特定の関数への参照としても機能します。たとえば、@(x)x.^22乗関数で@sqrtあり、平方根関数への参照です。詳細についてはこちら
ジュゼッペ


11

Python 2、42バイト

lambda n:zip(*[iter(([1]+[0]*n)*n)]*n)[:n]

無名関数は、のような出力を生成し[(1, 0, 0), (0, 1, 0), (0, 0, 1)]

まず、リストを作成し([1]+[0]*n)*n、そのためn=3のように見えます

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

使用したzip / ITERトリック zip(*[iter(_)]*nのグループを作るためにn与えます

[(1, 0, 0), (0, 1, 0), (0, 0, 1), (0, 0, 0)]

1毎回1つのインデックスが来て、単位行列を与えることに注意してください。ただし、余分なすべてゼロの行があり、これはで削除され[:n]ます。


1
zip / iterトリックは独創的だと
思う

10

ゼリー、4バイト

R=€R

組み込みを使用しません。オンラインでお試しください!

使い方

R=€R    Main link. Input: n

R       Range; yield [1, ..., n].
   R    Range; yield [1, ..., n].
 =€     Compare each.
        This compares each element of the left list with the right list, so it
        yields [1 = [1, ..., n], ..., n = [1, ..., n]], where comparison is
        performed on the integers.

25
このコードは受け入れられないほど長いです。
-flawr

5
@flawr最短の長さの2倍。それは確かに珍しい出会いです。
レイナーP.

1
@flawrはい、Jより短くありません。不合格!
アダム

2
Jellyの最新バージョンでは、2バイトであり、長い答えをからかいます。
リン

だ@Lynn まだ倍の長最短のものとして。
アダム


9

Haskell、43 37バイト

f n=[[0^abs(x-y)|y<-[1..n]]|x<-[1..n]]

かなり簡単ですが、より多くのことができると思います(多くの人が行っているように、この関数が既に組み込まれている言語がなくても)。

編集:ØrjanJohansenのおかげでいくつかのバイトを落としました


7
fromEnumとしてごまかすことができsum[1|x==y]ます。
xnor

スペースを削除できることを確認してくださいfromEnum (y==x)
チョイス

@xnorそれより1バイト短い:0^abs(x-y)
Ørjanヨハンセン

1
@xnorああ、あなた0^(x-y)^2は別の答えに自分自身を使っただけです。
Ørjanヨハンセン

@ØrjanJohansenはい、あなたのコメントを見るのはいいタイミング
でした

8

Pyth、7バイト

XRm0Q1Q

オンラインで試す:デモンストレーション

ゼロの行列を作成し、対角要素を1に置き換えます。


あなたは最終的に除去することにより、1つのバイトを保存することができますQ
ジム・

1
@jimありがとう、しかしそれは実際には許可されないでしょう。この機能(最後の暗黙的なQ)は、チャレンジが投稿された後に実装されました。
ジャクベ

7

JavaScriptのES6、68の 62 52バイト

@Neilの巧妙なトリックのおかげで10バイト節約

x=>[...Array(x)].map((_,y,x)=>x.map((_,z)=>+(y==z)))

@CᴏɴᴏʀO'Bʀɪᴇɴとは異なるアプローチを試してみてください。おそらく改善される可能性があります。


これは、あなたが私にbeforeられたことを知るためにスクロールダウンする前に書いたものでした。
ニール

それで、あなたの挑戦に応えて、私はあなたx=>[...Array(x)].map((_,y,x)=>x.map((_,z)=>+(y==z)))に10のバイトの節約のために(後知恵で)明らかなものを与えます。
ニール

@Neilどうもありがとう!答えの秘answerだと言います。
ETHproductions

x=>[...Array(x)].map((_,y,x)=>x.map(_=>+!y--))
l4m2

7

網膜、25

余分なゴルフのための@randomraと@Martinの功績。

\B.
 0
+`(.*) 0$
$0¶0 $1

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

これは入力を単項として受け取ることに注意してください。これが受け入れられない場合、10進数の入力は次のように指定できます。

網膜、34

.+
$0$*1
\B.
 0
+`(.*) 0$
$0¶0 $1

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


3
...おっと。Retinaは正規表現以上の言語として強力になりつつあります。
ETHproductions

@ETHproductionsはい、これはほとんどすべての正規表現の置換に対する答えです。唯一の特別なことは、$*0数値nをnで置き換えるための使用です0
デジタル外傷

6

Haskell、54バイト

(#)=replicate
f n=map(\x->x#0++[1]++(n-x-1)#0)[0..n-1]

f入力nの単位行列を返します。最適とはほど遠い。


map呼び出しの代わりにリスト内包表記を使用して、少数のバイトを保存できます。
MathematicalOrchid

6

Lua、77 75 65バイト

x,v=z.rep,io.read()for a=1,v do print(x(0,a-1)..'1'..x(0,v-a))end

まあ、luaが2期間の連結でこれに最適な言語であるかどうかはわかりません...しかし、ちょっと、それでショットがあります。改善すべき点があるかどうかを確認します。

編集:

偶然に何か奇妙なことを見つけましたが、うまくいきます。

Luaでは、変数に関数を割り当てることができることを誰もが知っています。これは、CodeGolfのより便利な機能の1つです。

これは次の代わりに:

string.sub("50", 1, 1) -- = 5
string.sub("50", 2, 2) -- = 0
string.sub("40", 1, 1) -- = 4
string.sub("40", 2, 2) -- = 0

あなたはこれを行うことができます:

s = string.sub
s("50", 1, 1) -- = 5
s("50", 2, 2) -- = 0
s("40", 1, 1) -- = 4
s("40", 2, 2) -- = 0

しかし、ちょっと待ってください。Luaはある程度のOOPを許可します。だからあなたも潜在的に行うことができます:

z=""
s = z.sub
s("50", 1, 1) -- = 5
s("50", 2, 2) -- = 0
s("40", 1, 1) -- = 4
s("40", 2, 2) -- = 0

それも同様に機能し、キャラクターをカットします。

さて、ここからが奇妙な部分です。どの時点でも文字列を割り当てる必要さえありません。単純に:

s = z.sub
s("50", 1, 1) -- = 5
s("50", 2, 2) -- = 0
s("40", 1, 1) -- = 4
s("40", 2, 2) -- = 0

動作します。


そのため、違いを視覚的に確認できます。ゴルフの結果を見てみましょう。

string.subを使用(88文字)

string.sub("50", 1, 1)string.sub("50", 2, 2)string.sub("40", 1, 1)string.sub("40", 2, 2)

string.subを変数に割り当てる(65文字)

s=string.sub s("50", 1, 1)s("50", 2, 2)s("40", 1, 1)s("40", 2, 2)

OOPアプローチを使用したstring.subの割り当て(64文字)

z=""s=z.sub s("50", 1, 1)s("50", 2, 2)s("40", 1, 1)s("40", 2, 2)

a .. nilアプローチを使用してstring.subを割り当てますか?(60文字)

s=z.sub s("50", 1, 1)s("50", 2, 2)s("40", 1, 1)s("40", 2, 2)

誰かがこれがうまくいく理由を知っているなら、私は興味があります。


「z.rep」の行は私の上で壊れています。私はどこかにaz = ''があるはずだと賭けていますか?z = '' z.repの短縮版は( '').repになります。また、入力を読み取るためにcmdline ...を使用し、次のようにバイトカウントを57まで調整できます。z = 1の場合、z = '0' ..z:担当者(...- i))を終了
thenumbernine

以前に誰かが( "").repを提案しているのを見つけましたが、動作させることができませんでした。常にエラーになります。多分私の通訳はここの問題です。このコマンドライン入力に関するドキュメントを見つけるのに苦労していますが、どこで見つけることができるか知っていますか?
Skyl3r

6

Python 3、48

sp3000のおかげで1バイト節約されました。

私は1行で解決できる課題が大好きです。非常に簡単です。渡されたintの長さに等しい1と0からラインを作成します。2D配列として出力します。:inの後の部分をラップすると'\n'.join()、きれいに印刷されます。

lambda x:[[0]*i+[1]+[0]*(x+~i)for i in range(x)]

2
x-i-1 -> x+~i
Sp3000

5

C、59または59 56または56

同じ長さの2つのバージョン。

anatolygからの提案により3バイトが節約されました:(n+1)->~n

iからn*n-1ゼロまで反復します。i%(n + 1)がゼロの場合は1を出力し、それ以外の場合は0を出力しますi%n。= 0の場合は改行を出力し、それ以外の場合はスペースを出力します。

i;f(n){for(i=n*n;i--;)printf(i%n?"%d ":"%d\n",!(i%~n));}

i;f(n){for(i=n*n;i--;)printf("%d%c",!(i%~n),i%n?32:10);}

1
n+1あまりにも退屈です。~n代わりに使用してください!
アナトリグ

ありがとう!NBZの今日の挑戦を見たときにそれが起こったので、私はそれを見つけたはずです。
レベルリバーセント

私はCにあまり詳しくありi;ません。何をしますか?
チョイス

@Cyoce i;は変数を宣言するだけですi。Cでは、変数を使用する前に常に宣言する必要があります。これは、割り当てるメモリの量をコンパイラが認識できるように、型を示します。GCCコンパイラでは、タイプを指定しない場合、タイプが想定されますint
レベルリバーセント

1
あなたは、タブが許可されているので、あなたが9で、32を置き換えることができ、二番目のオフ1つのより多くのバイトを取ることができます
ビジャン

5

マタ、4バイト

I(3)

出力

[symmetric]
       1   2   3
    +-------------+
  1 |  1          |
  2 |  0   1      |
  3 |  0   0   1  |
    +-------------+

Mataは、Stata統計パッケージ内で利用可能なマトリックスプログラミング言語です。I(n)は、サイズn * nの単位行列を作成します


5
プログラミングパズルとCode Golf Stack Exchangeへようこそ。これは良い答えです。(ab)ビルトインの使用はゴルフに最適です。あなたの答えは実際には1バイトIであり、他の3バイトは単に関数を呼び出していることに気付きました。それはあなたの答えをこの挑戦で最も低いものの一つにするでしょう!:-)
wizzwizz4


4

Pyth、8バイト

mmsqdkQQ

ここで試してみてください


1
私はそれがPythの答えがあることを非常に珍しい、と言わなければならない4回 ...最短の答えよりも長い
ETHproductions

Hrm、これは100%有効に見える最高のものでしたが、qRRQQあなたが取得しTrue、のFalse代わりに動作するように見えましたが10このafaikを修正するには3バイトを使用する必要sMMがあります...
FryAmTheEggman

@FryAmTheEggman qRRQQも見つけました。私は他の多くのプログラムを試しましたが、どれも短いものではありませんでした。
リルトシアスト

4

Pythonのnumpyのこの3.5 - 57の 49 30バイト

import numpy
numpy.identity

NumPy.identityは整数nを取り、n行n列の単位行列を返します。この答えはこの方針で許容されています。


4
実際、私import numpy\nnumpy.identity正当な答えだと信じています
FryAmTheEggman

ヒント@MorganThrappをありがとう!そして、@ FryAmTheEggman、あなたは私の答えがちょうどimport numpy\nnumpy.identity()30バイトである可能性があるということですか
linkian209

私は\ nnumpy lolにとても混乱しました...これも有効でしょう、@ FryAmTheEggman、いいえ?from numpy import identity。26バイト。
-Ogaday

また、私の答えを似た
-Ogaday

@Ogadayそれは正しいとは思わない、あなたが与えた行は関数に評価されない。する必要がありますfrom numpy import identidy\nidentity(この場合*、特定の組み込みの代わりに使用する方が短くなります)
-FryAmTheEggman

4

Mathematica、35バイト

IdentityMatrixを使用せずに

Table[Boole[i==j],{i,1,#},{j,1,#}]&


4

Japt、14 12 10バイト

Uo £Z®¥X|0

オンラインでテストしてください!注:このバージョンには、出力をきれいに印刷するための追加のバイトがいくつかあります。

Uo £Z®¥X|0    // Implicit: U = input integer
Uo £          // Create the range [0..U). Map each item X and the full array Z to:
    Z®        //  Take the full array Z, and map each item Z to:
      ¥X|0    //   (X == Z) converted to a number. 1 for equal, 0 for non-equal.
              // Implicit: output result of last expression


3

K、7バイト

t=\:t:!

[0、n)を含む2つのベクトルの等価外積を取ります。

動作中:

  t=\:t:!3
(1 0 0
 0 1 0
 0 0 1)
  t=\:t:!5
(1 0 0 0 0
 0 1 0 0 0
 0 0 1 0 0
 0 0 0 1 0
 0 0 0 0 1)

3

Java、60バイト

n->{int[][]i=new int[n][n];for(;n-->0;)i[n][n]=1;return i;};

2D配列を作成し、行と列が等しい要素をに置き換えます1


Javaラムダ応答のバイトカウントに末尾のセミコロンを追加する必要はありません。
ケビンCruijssen


3

Mathematica、14バイト

IdentityMatrix

テストケース

IdentityMatrix[4]
(* {{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}} *)

3

Perl、39 33バイト

/$/,say map$`==$_|0,@%for@%=1..<>

6バイトを節約してくれたTon Hospelに感謝

-Eperlrunで実行する:

$ echo 3 | perl -E'@%=1..<>;$a=$_,say map{$a==$_|0}@%for@%'
100
010
001

もう少しゴルフをする:/$/,say map$`==$_|0,@%for@%=1..<>またはもっと良い//,say map$'==$_|0,@%for@%=1..<>が、そのようにあなたはもう一重引用符でそれを置くことはできません
トンホスペル

@TonHospelすごいすごい、ありがとう。後者はコマンドラインでのみ無料であるprintため、say の代わりにの使用が必要になります-E
andlrc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.