สร้างเมทริกซ์เอกลักษณ์


43

ความท้าทายนั้นง่ายมาก กำหนดอินพุตจำนวนเต็มnส่งออกn x nเมทริกซ์เอกลักษณ์ เมทริกซ์เอกลักษณ์เป็นข้อมูลที่มีการ1ขยายจากด้านบนซ้ายลงไปด้านล่างขวา คุณจะเขียนโปรแกรมหรือฟังก์ชั่นที่จะส่งกลับหรือแสดงเมทริกซ์เอกลักษณ์ที่คุณสร้างขึ้น ผลลัพธ์ของคุณอาจเป็นอาร์เรย์ 2 มิติหรือตัวเลขคั่นด้วยช่องว่าง / แท็บและบรรทัดใหม่

ตัวอย่างอินพุทและเอาท์พุท

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 ... - ฉันคิดว่าคุณหมายถึงจำนวนธรรมชาติ?
Jonathan Frech

คำตอบ:


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
ข้อบกพร่อง

11
@ flawr คุณไม่มีความคิด นี่คือผลงานชิ้นเอกของฉันอย่างแท้จริง
สปาเก็ตตี้


1
ตอนนี้ฉันเห็นว่าทำไมคุณถึงถาม! :-D
Luis Mendo

5
โดยไม่ต้องสร้างภายใน::t!=
Luis Mendo

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
Doorknob

ใช่. TI-BASIC +1
bearacuda13

ไม่ได้เป็นทางที่สั้นที่สุดที่จะได้รับรายชื่อ{N,N}, อืมม, {N,N}?
Cyoce

