Konstruieren Sie die Identitätsmatrix

43

Die Herausforderung ist sehr einfach. Geben Sie bei einer Ganzzahleingabe ndie n x nIdentitätsmatrix aus. Die Identitätsmatrix 1erstreckt sich von oben links nach unten rechts. Sie schreiben ein Programm oder eine Funktion, die die von Ihnen erstellte Identitätsmatrix zurückgibt oder ausgibt. Ihre Ausgabe kann ein 2D-Array oder durch Leerzeichen / Tabulatoren und Zeilenumbrüche getrennte Zahlen sein.

Beispiel für Ein- und Ausgabe

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.

Das ist , also gewinnt der kürzeste Code in Bytes.

Seadrus
quelle
1
Bei einer Ganzzahleingabe n ... - Ich nehme an, Sie meinen eine natürliche Zahl?
Jonathan Frech

Antworten:

26

MATL, 2 Bytes

Xy

Eine Übersetzung meiner Octave-Antwort.

Probieren Sie es online aus.

Eine 4-Byte-Version ohne eingebaute Funktionen (dank Luis Mendo):

:t!=
:     take input n and a generate row array [1,2,...n]
 t    duplicate
  !   zip
   =  thread compare over the result
ein Spaghetto
quelle
7
Es muss schwierig gewesen sein, diesen sehr raffinierten Code zu übersetzen: D
flawr
11
@flawr Du hast keine Ahnung. Das ist wirklich mein Meisterstück.
ein Spaghetto
1
Jetzt verstehe ich, warum du gefragt hast! :-D
Luis Mendo
5
Ohne Einbauten::t!=
Luis Mendo
20

TI-BASIC, 2 Bytes

