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.


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

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


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 .


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


14

Oktawa, 10 4 bajty

@eye

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


@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


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


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.

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.


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


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.


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


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.


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.


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.


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)]

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

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


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 .


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 .


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,#}]&


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


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)

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.


Nie trzeba dodawać końcowego średnika do liczby bajtów dla odpowiedzi Java lambda.
Kevin Cruijssen


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}} *)

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.