1
@Cyoce No; dim(และidentity(แต่ละไบต์เนื่องจาก TI-BASIC ถูกโทเค็น
lirtosiast

19

Julia, 9 3 ไบต์

eye

นี่เป็นเพียงฟังก์ชั่นในตัวที่รับจำนวนเต็มnและคืนค่าnxn Array{Float64,2}(เช่นอาร์เรย์ 2 มิติ) eye(n)เรียกว่าเหมือน

โปรดทราบว่าการส่งแบบฟอร์มนี้เป็นที่ยอมรับตามนโยบายนี้


ฉันรู้ว่าคุณทำอะไรที่นั่น! ทำได้ดีนี่!
Ismael Miguel

นอกจากนี้ยังสามารถใช้งานในMath.JS
ATaco


14

ระดับเสียงคู่10 10ไบต์

@eye

ส่งคืนฟังก์ชันที่ไม่ระบุชื่อซึ่งใช้ตัวเลขnและส่งคืนเมทริกซ์เอกลักษณ์


@eyeเพียงพอแล้ว
ข้อบกพร่อง

@ flawr ขอบคุณฉันรู้ว่ามีวิธีที่จะทำอย่างนั้น แต่ฉันมักจะลืม: P
ปาเก็ตตี้

eyeผลิตเมทริกซ์เอกลักษณ์ในจำนวนมาก / บางภาษาเชิงตัวเลข
ข้อบกพร่อง

อะไร@ทำอย่างไร
Cyoce

@Cyoce @เป็น "ตัวดำเนินการจัดการฟังก์ชัน" ซึ่งทำงานเหมือนlambdaและเป็นข้อมูลอ้างอิงไปยังฟังก์ชั่นหนึ่ง ๆ เช่น@(x)x.^2เป็นฟังก์ชันกำลังสองและ@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ดัชนีหนึ่งมาในภายหลังในแต่ละครั้งให้เมทริกซ์เอกลักษณ์ [:n]แต่มีความพิเศษทุกศูนย์แถวซึ่งจะถูกลบด้วย


1
เคล็ดลับการ zip / iter นั้นช่างแยบยล
seequ

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 ใช่และไม่สั้นกว่าJ ล้มเหลว!
Adám

2
ในรุ่นทันสมัยของ Jelly มีขนาดสองไบต์และทำให้คำตอบที่สนุกยิ่งขึ้น
ลินน์

@Lynn นั่นยังคงนานเป็นสองเท่าของ oneS ที่สั้นที่สุด
อดัม

10

J, 4 ไบต์

=@i.

นี่คือฟังก์ชันที่ใช้จำนวนเต็มและส่งกลับเมทริกซ์


ฉันคิดว่าคุณสามารถทำได้ใน 3:=i.
Sam Elliott

@ SamElliott ที่ไม่ทำงาน ตัวอย่างเช่น(=i.) 10=>0 0 0 0 0 0 0 0 0 0
Cyoce

9

Haskell, 43 37 bytes

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

ค่อนข้างตรงไปตรงมาแม้ว่าฉันคิดว่าจะทำได้ดีกว่า (ไม่มีภาษาที่มีฟังก์ชั่นนี้ติดตั้งอยู่ในตัว

แก้ไข: ทำไบต์ลดลงขอบคุณØrjan Johansen


7
คุณสามารถโกงเป็นfromEnum sum[1|x==y]
xnor

ค่อนข้างแน่ใจว่าคุณสามารถลบช่องว่างในfromEnum (y==x)
Cyoce

@xnor 0^abs(x-y)หนึ่งไบต์สั้นกว่า:
Ørjan Johansen

1
@xnor โอ้คุณเพิ่งใช้0^(x-y)^2ตัวเองในคำตอบอื่นยิ่งสั้นลงไปอีก
Ørjan Johansen

@ ØrjanJohansenใช่เห็นความคิดเห็นของคุณเป็นช่วงเวลาที่ดี :)
xnor

8

Pyth, 7 ไบต์

XRm0Q1Q

ลองใช้งานออนไลน์: การสาธิต

การสร้างเมทริกซ์ของศูนย์และแทนที่องค์ประกอบในแนวทแยงด้วยวัตถุ


คุณสามารถบันทึกหนึ่งไบต์โดยการลบสุดท้ายQ
Jim

1
@jim ขอบคุณ แต่นั่นจะไม่ได้รับอนุญาต คุณลักษณะ (โดยนัย Q ตอนท้าย) ถูกนำไปใช้หลังจากการโพสต์ความท้าทาย
Jakube

7

JavaScript ES6, 68 62 52 ไบต์

บันทึก 10 ไบต์ด้วยเคล็ดลับเรียบร้อยจาก @Neil

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

ลองใช้วิธีอื่นนอกเหนือจาก @ CᴏɴᴏʀO'Bʀɪᴇɴ อาจมีการปรับปรุง


นี่คือสิ่งที่ฉันเขียนไว้ก่อนที่ฉันจะเลื่อนลงเพื่อค้นหาว่าคุณจะทำให้ฉันพ่ายแพ้
Neil

ดังนั้นเพื่อตอบสนองต่อความท้าทายของคุณฉันขอให้คุณ (ในการเข้าใจถึงปัญหาหลังเหตุการณ์) ชัดเจนx=>[...Array(x)].map((_,y,x)=>x.map((_,z)=>+(y==z)))เพื่อการประหยัด 10 ไบต์
Neil

@ นีลขอบคุณมาก! ฉันจะพูดถึงว่ามันเป็นเคล็ดลับของคุณในคำตอบ
ETHproductions

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

7

จอตาตา 25

ขอมอบเครดิตให้ @randomra และ @Martin สำหรับการเล่นกอล์ฟเพิ่มเติม

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

ลองออนไลน์

หมายเหตุสิ่งนี้ใช้อินพุตเป็นเอกภาพ หากไม่เป็นที่ยอมรับอาจมีการป้อนค่าทศนิยมดังนี้:

จอประสาทตา, 34

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

ลองออนไลน์


3
...โว้ว. จอประสาทตากำลังกลายเป็นภาษาที่มีพลังมากกว่า regex
ETHproductions

@ ETHproductions ใช่ แต่นี่เป็นคำตอบที่ค่อนข้างดีสำหรับการทดแทน regex ทั้งหมด สิ่งเดียวที่พิเศษคือการใช้$*0แทนหมายเลข n ด้วย n 0s
บาดเจ็บทางดิจิตอล

6

Haskell, 54 ไบต์

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

fส่งคืนเมทริกซ์เอกลักษณ์สำหรับอินพุต n ไกลจากที่ดีที่สุด


คุณสามารถบันทึกจำนวนหนึ่งไบต์โดยใช้รายการความเข้าใจแทนการmapโทร
คณิตศาสตร์

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)

การกำหนด string.sub โดยใช้วิธีการของ OOP (64 ตัวอักษร)

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

การกำหนด 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 ... สำหรับการอ่านอินพุตและลดจำนวน bytecount ลงไปที่ 57 ดังนี้: z = '0'for i = 1, ... do print (z: rep (i-1) .. 1 ..z: ตัวแทน (...- i)) สิ้นสุด
thenumbernine

ฉันพบคนที่แนะนำ ("") .rep ก่อนหน้านี้ แต่ฉันไม่สามารถใช้งานได้ มันผิดพลาดเสมอ บางทีล่ามของฉันอาจเป็นปัญหาที่นี่ ฉันกำลังดิ้นรนเพื่อค้นหาเอกสารใด ๆ ในอินพุตบรรทัดคำสั่งนี้คุณรู้หรือไม่ว่าสามารถหาได้ที่ไหน?
Skyl3r

6

Python 3, 48

บันทึก 1 ไบต์ขอบคุณ sp3000

ฉันรักความท้าทายที่ฉันสามารถแก้ไขได้ในหนึ่งบรรทัด ค่อนข้างง่ายสร้างบรรทัดจาก 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

ความยาวเท่ากันสองรุ่น

บันทึก 3 ไบต์เนื่องจากคำแนะนำจาก anatolyg: (n+1)->~n

ทำซ้ำiจากn*n-1ถึงศูนย์ พิมพ์ 1 ถ้า i% (n + 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
Bijan

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
ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนาและการแลกเปลี่ยนรหัสกองกอล์ฟ นี่เป็นคำตอบที่ดี (ab) การใช้บิวด์อินดีมากสำหรับการเล่นกอล์ฟ ฉันสังเกตเห็นว่าคำตอบของคุณคือ 1 ไบต์: Iและอีก 3 ไบต์เพียงแค่เรียกใช้ฟังก์ชัน นั่นจะทำให้คำตอบของคุณต่ำที่สุดในความท้าทายนี้! :-)
wizzwizz4


4

Pyth, 8 ไบต์

mmsqdkQQ

ลองมันนี่


1
ฉันต้องบอกว่ามันแปลกมากที่คำตอบของ Pyth นั้นยาวกว่าคำตอบที่สั้นที่สุดถึงสี่เท่า ...
ETHproductions

อืมนี่เป็นสิ่งที่ดีที่สุดที่ฉันสามารถรับได้ว่ามีลักษณะที่ถูกต้อง 100% แต่ฉันพบqRRQQว่าดูเหมือนว่าจะทำงานได้ยกเว้นที่คุณได้รับTrueและFalseแทนที่1และ0อย่างไรก็ตามการแก้ไข afaik นี้ต้องใช้สามไบต์sMMซึ่งไม่ได้ช่วย ...
FryAmTheEggman

@FryAmTheEggman ฉันยังพบ qRRQQ ฉันได้ลองใช้โปรแกรมอื่นจำนวนหนึ่งและไม่มีโปรแกรมใดที่สั้นกว่านี้
lirtosiast

4

Python 3.5 กับ NumPy - 57 49 30 ไบต์

import numpy
numpy.identity

NumPy.identity รับจำนวนเต็ม 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

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)

ในการดำเนินการ:

  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;};

สร้างอาร์เรย์ 2 1มิติและแทนที่องค์ประกอบที่แถวและคอลัมน์เท่ากันด้วย


คุณไม่จำเป็นต้องเพิ่มเซมิโคลอนต่อท้ายไปยัง byte-count สำหรับคำตอบแลมบ์ด้าของ Java
Kevin Cruijssen



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..<>แต่ชอบที่คุณไม่สามารถใส่มันในราคาเดียวอีกต่อไป
Ton Hospel

@ TonHospel ว้าวขอบคุณมาก ในภายหลังจะต้องใช้printแทนการพูดเพราะ-Eเป็นอิสระในบรรทัดคำสั่งเท่านั้น
andlrc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.