Kimlik Matrisini Oluştur


43

Zorluk çok basittir. Bir tamsayıdır giriş verilen nçıkış, n x nbirim matris. Kimlik matrisi, 1yukarıdan aşağıya ve sağdan aşağıya doğru yayılmış olandır. Oluşturduğunuz kimlik matrisini döndürecek ya da çıkaran bir program ya da işlev yazacaksınız. Çıktınız 2B dizi veya boşluk / sekme ve yeni satırlarla ayrılmış sayılar olabilir.

Örnek giriş ve çıkış

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.

Bu , yani bayt cinsinden en kısa kod kazanır.


1
Bir tamsayı girişi verildiğinde n ... - Sanırım doğal bir sayı mı demek istiyorsun?
Jonathan Frech

Yanıtlar:


26

MATL, 2 bayt

Xy

Octave cevabımın çevirisi.

Çevrimiçi deneyin.

Dahili olmayan 4 baytlık bir versiyon (Luis Mendo sayesinde):

:t!=
:     take input n and a generate row array [1,2,...n]
 t    duplicate
  !   zip
   =  thread compare over the result

7
Bu çok karmaşık kodu çevirmek zor olmalı: D
kusuru 18

11
@flawr Hiçbir fikrin yok. Bu gerçekten benim şaheserim.
Bir spaghetto


1
Şimdi neden sorduğunu anlıyorum! :-D
Luis Mendo

5
Yerleşik olmadan::t!=
Luis Mendo,

20

TI-BASIC, 2 bayt

