Skonstruuj macierz tożsamości

43

Wyzwanie jest bardzo proste. Biorąc pod uwagę liczbę całkowitą n, n x nwyślij macierz tożsamości. Matryca tożsamości obejmuje matrycę 1od lewego górnego do prawego dolnego rogu. Napisz program lub funkcję, która zwróci lub wyśle ​​utworzoną macierz tożsamości. Twój wynik może być tablicą 2D lub liczbami oddzielonymi spacjami / tabulatorami i znakami nowej linii.

Przykładowe wejście i wyjście

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.

To jest , więc wygrywa najkrótszy kod w bajtach.

Seadrus
źródło
1
Biorąc pod uwagę liczbę całkowitą n ... - Zakładam, że masz na myśli liczbę naturalną?
Jonathan Frech,

Odpowiedzi:

26

MATL, 2 bajty

Xy

Tłumaczenie mojej odpowiedzi Octave.

Wypróbuj online.

Wersja 4-bajtowa bez wbudowanych (dzięki Luis Mendo):

:t!=
:     take input n and a generate row array [1,2,...n]
 t    duplicate
  !   zip
   =  thread compare over the result
spaghetto
źródło
7
Przetłumaczenie tego bardzo wyrafinowanego kodu musiało być trudne: D
flawr
11
@flawr Nie masz pojęcia. To naprawdę moje arcydzieło.
spaghetto
1
Teraz rozumiem, dlaczego pytałeś! :-D
Luis Mendo
5
Bez wbudowanych::t!=
Luis Mendo
20

TI-BASIC, 2 bajty

