构造身份矩阵


43

挑战非常简单。给定整数输入n,输出n x n单位矩阵。单位矩阵是1从左上角到右下角的s 矩阵。您将编写一个程序或函数来返回或输出您构造的身份矩阵。您的输出可能是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 ...-我假设您的意思是自然数?
乔纳森·弗雷希

Answers:


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
瑕疵的,2016年

11
@flawr你不知道。这确实是我的杰作。
意大利面条


1
现在,我明白了您为什么要问!:-D
路易斯·门多

5
没有内置函数::t!=
Luis Mendo

20

TI-BASIC,2个字节

identity(Ans

有趣的事实:获取列表的最短方法{N,N}dim(identity(N

这是没有内置的最短方法,为8个字节:

randM(Ans,Ans)^0

randM(创建一个随机矩阵,其条目的所有整数在-9和9之间(包括-9和9)(这听起来有些奇怪,因为确实如此)。然后,我们将此矩阵取0的幂。


1
这听起来很奇怪,因为它是 ” TI-BASIC很奇怪。O_o
门把手

当然好。TI-BASIC。+1
bearacuda13

这不是获取列表的最短方法吗{N,N},嗯{N,N}
Cyoce

1
@Cyoce否;dim(identity(每个为一个字节,因为TI-BASIC已被标记化。
lirtosiast

19

朱莉娅9 3个字节

eye

这只是一个接受整数n并返回nxn Array{Float64,2}(即2D数组)的内置函数。这样称呼eye(n)

请注意,根据本政策,可以接受这种形式的提交。


我看你在那儿干了什么!好东西!
Ismael Miguel

这也适用于Math.JS
ATaco


14

八度,10 4字节

@eye

返回一个带数字n并返回单位矩阵的匿名函数。


@eye足够了。
瑕疵的

@flawr谢谢,我知道有办法做到这一点,但我始终忘了:P
意大利面

eye以许多/一些数字导向的语言生成单位矩阵。
瑕疵的

怎么@办?
Cyoce

@Cyoce @是“函数句柄运算符”,它的作用类似于a,lambda并且还引用特定函数,例如,@(x)x.^2是平方函数,并且@sqrt是平方根函数的引用。您可以在此处
Giuseppe

12

R,4个字节

diag

给定矩阵时,diag返回矩阵的对角线。但是,给定一个整数时ndiag(n)返回单位矩阵。

在线尝试


11

Python 2,42字节

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

匿名函数,产生类似的输出[(1, 0, 0), (0, 1, 0), (0, 0, 1)]

首先,创建list ([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每次出现索引后一次,都会给出单位矩阵。但是,还有一个额外的全零行,已用删除[: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
该代码太长,无法接受。
瑕疵的

5
@flawr最短的长度的两倍。确实是不寻常的相遇。
Rainer P.

1
@flawr是的,没有短于Ĵ。失败!
2016年

2
在现代版本的Jelly中,它是两个字节,并且取笑了较长的答案。
林恩

@Lynn 仍然是最短的一个的两倍。
2013年

10

J,4个字节

=@i.

这是一个接受整数并返回矩阵的函数。


我认为您可以在3中做到:=i.
Sam Elliott

@SamElliott不起作用。例如,(=i.) 10=>0 0 0 0 0 0 0 0 0 0
Cyoce's

9

Haskell,43 37字节

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

非常简单,尽管我认为可以做得更好(没有一种语言已经内置了此功能,就像许多人所做的那样)。

编辑:感谢ØrjanJohansen删除了一些字节


7
您可以欺骗fromEnumas sum[1|x==y]
xnor

非常确定您可以删除fromEnum (y==x)
Cyoce

@xnor一个字节比短:0^abs(x-y)
与Orjan约翰森

1
@xnor哦,您只是0^(x-y)^2在另一个答案中使用了自己,甚至更简短。
与Orjan约翰森

@ØrjanJohansen是的,看到您的评论的时机不错:)
xnor

8

Pyth,7个字节

XRm0Q1Q

在线尝试:演示

创建零矩阵,并用1替换对角线元素。


您可以删除最后一个字元来节省一个字节Q
Jim

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ʀɪᴇɴ的方法。可能会得到改善。


这恰好是我在向下滚动以找出您对我的殴打之前写的。
尼尔

因此,为应对您的挑战,我(很显然)x=>[...Array(x)].map((_,y,x)=>x.map((_,z)=>+(y==z)))为您节省了10个字节。
尼尔

@尼尔非常感谢!我会说这是答案中的窍门。
ETHproductions 2016年

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

7

视网膜 25

感谢@randomra和@Martin进行额外的高尔夫运动。

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

在线尝试。

请注意,这会将输入作为一元。如果这是不可接受的,则可以给出如下十进制输入:

视网膜,34

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

在线尝试。


3
...哇。作为正则表达式之外的语言,视网膜正变得越来越强大。
ETHproductions 2016年

@ETHproductions是的,尽管这几乎可以回答所有正则表达式的替换。唯一的特别之处是使用$*0将n替换为n 0s。
Digital Trauma

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是否是最好的语言……但是,嘿,有一个镜头。我将看看是否有任何需要改进的地方。

编辑:

我偶然发现了一些奇怪的东西,但是它确实有效。

在Lua中,每个人都知道您可以将函数分配给变量。这是更有用的CodeGolf功能之一。

这意味着代替:

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,如下所示:对于i = 1,z ='0'...执行print(z:rep(i-1).. 1 ..z:rep(...- i))end
thenumbernine

我之前发现有人建议(“”).rep,但无法使其正常工作。总是会出错。也许我的翻译是这里的问题。我正在努力寻找有关此命令行输入的任何文档,您知道可以在哪里找到它吗?
Skyl3r

6

Python 3、48

由于sp3000,节省了1个字节。

我喜欢可以一站式解决的挑战。非常简单,用1和0构成的线等于传入的int的长度。输出为2d数组。如果将零件包裹在:中'\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

长度相同的两个版本。

由于anatolyg的建议,节省了3个字节:(n+1)->~n

迭代in*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,而不是!
anatolyg

谢谢!我应该已经发现了这一点,因为当我今天查看NBZ的挑战时,它就发生了。
水平河圣

我对C不太熟悉。怎么i;办?
Cyoce

@Cyoce i;只是声明变量i。在C语言中,始终必须在使用变量之前声明一个变量,并指明其类型,以便编译器知道要分配多少内存。在GCC编译器中,如果您未指定类型,则假定为int
水平河圣

1
你可以把1个字节以上关闭第二个,因为标签是允许的,可以取代32,与9

5

Mata,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 '16


4

Pyth,8个字节

mmsqdkQQ

在这里尝试。


1
我必须说,Pyth的答案比最短的答案长四倍是非常不寻常的……
ETHproductions 2016年

嗯,这是我能够得到的最好的,看起来是100%有效的,但是我确实找到了qRRQQ,除了您得到了以外似乎都行得通TrueFalse而不是1and 0,但是修复此afaik需要使用三个字节,sMM这对您没有帮助...
FryAmTheEggman

@FryAmTheEggman我也找到了qRRQQ。我尝试了许多其他程序,但都不短。
lirtosiast '16

4

蟒3.5 NumPy的- 57个 49 30字节

import numpy
numpy.identity

NumPy.identity接受整数n,并返回一个乘以n的恒等矩阵。通过此政策可以允许此答案。


4
实际上,我相信这import numpy\nnumpy.identity是一个合理的答案
FryAmTheEggman

感谢您的提示@MorganThrapp!@FryAmTheEggman,您的意思是我的答案可能import numpy\nnumpy.identity()是30个字节?
linkian209 '16

\ nnumpy大声笑让我感到困惑...这也有效,@ FryAmTheEggman,不是吗?from numpy import identity。26个字节
Ogaday '16

另外,请看我的回答类似的内容
Ogaday '16

@Ogaday我认为这是不正确的,您所给出的行不会评估为函数。您需要做from numpy import identidy\nidentity(在这种情况下,使用起来会短一些,*而不是使用特定的内置
函数

4

Mathematica,35字节

不使用IdentityMatrix

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

4

Javascript,40岁

f=
n=>'0'.repeat(n).replace(/./g,"$`1$'\n")

I.oninput=_=>O.innerHTML=f(+I.value)
I.oninput()
<input id=I value=5>
<pre id=O>


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

4

脑高射炮206个 170 162字节

(([{}])){({}<>(())<><(({})<{({}()(<>)<>)}{}>)>)}{}(({}<><(())>)){({}()<({[()]<({}()<({}<>((((()()()()){}){}){})((()()()()){}){})<>>)>}{})>)<>((()()()()()){})<>}<>

在线尝试!


3

K,7个字节

t=\:t:!

取两个包含[0,n)的向量的等式叉积。

实际上:

  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 lambda答案的字节数中添加尾随分号。
凯文·克鲁伊森


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

感谢Ton Hospel节省了6个字节

使用-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代替而不是说,因为-E仅在命令行上是免费的。
andlrc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.