identity(Ans

Eğlenceli bir gerçek: bir listesini almak için en kısa yol {N,N}olduğunu dim(identity(N.

İşte yerleşik olmayan en kısa yol, 8 bayt:

randM(Ans,Ans)^0

randM(-9 ile 9 arasındaki tüm tam sayıların girişlerini içeren rastgele bir matris yaratır (çünkü tuhaf bir şekilde özeldir). Daha sonra bu matrisi 0'ıncı güce çıkardık.


1
" Bu çok garip geliyor çünkü " TI-BASIC çok garip. O_o
Doorknob

Tabi lan. TI-BASIC. +1
bearacuda13

bir listesini almak için en kısa yol değildir {N,N}umm, {N,N}?
Cyoce,

1
@Cyoce Hayır; dim(ve identity(her biri bayttır, çünkü TI-BASIC belirtilmiştir.
lirtosiast


16

APL, 5 bayt

∘.=⍨⍳

Bu, sağdaki bir tamsayıyı kabul eden ve kimlik matrisini döndüren monadik bir fonksiyon trenidir.

Burada dene


14

Octave, 10 4 bayt

@eye

Sayı alan nve kimlik matrisini döndüren adsız bir işlev döndürür.


@eyeyeterli.
kusur,

@flawr Teşekkürler, böyle yapmanın bir yolu olduğunu biliyordum ama hep unutuyorum: P
bir

eyekimlik matrisini çok / bazı sayısal yönelimli dillerde üretir.
kusur,

Ne yapar @?
Cyoce

@Cyoce @"function handle işleci" dir, lambdabelirli bir işleve bir referans olarak işlev görür, örneğin @(x)x.^2kare alma işlevidir ve @sqrtkarekök işlevine bir referanstır. Bununla ilgili daha fazla bilgiyi burada bulabilirsiniz
Giuseppe

12

R, 4 bayt

diag

Bir matris verildiğinde, matrisin diagköşegenini döndürür. Bir tamsayıyı verilen, ancak n, diag(n)kimlik matris verir.

Çevrimiçi deneyin


11

Python 2,42 bayt

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

Anonim bir işlev, gibi çıktı üretir [(1, 0, 0), (0, 1, 0), (0, 0, 1)],

İlk olarak, listesini oluşturur ([1]+[0]*n)*n, kendisi için n=3böyle görünüyor

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

Kullanılması zip / iter kandırmak zip(*[iter(_)]*n grupları yapmak için nverir

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

Not 1kimlik matrisi vererek daha sonra her seferinde bir tane endeksi geliyor. Ancak, kaldırılmış olan ekstra bir sıfır sırası var [:n].


1
/ ITER hile ustaca olduğunu zip Damn
seequ

10

Jöle, 4 bayt

R=€R

Yerleşik kullanmaz. Çevrimiçi deneyin!

Nasıl çalışı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
Bu kod kabul edilemez derecede uzun.
kusur,

5
@flawr En kısa olanın uzunluğunun iki katı. Bu gerçekten alışılmadık bir karşılaşma.
Rainer P.

1
@flawr Evet ve daha kısa J . BAŞARISIZ!
Ad'm

2
Jelly modern versiyonlarında , iki bayttır ve daha uzun cevaplarla eğlenir.
Lynn

@Lynn Bu hala en kısa olanından iki kat daha uzun.
Adám

10

J, 4 bayt

=@i.

Bu bir tamsayı alan ve matrisi döndüren bir işlevdir.


Sanırım 3'te yapabilirsin:=i.
Sam Elliott

@SamElliott çalışmıyor. Örneğin, (=i.) 10=>0 0 0 0 0 0 0 0 0 0
Cyoce

9

Haskell, 43 37 bayt

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

Oldukça basit, birisinin daha iyisini yapabileceğini düşünüyorum.

Düzenleme: Ørjan Johansen sayesinde bazı baytlar atıldı


7
Hile edebilirsiniz fromEnumolarak sum[1|x==y].
Xnor

içinde boşluk kaldırabilirsiniz oldukça eminfromEnum (y==x)
Cyoce

@xnor daha kısa bir bayt: 0^abs(x-y).
Ørjan Johansen

1
@xnor Oh, 0^(x-y)^2kendinizi daha kısa sürede başka bir cevapta kullandınız .
Ørjan Johansen

@ ØrjanJohansen Evet, yorumunuzu görmek güzel zamanlama oldu :)
xnor

8

Pyth, 7 bayt

XRm0Q1Q

Çevrimiçi deneyin: Gösteri

Sıfırlar matrisi oluşturma ve köşegen elemanları ile değiştirir.


Finali kaldırarak bir bayttan tasarruf edebilirsinizQ
Jim

1
@jim Teşekkürler, ama buna gerçekten izin verilmez. Özelliği (sonunda örtülü Q) meydan okuma yapıldıktan sonra uygulandı.
Jakube

7

JavaScript ES6, 68 62 52 bayt

@Neil'den gelen temiz numara ile 10 byte kurtarıldı

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

@ Cᴏɴᴏʀ O'Bʀɪᴇɴ'lerden farklı bir yaklaşım denemek. Muhtemelen geliştirilebilirdi.


Bu beni yeneceğini öğrenmek için aşağı inmeden önce yazdığım tam olarak buydu.
Neil

Bu yüzden, meydan okumanıza cevap olarak, size x=>[...Array(x)].map((_,y,x)=>x.map((_,z)=>+(y==z)))10 baytlık bir tasarruf için açık olanı ( açık görüş) veririm .
Neil

@Neil Çok teşekkürler! Bunun cevabın püf noktası olduğunu söyleyeceğim.
ETHProductions

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

7

Retina , 25

Ekstra golf oynamak için @randomra ve @Martin'e teşekkür ederiz.

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

Çevrimiçi deneyin.

Unutmayın ki bu giriş bir tekli olarak kabul edilir. Bu kabul edilebilir değilse, o zaman ondalık giriş aşağıdaki gibi verilebilir:

Retina, 34

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

Çevrimiçi deneyin.


3
... dalga. Retina, regex'ten daha fazlası için bir dil olarak güçlü hale geliyor.
ETHProductions

@ETHproductions evet, bu hemen hemen tüm regex ikame cevaptır. Özel olan tek şey $*0n sayısını n ile değiştirmek 0.
Dijital Travma,

6

Haskell, 54 bayt

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

fn girişi için kimlik matrisini döndürür. Optimal olmaktan uzak.


Bir mapçağrı yerine bir liste anlama özelliğini kullanarak bir avuç bayttan tasarruf edebilirsiniz.
Matematiksel

6

Lua, 77 75 65 bayt

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

İki dönem bitiştirme ile Lua'nın bunun için en iyi dil olup olmadığından emin değilim. Yapılması gereken herhangi bir gelişme olup olmadığını göreceğim.

DÜZENLE:

Kaza konusunda oldukça garip bulduğum bir şey buldum ama işe yarıyor.

Lua'da herkes değişkenlere fonksiyonlar atayabileceğinizi biliyor. Bu, daha kullanışlı CodeGolf özelliklerinden biridir.

Bunun yerine:

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

Bunu yapabilirsiniz:

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

Fakat bekleyin, Lua bir miktar OOP'a izin verir. Böylece potansiyel olarak bile yapabilirsiniz:

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

Bu da işe yarayacak ve karakterleri kesecek.

Şimdi burada tuhaf kısım geliyor. Herhangi bir noktada bir dize atamanıza bile gerek yok. Basitçe yapıyorum:

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

Çalışacak.


Böylece farkı görsel olarak görebilir, golfün sonuçlarına bir göz atabilirsiniz:

String.sub kullanımı (88 karakter)

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

String.sub değişkenine atama (65 karakter)

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

Bir OOP yaklaşımı kullanarak string.sub atama (64 karakter)

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

String.sub atama .. nil yaklaşımı kullanarak? (60 karakter)

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

Birisi bunun neden işe yaradığını bilirse, ilgilenirim.


"Z.rep" satırı benimkine çarpıyor. Bahse girerim bir yerlerde az = '' olmalı? Daha kısa bir z = '' z.rep varyantı sadece ('') .rep olacaktır. Ayrıca giriş okumak için cmdline ... 'ı kullanabilir ve bayt sayısını 57'ye kadar aşağıya çekebilirsiniz: z =' 0 'i = 1 için, ... baskı yap (z: rep (i-1) .. 1 ..z: rep (...- i)) bitişi
thenumbernine

Daha önce ("") .rep öneren birini buldum ama çalışmasını sağlayamadım. Her zaman hata yapardı. Belki tercümanım burada sorun var. Bu komut satırı girişiyle ilgili herhangi bir belge bulmakta zorlanıyorum, nerede bulunabileceğini biliyor musunuz?
Skyl3r

6

Python 3, 48

Sp3000 sayesinde 1 bayt kurtarıldı.

Tek satırda çözebileceğim zorlukları seviyorum. Oldukça basit, içeri aktarılan int uzunluğuna eşit 1 ile 0 arasında bir çizgi oluşturun. 2d dizisi olarak çıktılar. Parçayı:: in'den sonra kaydırırsanız, '\n'.join()hoş bir şekilde basar.

lambda x:[[0]*i+[1]+[0]*(x+~i)for i in range(x)]

2
x-i-1 -> x+~i
Sp3000,

5

C, 59 veya 59 56 veya 56

Aynı uzunluktaki iki versiyon.

Anadolgun önerisinden dolayı 3 bayt kurtarıldı: (n+1)->~n

Dolaşır igelen n*n-1sıfıra. İ% (n + 1) sıfırsa, aksi takdirde 0 ise 1 olarak yazdırır i%n.

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çok sıkıcı. Yerine ~nkullanın!
anatolyg,

Teşekkürler! Bunu fark etmeliydim, çünkü bugün NBZ'nin meydan okumasına baktığımda başıma geldi.
Seviye Nehri St

C'ye çok aşina değilim. Ne yapar i;?
Cyoce

@Cyoce i;sadece değişkeni bildirir i. C'de, kullanmadan önce bir değişkeni bildirmeniz gerekir, böylece derleyiciye ne kadar bellek tahsis edileceğini bilmesi için tip belirtilir. GCC derleyicisiyle bir tür belirtmezseniz, varsayıldığı varsayılır int.
Seviye Nehri St

1
İkinciden 1 bayt daha alabilirsiniz, sekmelere izin verildiğinden, 32'yi 9 ile değiştirebilirsiniz.
Bijan

5

Mata, 4 bayt

I(3)

Çıktı

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

Mata, Stata istatistik paketinde bulunan matris programlama dilidir. I (n), n * n boyutunda bir kimlik matrisi oluşturur


5
Programming Puzzles ve Code Golf Stack Exchange'e hoş geldiniz. Bu iyi bir cevap; (ab) Yerleşiklerin kullanımı golf oynamak için mükemmeldir. Cevabınızın aslında 1 byte olduğunu fark ettim: Ive diğer 3 byte sadece fonksiyonu çağırıyor. Bu, cevabınızı bu sorunun en düşüklerinden biri yapar! :-)
wizzwizz4


4

Pyth, 8 bayt

mmsqdkQQ

Burada dene .



Hrm, bu% 100 geçerli olduğu görünüyor olsun edebildi iyi, ama find fonksiyonu qRRQQalmak dışında işe görünüyor Trueve Falseyerine 1ve 0ancak bu afaik sabitlemek için üç bayt kullanarak gerektirir sMMyardım etmez ki ...
FryAmTheEggman

@ FryAmTheEggman Ayrıca qRRQQ bulundu. Başka programlar da denedim ve hiçbiri daha kısa sürmedi.
lirtosiast,

4

NumPy ile Python 3.5 - 57 49 30 bayt

import numpy
numpy.identity

NumPy.identity, n bir tamsayı alır ve bir n kimlik matrisi döndürür. Bu cevaba bu politika aracılığıyla izin verilir .


4
Aslında ben inanıyorum import numpy\nnumpy.identitybir olduğunu makul bir cevap .
FryAmTheEggman

@MorganThrapp bahşişiniz için teşekkürler! Ve @FryAmTheEggman, cevabımın sadece import numpy\nnumpy.identity()30 bayt olabileceği anlamına mı geliyorsun ?
linkian209

\ Nnumpy lol ile kafam çok karıştı ... Bu da geçerli olurdu, @FryAmTheEggman, hayır? from numpy import identity. 26 bayt.
Ogaday

Ayrıca, cevabım şey görmek benzer
Ogaday

@Günümüzde bunun doğru olduğunu sanmıyorum, verdiğiniz satır bir işlevi değerlendirmiyor. Yapmanız gerekir from numpy import identidy\nidentity(bu durumda *belirli yerleşik yerine kullanmak daha kısa olurdu )
FryAmTheEggman

4

Mathematica, 35 Bayt

IdentityMatrix kullanmadan

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 bayt

Uo £Z®¥X|0

Çevrimiçi test edin! Not: Bu sürümde çıktıyı güzel bir şekilde yazdırmak için fazladan birkaç bayt vardır.

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 bayt

t=\:t:!

[0, n) içeren iki vektörün eşitlik çapraz ürününü alın.

Eylemde:

  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 bayt

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

2B dizi oluşturur ve satır ile sütunun eşit olduğu öğeleri değiştirir 1.


Java lambda cevapları için izleyen noktalı virgül bayt-sayıma eklemek zorunda değilsiniz.
Kevin Cruijssen


3

Mathematica, 14 bayt

IdentityMatrix

Test durumu

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

3

Perl, 39 33 bayt

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

6 byte tasarruf için Ton Hospel sayesinde

-EPerlrun ile çalıştırma :

$ echo 3 | perl -E'@%=1..<>;$a=$_,say map{$a==$_|0}@%for@%'
100
010
001

Biraz daha fazla golf /$/,say map$`==$_|0,@%for@%=1..<>//,say map$'==$_|0,@%for@%=1..<>
oynamak

@TonHospel Vay bu harika, teşekkürler. Daha sonra printsöylenenin yerine kullanılması gerekecekti , çünkü -Esadece komut satırında ücretsiz.
andlrc 14.06.26
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.