identity(Ans

Ciekawostka: najkrótszą drogą do uzyskania listy {N,N}jest dim(identity(N.

Oto najkrótsza droga bez wbudowanego, w 8 bajtów:

randM(Ans,Ans)^0

randM(tworzy losową macierz z wpisami zawierającymi wszystkie liczby całkowite od -9 do 9 włącznie (brzmi to dziwnie specyficznie, ponieważ tak jest). Następnie przenosimy tę macierz na zerową potęgę.

lirtosiast
źródło
1
brzmi to dziwnie specyficznie, ponieważ jest ” TI-BASIC jest dziwny. O_o
Klamka
O tak. TI-BASIC. +1
bearacuda13
Nie jest to najkrótsza droga, aby otrzymać listę {N,N}, umm, {N,N}?
Cyoce
1
@Cyoce No; dim(i identity(każdy ma jeden bajt, ponieważ TI-BASIC jest tokenizowany.
lirtosiast
19

Julia, 9 3 bajty

eye

Jest to tylko wbudowana funkcja, która przyjmuje liczbę całkowitą ni zwraca nxn Array{Float64,2}(tj. Tablicę 2D). Nazwij to jak eye(n).

Pamiętaj, że przesłanie tego formularza jest dopuszczalne zgodnie z niniejszymi zasadami .

Alex A.
źródło
Widzę, co tu zrobiłeś! Niezłe!
Ismael Miguel
Działa to również w Math.JS
ATaco
16

APL, 5 bajtów

∘.=⍨⍳

Jest to monadyczny ciąg funkcji, który akceptuje liczbę całkowitą po prawej stronie i zwraca macierz tożsamości.

Wypróbuj tutaj

Alex A.
źródło
14

Oktawa, 10 4 bajty

@eye

Zwraca anonimową funkcję, która pobiera liczbę ni zwraca macierz tożsamości.

spaghetto
źródło
@eyejest wystarczający.
flawr
@flawr Dzięki, wiedziałem, że jest na to sposób, ale zawsze zapominam: P
spaghetto
eyetworzy macierz tożsamości w wielu / niektórych językach zorientowanych numerycznie.
flawr
Czego @zrobić?
Cyoce,
@Cyoce @jest „operatorem uchwytu funkcji”, działa jak a, lambdaa także jako odniesienie do określonej funkcji, więc na przykład @(x)x.^2jest funkcją kwadratu i @sqrtjest odniesieniem do funkcji pierwiastka kwadratowego. Możesz przeczytać więcej na ten temat tutaj
Giuseppe
12

R, 4 bajty

diag

Po otrzymaniu macierzy diagzwraca przekątną macierzy. Jednakże, gdy otrzyma liczbę całkowitą n, diag(n)zwraca macierz identyczności.

Wypróbuj online

Alex A.
źródło
11

Python 2, 42 bajty

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

Anonimowa funkcja, jak produkuje wyjście [(1, 0, 0), (0, 1, 0), (0, 0, 1)],

Najpierw tworzy listę ([1]+[0]*n)*n, która n=3wygląda jak

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

Używanie sztuczki zip / iter zip(*[iter(_)]*n do tworzenia grup ndarów

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

Zauważ, że 1przychodzi jeden indeks później za każdym razem, podając macierz tożsamości. Ale istnieje dodatkowy wiersz zerowy, który jest usuwany za pomocą [:n].

xnor
źródło
1
Cholera, ta sztuczka zip / iter jest genialna
patrz
10

Galaretka, 4 bajty

R=€R

Nie używa wbudowanego. Wypróbuj online!

Jak to działa

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
źródło
25
Ten kod jest niedopuszczalnie długi.
flawr
5
@flawr Dwukrotnie długość najkrótszego. To rzeczywiście niezwykłe spotkanie.
Rainer P.
1
@flawr Tak, i nie krótszy niż J . ZAWIEŚĆ!
Adám
2
W nowoczesnych wersjach Galaretki ma dwa bajty i żartuje z dłuższych odpowiedzi.
Lynn,
@ Lynn To wciąż dwa razy dłużej niż najkrótszy.
Adám
10

J, 4 bajty

=@i.

Jest to funkcja, która pobiera liczbę całkowitą i zwraca macierz.

marinus
źródło
Myślę, że możesz to zrobić w 3:=i.
Sam Elliott
@SamElliott, który nie działa. Na przykład (=i.) 10=>0 0 0 0 0 0 0 0 0 0
Cyoce
9

Haskell, 43 37 bajtów

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

Całkiem proste, choć myślę, że można zrobić lepiej (bez języka, który ma już tę funkcję wbudowaną, jak wielu zrobiło).

Edycja: upuścił kilka bajtów dzięki Ørjan Johansen

Sheridan Grant
źródło
7
Możesz oszukać fromEnumjak sum[1|x==y].
xnor
całkiem pewne, że możesz usunąć miejsce wfromEnum (y==x)
Cyoce
@ xnor Jeden bajt krótszy niż:: 0^abs(x-y).
Ørjan Johansen
1
@ xnor Och, właśnie użyłeś 0^(x-y)^2siebie w innej odpowiedzi, nawet krótszej.
Ørjan Johansen
@ ØrjanJohansen Tak, widzenie twojego komentarza było miłym terminem :)
xnor
8

Pyth, 7 bajtów

XRm0Q1Q

Wypróbuj online: Demonstracja

Tworzenie macierzy zer i zamiana elementów ukośnych na jedynki.

Jakube
źródło
Możesz zapisać jeden bajt, usuwając ostatniQ
Jim
1
@jim Dzięki, ale tak naprawdę nie byłoby to dozwolone. Funkcja (domyślnie Q na końcu) została zaimplementowana po opublikowaniu wyzwania.
Jakube
7

JavaScript ES6, 68 62 52 bajty

Oszczędność 10 bajtów dzięki zgrabnej sztuczce z @Neil

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

Próbuję innego podejścia niż @ Cᴏɴᴏʀ O'Bʀɪᴇɴ. Można ewentualnie poprawić.

ETHprodukcje
źródło
Właśnie to napisałem, zanim przewinąłem w dół, aby dowiedzieć się, że mnie pobiłeś.
Neil
Tak więc, w odpowiedzi na twoje wyzwanie, daję ci (z perspektywy czasu) oczywistość x=>[...Array(x)].map((_,y,x)=>x.map((_,z)=>+(y==z)))za oszczędność 10 bajtów.
Neil
@Neil Wielkie dzięki! Wspomnę, że to twoja sztuczka w odpowiedzi.
ETHproductions
x=>[...Array(x)].map((_,y,x)=>x.map(_=>+!y--))
l4m2
7

Siatkówka , 25

Podziękowania dla @randomra i @Martin za dodatkowe gry w golfa.

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

Wypróbuj online.

Zauważ, że przyjmuje to dane wejściowe jako jednoargumentowy. Jeśli nie jest to do przyjęcia, można wprowadzić dane dziesiętne w następujący sposób:

Retina, 34

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

Wypróbuj online.

Cyfrowa trauma
źródło
3
... whoa. Retina staje się potężnym językiem od czegoś więcej niż wyrażeń regularnych.
ETHprodukcje
@ETHproductions tak, choć jest to odpowiedź prawie na wszystkie podstawienia wyrażeń regularnych. Jedyną specjalną rzeczą jest zastosowanie $*0zamiany liczby n na n 0s.
Cyfrowa trauma
6

Haskell, 54 bajty

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

fzwraca macierz tożsamości dla wejścia n. Dalekie od optymalnego.

ThreeFx
źródło
Możesz zaoszczędzić garść bajtów, używając listy zamiast mappołączenia.
MathematicalOrchid
6

Lua, 77 75 65 bajtów

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

Cóż, nie jestem pewien, czy lua jest najlepszym językiem do tego z konkatenacją dwóch okresów ... Ale hej, jest na to szansa. Zobaczę, czy należy wprowadzić jakieś ulepszenia.

EDYTOWAĆ:

Odkryłem coś przypadkowego, co wydaje mi się dość dziwne, ale działa.

W Lua wszyscy wiedzą, że masz możliwość przypisywania funkcji do zmiennych. Jest to jedna z bardziej przydatnych funkcji CodeGolf.

Oznacza to zamiast:

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

Możesz to zrobić:

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

Ale czekaj, Lua pozwala na pewną ilość OOP. Więc potencjalnie możesz nawet zrobić:

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

To też zadziała i tnie postacie.

Teraz nadchodzi dziwna część. W żadnym momencie nie musisz nawet przypisywać łańcucha. Po prostu robiąc:

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

Będzie działać.


Aby wizualnie zobaczyć różnicę, spójrz na to:

Używanie string.sub (88 znaków)

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

Przypisywanie string.sub do zmiennej (65 znaków)

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

Przypisywanie string.sub przy użyciu metody OOP (64 znaki)

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

Przypisywanie string.sub przy użyciu podejścia .. zero? (60 znaków)

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

Jeśli ktoś wie, dlaczego to działa, byłbym zainteresowany.

Skyl3r
źródło
Linia „z.rep” pęka na mojej. Założę się, że gdzieś powinno być az = ''? Krótszym wariantem z = '' z.rep byłoby po prostu ('') .rep. Możesz także użyć cmdline ... do odczytu danych wejściowych i rozszerzyć liczbę bajtów do 57 w następujący sposób: z = '0' dla i = 1, ... drukuj (z: rep (i-1) .. 1 ..z: rep (...- i)) koniec
numer 02
Znalazłem kogoś sugerującego („”) .rep wcześniej, ale nie byłem w stanie zmusić go do działania. Zawsze błądziło. Być może problem stanowi mój tłumacz. Próbuję znaleźć dokumentację dotyczącą tego wiersza poleceń, czy wiesz, gdzie można ją znaleźć?
Skyl3r
6

Python 3, 48

Zaoszczędzono 1 bajt dzięki sp3000.

Uwielbiam wyzwania, które mogę rozwiązać w jednym wierszu. Całkiem proste, zbuduj linię z 1 i 0 równą długości przekazywanej wartości int. Wyjście jako tablica 2d. Jeśli owiniesz część po: in '\n'.join(), wydrukuje się całkiem.

lambda x:[[0]*i+[1]+[0]*(x+~i)for i in range(x)]
Morgan Thrapp
źródło
2
x-i-1 -> x+~i
Sp3000 28.01.16
5

C, 59 lub 59 56 lub 56

Dwie wersje o identycznej długości.

3 bajty zapisane z powodu sugestii anatolyga: (n+1)->~n

Iteruje iod n*n-1zera. Drukuje 1, jeśli i% (n + 1) wynosi zero, w przeciwnym razie 0. Następnie drukuje nową linię, jeśli i%n= 0, w przeciwnym razie spacja.

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
źródło
1
n+1jest zbyt nudny. Użyj ~nzamiast tego!
anatolyg
Dzięki! Powinienem to zauważyć, ponieważ przyszło mi to do głowy, kiedy spojrzałem dziś na wyzwanie NBZ.
Level River St
Nie znam zbyt dobrze C. Co robi i;?
Cyoce,
@Cyoce i;tylko deklaruje zmienną i. W C zawsze musisz zadeklarować zmienną przed użyciem, wskazując typ, aby kompilator wiedział, ile pamięci do przydzielenia. W przypadku kompilatora GCC, jeśli nie określisz typu, to jest on zakładany int.
Level River St
1
Możesz usunąć jeszcze 1 bajt z drugiego, ponieważ karty są dozwolone, możesz zamienić 32 na 9
Bijan
5

Mata, 4 bajty

I(3)

Wynik

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

Mata jest językiem programowania matrycowego dostępnym w pakiecie statystycznym Stata. I (n) tworzy macierz tożsamości o rozmiarze n * n

Gość0101
źródło
5
Witamy w Programowaniu łamigłówek i wymianie stosów kodów golfowych. To dobra odpowiedź; (ab) użycie wbudowanych elementów jest świetne do gry w golfa. Zauważyłem, że twoja odpowiedź to tak naprawdę 1 bajt: Ia pozostałe 3 bajty po prostu wywołują funkcję. Dzięki temu Twoja odpowiedź będzie jedną z najniższych w tym wyzwaniu! :-)
wizzwizz4,
4

Pyth, 8 bajtów

mmsqdkQQ

Wypróbuj tutaj .

lirtosiast
źródło
1
Muszę powiedzieć, że to bardzo niezwykłe, że odpowiedź Pyth jest cztery razy dłuższa niż najkrótsza odpowiedź ...
ETHproductions
Hmm, to był najlepszy, jaki był w stanie uzyskać, który wygląda w 100% poprawne, ale nie znaleźliśmy qRRQQktóry wydaje się działać z wyjątkiem dostać Truei Falsezamiast 1a 0jednak ustalenie tej AFAIK wymaga zastosowania trzech bajtów dla sMMktórych nie pomaga ...
FryAmTheEggman
@FryAmTheEggman Znalazłem również qRRQQ. Wypróbowałem wiele innych programów i żaden z nich nie był krótszy.
lirtosiast
4

Python 3.5 z NumPy - 57 49 30 bajtów

import numpy
numpy.identity

NumPy.identity przyjmuje liczbę całkowitą n i zwraca macierz tożsamości n według n. Ta odpowiedź jest dozwolona za pośrednictwem tej zasady .

linkian209
źródło
4
Właściwie uważam, że import numpy\nnumpy.identityjest to uzasadniona odpowiedź .
FryAmTheEggman
Dzięki za wskazówkę @MorganThrapp! I @FryAmTheEggman, masz na myśli, że moja odpowiedź może mieć tylko import numpy\nnumpy.identity()30 bajtów?
linkian209
Byłem tak zdezorientowany \ nnumpy lol ... To też byłoby ważne, @FryAmTheEggman, nie? from numpy import identity. 26 bajtów.
Ogaday
Zobacz także moją odpowiedź na coś podobnego
Ogaday
@Ogaday Nie sądzę, aby było to poprawne, podana linia nie jest oceniana jako funkcja. Trzeba by to zrobić from numpy import identidy\nidentity(w takim przypadku użycie krótszego *zamiast konkretnego wbudowanego)
FryAmTheEggman
4

Mathematica, 35 bajtów

bez użycia IdentityMatrix

Table[Boole[i==j],{i,1,#},{j,1,#}]&
Simmons
źródło
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
źródło
4

Japt, 14 12 10 bajtów

Uo £Z®¥X|0

Przetestuj online! Uwaga: ta wersja ma kilka dodatkowych bajtów, aby dość wydrukować wydruk.

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
ETHprodukcje
źródło
4

Brain-Flak , 206 170 162 bajtów

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

Wypróbuj online!

Kreator pszenicy
źródło
3

K, 7 bajtów

t=\:t:!

Weź iloczyn krzyżowy równości dwóch wektorów zawierających [0, n).

W akcji:

  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
źródło
3

Java, 60 bajtów

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

Tworzy tablicę 2D i zastępuje elementy, w których wiersze i kolumny są równe 1.

TNT
źródło
Nie trzeba dodawać końcowego średnika do liczby bajtów dla odpowiedzi Java lambda.
Kevin Cruijssen
3

CJam, 7 bajtów

{,_ff=}

Jest to blok kodu, który wyrzuca liczbę całkowitą ze stosu i wypycha w zamian tablicę 2D.

Wypróbuj online!

Dennis
źródło
3

Mathematica, 14 bajtów

IdentityMatrix

Przypadek testowy

IdentityMatrix[4]
(* {{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}} *)
njpipeorgan
źródło
3

Perl, 39 33 bajtów

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

Dzięki Ton Hospel za oszczędność 6 bajtów

Uruchamianie z -Eperlrun:

$ echo 3 | perl -E'@%=1..<>;$a=$_,say map{$a==$_|0}@%for@%'
100
010
001
andlrc
źródło
Gra w golfa trochę więcej: /$/,say map$`==$_|0,@%for@%=1..<>a nawet lepiej, //,say map$'==$_|0,@%for@%=1..<>ale w ten sposób nie można już tego wyrazić w pojedynczych cytatach
Ton Hospel
@TonHospel Wow, to super, dzięki. Później wymagałoby użycia printzamiast zamiast powiedzieć, ponieważ -Ejest wolny tylko w wierszu poleceń.
andlrc