identity(Ans

Unterhaltsame Tatsache: Der kürzeste Weg, eine Liste zu erhalten, {N,N}ist dim(identity(N.

Hier ist der kürzeste Weg ohne die eingebauten, in 8 Bytes:

randM(Ans,Ans)^0

randM(Erstellt eine Zufallsmatrix mit Einträgen aller ganzen Zahlen zwischen -9 und 9 (das klingt seltsamerweise spezifisch, weil es so ist). Wir nehmen dann diese Matrix zur 0. Potenz.

Lirtosiast
quelle
1
" Das klingt seltsam spezifisch, weil es " ist. TI-BASIC ist komisch. O_o
Türklinke
Auf jedenfall. TI-BASIC. +1
bearacuda13
ist nicht der kürzeste Weg, um eine Liste zu bekommen {N,N}, ähm {N,N}?
Cyoce
1
@Cyoce Nein; dim(und identity(sind jeweils ein Byte, da TI-BASIC tokenisiert ist.
Lirtosiast
19

Julia, 9 3 Bytes

eye

Dies ist nur eine integrierte Funktion, die eine Ganzzahl akzeptiert nund ein nxn Array{Float64,2}(dh ein 2D-Array) zurückgibt . Nenne es so eye(n).

Beachten Sie, dass Einsendungen dieses Formulars gemäß dieser Richtlinie zulässig sind .

Alex A.
quelle
Ich sehe, was du dort getan hast! Schön!
Ismael Miguel
Dies funktioniert auch in Math.JS
ATaco
16

APL, 5 Bytes

∘.=⍨⍳

Dies ist ein monadischer Funktionszug, der eine Ganzzahl auf der rechten Seite akzeptiert und die Identitätsmatrix zurückgibt.

Probieren Sie es hier aus

Alex A.
quelle
14

Oktave, 10 4 Bytes

@eye

Gibt eine anonyme Funktion zurück, die eine Zahl annimmt nund die Identitätsmatrix zurückgibt.

ein Spaghetto
quelle
@eyeist genügend.
Fehler
@flawr Danke, ich wusste, dass es einen Weg gibt, es so zu machen, aber ich vergesse immer: P
ein Spaghetto
eyeErzeugt die Identitätsmatrix in vielen / einigen numerisch orientierten Sprachen.
Fehler
Was macht der @?
Cyoce
@Cyoce @ist der "Funktions-Handle-Operator". Er funktioniert wie eine lambdaund auch als Referenz auf eine bestimmte Funktion, z. B. @(x)x.^2die Quadrierungsfunktion und @sqrteine Referenz auf die Quadratwurzelfunktion. Sie können mehr darüber hier
Giuseppe
12

R, 4 Bytes

diag

Wenn eine Matrix angegeben wird, wird diagdie Diagonale der Matrix zurückgegeben. Bei einer Ganzzahl nwird jedoch diag(n)die Identitätsmatrix zurückgegeben.

Probieren Sie es online aus

Alex A.
quelle
11

Python 2, 42 Bytes

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

Eine anonyme Funktion erzeugt eine Ausgabe wie [(1, 0, 0), (0, 1, 0), (0, 0, 1)]:

Zunächst wird die Liste erstellt ([1]+[0]*n)*n, nach der n=3aussieht

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

Mit Hilfe der zip / iter Trick zip(*[iter(_)]*n Gruppen zu machen , der ngibt

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

Beachten Sie, dass der 1Index jedes Mal einen Index später kommt und die Identitätsmatrix angibt. Es gibt jedoch eine zusätzliche Null-Zeile, die mit entfernt wird [:n].

xnor
quelle
1
Verdammt, dieser Reißverschluss- / Iter-Trick ist genial
siehe auch
10

Gelee, 4 Bytes

R=€R

Verwendet kein eingebautes. Probieren Sie es online!

Wie es funktioniert

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.
Dennis
quelle
25
Dieser Code ist unannehmbar lang.
Fehler
5
@flawr Zweimal so lang wie die kürzeste. Das ist in der Tat eine ungewöhnliche Begegnung.
Rainer P.
1
@flawr Ja, und nicht kürzer als J . SCHEITERN!
Adám
2
In modernen Versionen von Jelly sind es zwei Bytes, und über die längeren Antworten wird sich lustig gemacht.
Lynn
@Lynn Das ist immer noch doppelt so lang wie die kürzeste.
Adám
10

J, 4 Bytes

=@i.

Dies ist eine Funktion, die eine Ganzzahl annimmt und die Matrix zurückgibt.

Marinus
quelle
Ich denke, Sie können es in 3 tun:=i.
Sam Elliott
@ SamElliott das funktioniert nicht. Zum Beispiel (=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]]

Ziemlich einfach, obwohl ich denke, man kann es besser machen (ohne eine Sprache, in der diese Funktion bereits eingebaut ist, wie es viele getan haben).

Bearbeiten: Dank Ørjan Johansen sind einige Bytes weggefallen

Sheridan Grant
quelle
7
Sie können die fromEnumals betrügen sum[1|x==y].
Xnor
Ziemlich sicher, dass Sie das Leerzeichen in entfernen könnenfromEnum (y==x)
Cyoce
@xnor Ein Byte kürzer als das: 0^abs(x-y).
Ørjan Johansen
1
@xnor Oh, du hast dich nur für eine 0^(x-y)^2andere Antwort benutzt, noch kürzer.
Ørjan Johansen
@ ØrjanJohansen Ja, es war ein schönes Timing, Ihren Kommentar zu sehen :)
xnor
8

Pyth, 7 Bytes

XRm0Q1Q

Probieren Sie es online aus: Demonstration

Erstellen einer Nullmatrix und Ersetzen der diagonalen Elemente durch Einsen.

Jakube
quelle
Sie können ein Byte sparen, indem Sie das Finale entfernenQ
Jim
1
@jim Danke, aber das wäre eigentlich nicht erlaubt. Das Feature (implizites Q am Ende) wurde implementiert, nachdem die Herausforderung veröffentlicht wurde.
Jakube
7

JavaScript ES6, 68 62 52 Bytes

10 Bytes gespart dank eines netten Tricks von @Neil

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

Ich versuche einen anderen Ansatz als bei @ Cᴏɴᴏʀ O'Bʀɪᴇɴ. Könnte evtl. verbessert werden.

ETHproductions
quelle
Dies war genau das, was ich geschrieben habe, bevor ich nach unten gescrollt habe, um herauszufinden, dass du mich geschlagen hast.
Neil
Als Antwort auf Ihre Herausforderung gebe ich Ihnen (im Nachhinein) die offensichtliche x=>[...Array(x)].map((_,y,x)=>x.map((_,z)=>+(y==z)))Einsparung von 10 Bytes.
Neil
@ Neil Vielen Dank! Ich werde erwähnen, dass es Ihr Trick in der Antwort ist.
ETHproductions
x=>[...Array(x)].map((_,y,x)=>x.map(_=>+!y--))
l4m2
7

Retina , 25

Dank an @randomra und @Martin für zusätzliches Golfen.

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

Probieren Sie es online aus.

Beachten Sie, dass dies als unäre Eingabe gilt. Ist dies nicht akzeptabel, kann die Dezimaleingabe wie folgt erfolgen:

Retina, 34

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

Probieren Sie es online aus.

Digitales Trauma
quelle
3
... whoa. Retina wird als Sprache für mehr als Regex mächtig.
ETHproductions
@ETHproductions ja, obwohl dies so ziemlich jede reguläre Substitution beantwortet. Das einzige Besondere ist die Verwendung von $*0, um eine Zahl n durch ns zu ersetzen 0.
Digital Trauma
6

Haskell, 54 Bytes

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

fGibt die Identitätsmatrix für Eingabe n zurück. Weit davon entfernt, optimal zu sein.

ThreeFx
quelle
Sie können eine Handvoll Bytes mithilfe eines Listenverständnisses anstelle eines mapAufrufs speichern .
MathematicalOrchid
6

Lua, 77 75 65 Bytes

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

Nun, ich bin mir nicht sicher, ob lua die beste Sprache für diese Verkettung ist ... Aber hey, es gibt eine Chance. Ich werde sehen, ob Verbesserungen vorgenommen werden müssen.

BEARBEITEN:

Ich habe durch einen Unfall etwas herausgefunden, was ich ziemlich merkwürdig finde, aber es funktioniert.

In Lua weiß jeder, dass Sie Variablen Funktionen zuweisen können. Dies ist eine der nützlicheren CodeGolf-Funktionen.

Das heißt statt:

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

Du kannst das:

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

Aber warte, Lua lässt etwas OOP zu. Sie könnten also möglicherweise sogar Folgendes tun:

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

Das funktioniert auch und schneidet Charaktere.

Jetzt kommt hier der seltsame Teil. Sie müssen zu keinem Zeitpunkt eine Zeichenfolge zuweisen. Einfach machen:

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

Wird funktionieren.


So können Sie den Unterschied visuell erkennen und sich die Golfergebnisse ansehen:

Verwenden von string (88 Zeichen)

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

Zuweisen von string.sub zu einer Variablen (65 Zeichen)

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

String.sub mit einem OOP-Ansatz zuweisen (64 Zeichen)

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

String.sub mit einem .. nil-Ansatz zuweisen? (60 Zeichen)

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

Wenn jemand weiß, warum das funktioniert, würde ich mich interessieren.

Skyl3r
quelle
Die Zeile "z.rep" bricht bei mir ab. Ich wette, es sollte irgendwo az = '' geben? Eine kürzere Variante von z = '' z.rep wäre einfach ('') .rep. Sie können auch die cmdline ... zum Lesen von Eingaben verwenden und den Bytecount wie folgt auf 57 heruntersetzen: z = '0' für i = 1, ... do print (z: rep (i-1) .. 1 ..z: rep (...- i)) end
thenumbernine
Ich habe zuvor jemanden gefunden, der ("") .rep vorschlägt, aber ich konnte es nicht zum Laufen bringen. Es würde immer einen Fehler machen. Vielleicht ist mein Dolmetscher hier das Problem. Ich habe Probleme, Dokumentation zu dieser Befehlszeileneingabe zu finden. Wissen Sie, wo sie zu finden ist?
Skyl3r
6

Python 3, 48

1 Byte dank sp3000 gespeichert.

Ich liebe Herausforderungen, die ich in einer Linie lösen kann. Ziemlich einfach, erstellen Sie eine Zeile aus 1 und 0, die der Länge des übergebenen Int entspricht. Ausgabe als 2D-Array. Wenn Sie das Teil nach dem: in einwickeln '\n'.join(), wird es hübsch gedruckt.

lambda x:[[0]*i+[1]+[0]*(x+~i)for i in range(x)]
Morgan Thrapp
quelle
2
x-i-1 -> x+~i
Sp3000
5

C, 59 oder 59 56 oder 56

Zwei Versionen gleicher Länge.

3 Bytes gespart aufgrund eines Vorschlags von anatolyg: (n+1)->~n

Iteriert ivon n*n-1auf Null. Gibt eine 1 aus, wenn i% (n + 1) Null ist, andernfalls 0. Gibt eine neue Zeile aus, wenn i%n= 0, andernfalls ein Leerzeichen.

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);}
Level River St
quelle
1
n+1ist zu langweilig. Verwenden Sie ~nstattdessen!
Anatolyg
Vielen Dank! Ich hätte das sehen sollen, weil es mir einfiel, als ich mir heute die Herausforderung von NBZ ansah.
Level River St
Ich bin nicht so vertraut mit C. Was macht i;das?
Cyoce
@Cyoce i;deklariert nur die Variable i. In C müssen Sie immer eine Variable deklarieren, bevor Sie sie verwenden. Geben Sie dabei den Typ an, damit der Compiler weiß, wie viel Speicher zugewiesen werden muss. Wenn Sie beim GCC-Compiler keinen Typ angeben, wird davon ausgegangen, dass dies der Fall ist int.
Level River St
1
Sie können 1 weiteres Byte von dem zweiten entfernen, da Tabulatoren zulässig sind. Sie können 32 durch 9 ersetzen.
Bijan
5

Mata, 4 Bytes

I(3)

Ausgabe

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

Mata ist die Matrix-Programmiersprache, die im Statistikpaket Stata enthalten ist. I (n) erzeugt eine Identitätsmatrix der Größe n * n

Guest0101
quelle
5
Willkommen beim Programmieren von Rätseln und beim Code Golf Stack Exchange. Das ist eine gute Antwort. (ab) Verwendung von Built-Ins ist ideal zum Golfen. Mir ist aufgefallen, dass Ihre Antwort tatsächlich 1 Byte Iist und die anderen 3 Byte nur die Funktion aufrufen. Das würde Ihre Antwort zu einer der niedrigsten bei dieser Herausforderung machen! :-)
wizzwizz4
4

Pyth, 8 Bytes

mmsqdkQQ

Probieren Sie es hier aus .

Lirtosiast
quelle
1
Ich muss sagen, es ist höchst ungewöhnlich, dass die Pyth-Antwort viermal länger ist als die kürzeste ...
ETHproductions
Hrm, das war das Beste, was ich bekommen konnte, das zu 100% gültig aussieht, aber ich habe herausgefunden, dass qRRQQdas zu funktionieren scheint, außer Sie bekommen Trueund Falseanstelle von 1und 0, jedoch erfordert das Beheben dieses Problems die Verwendung von drei Bytes, sMMwofür es nicht hilft ...
FryAmTheEggman
@FryAmTheEggman Ich habe auch qRRQQ gefunden. Ich habe eine Reihe anderer Programme ausprobiert, von denen keines kürzer war.
Lirtosiast
4

Python 3.5 mit NumPy - 57 49 30 Bytes

import numpy
numpy.identity

NumPy.identity nimmt eine Ganzzahl n auf und gibt eine Identitätsmatrix von n zurück. Diese Antwort ist über diese Richtlinie zulässig .

linkian209
quelle
4
Eigentlich halte ich import numpy\nnumpy.identitydas für eine legitime Antwort .
FryAmTheEggman
Danke für den Tipp @MorganThrapp! Und @FryAmTheEggman, meinst du, dass meine Antwort einfach import numpy\nnumpy.identity()30 Bytes sein könnte?
Linkian209
Ich war so verwirrt von \ nnumpy lol ... Dies wäre auch gültig, @FryAmTheEggman, nein? from numpy import identity. 26 Bytes.
Ogaday
Siehe auch meine Antwort etwas ähnliches
Ogaday
@Ogaday Ich halte das nicht für richtig, die von Ihnen angegebene Zeile wird nicht für eine Funktion ausgewertet. Sie müssten tun from numpy import identidy\nidentity(in diesem Fall wäre es kürzer, *anstelle der spezifischen eingebauten zu verwenden)
FryAmTheEggman
4

Mathematica, 35 Bytes

ohne Verwendung von IdentityMatrix

Table[Boole[i==j],{i,1,#},{j,1,#}]&
Ein Simmons
quelle
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>

Washington Guedes
quelle
4

Japt, 14 12 10 Bytes

Uo £Z®¥X|0

Online testen! Hinweis: Diese Version verfügt über einige zusätzliche Bytes, um die Ausgabe hübsch zu drucken.

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
ETHproductions
quelle
4

Brain-Flak , 206 170 162 Bytes

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

Probieren Sie es online!

Weizen-Assistent
quelle
3

K, 7 Bytes

t=\:t:!

Nehmen Sie das Gleichheitskreuzprodukt zweier Vektoren, die [0, n) enthalten.

In Aktion:

  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)
JohnE
quelle
3

Java, 60 Bytes

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

Erstellt ein 2D-Array und ersetzt Elemente, bei denen Zeile und Spalte gleich sind 1.

TNT
quelle
Sie müssen das nachgestellte Semikolon nicht zur Byteanzahl für Java-Lambda-Antworten hinzufügen.
Kevin Cruijssen
3

CJam, 7 Bytes

{,_ff=}

Dies ist ein Codeblock, der eine Ganzzahl aus dem Stapel entfernt und ein 2D-Array zurückschiebt.

Probieren Sie es online!

Dennis
quelle
3

Mathematica, 14 Bytes

IdentityMatrix

Testfall

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

Perl, 39 33 Bytes

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

Vielen Dank an Ton Hospel für die Einsparung von 6 Bytes

Laufen mit dem -EPerlrun:

$ echo 3 | perl -E'@%=1..<>;$a=$_,say map{$a==$_|0}@%for@%'
100
010
001
undlrc
quelle
Ein bisschen mehr Golf spielen: /$/,say map$`==$_|0,@%for@%=1..<>oder noch besser, //,say map$'==$_|0,@%for@%=1..<>aber so kann man es nicht mehr in einfache Anführungszeichen setzen
Ton Hospel
@TonHospel Wow, das ist cool, danke. Letzteres würde die Verwendung von printanstelle von say erfordern , da -Ees nur in der Befehlszeile frei ist.
andlrc