Побудуйте матрицю ідентичності


43

Завдання дуже просте. З урахуванням цілого введення nвиведіть n x nматрицю ідентичності Матриця ідентичності - це матриця, що має 1від верхнього лівого до нижнього правого краю. Ви напишете програму або функцію, яка повертає або виводить створену матрицю ідентичності. Вихідним може бути двовимірний масив або числа, розділені пробілами / вкладками та новими рядками.

Приклад введення та виведення

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 ... - Я припускаю, що ви маєте на увазі натуральне число?
Джонатан Фрех

Відповіді:


26

MATL, 2 байти

Xy

Переклад моєї відповіді Октави.

Спробуйте в Інтернеті.

4-байтна версія без вбудованих даних (завдяки Луїсу Мендо):

: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
Луїс Мендо

5
Без вбудованих::t!=
Луїс Мендо

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

Так, чорт візьми. ТІ-ОСНОВНІ. +1
bearacuda13

це не найкоротший спосіб отримати список {N,N}, гм {N,N},?
Cyoce

1
@Cyoce Ні; dim(і identity(кожен байт, тому що TI-BASIC є токенізованою.
lirtosiast

19

Джулія, 9 3 байти

eye

Це просто вбудована функція, яка приймає ціле число nі повертає nxn Array{Float64,2}(тобто 2D масив). Називай це так eye(n).

Зауважте, що подання цієї форми є прийнятним відповідно до цієї політики .


Я бачу, що ви там робили! Хороший!
Ісмаїл Мігель

Це також працює в Math.JS
ATaco


14

Октава, 10 4 байти

@eye

Повертає анонімну функцію, яка приймає число nі повертає матрицю ідентичності.


@eyeє достатнім.
flawr

@flawr Дякую, я знав, що є спосіб зробити це так, але я завжди забуваю: P
спагето

eyeвиробляє матрицю ідентичності в багатьох / деяких числово орієнтованих мовах.
недолік

Що робить @?
Cyoce

@Cyoce @- це "оператор керування функціями", він працює як a, 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

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
Цей код неприпустимо довгий.
flawr

5
@flawr Двічі довжина найкоротшої. Це справді незвична зустріч.
Райнер П.

1
@flawr Так, і не коротше , ніж J . НЕПРАВНО!
Адам

2
У сучасних версіях Jelly, це два байти, і висміює довші відповіді.
Лінн

@Lynn Це все-таки вдвічі довше, ніж найкоротший.
Adám

10

J, 4 байти

=@i.

Це функція, яка приймає ціле число і повертає матрицю.


Я думаю, ви можете це зробити в 3:=i.
Сем Елліотт

@SamElliott, який не працює. Наприклад, (=i.) 10=>0 0 0 0 0 0 0 0 0 0
Cyoce

9

Haskell, 43 37 байт

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

Досить прямо, хоча я думаю, що можна зробити краще (без мови, в якій вже є вбудована ця функція, як це зробили багато).

Редагувати: скинув кілька байт завдяки Ерджану Йохансену


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
Джим

1
@jim Дякую, але це насправді заборонено. Функція (неявна Q в кінці) була реалізована після опублікування виклику.
Якубе

7

JavaScript ES6, 68 62 52 байт

Збережено 10 байт завдяки акуратному трюку від @Neil

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

Спробуйте інший підхід, ніж @ Cᴏɴᴏʀ O'Bʀɪᴇɴ's. Можливо, можна вдосконалити.


Це саме те, що я писав, перш ніж прокручувати вниз, щоб дізнатися, що ти мене побив.
Ніл

Отже, відповідаючи на ваш виклик, я надаю вам (заднім числом) очевидний 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
... чего. Сітківка стає потужною як мова для більш ніж регулярного вираження.
ETHproductions

@ETHproductions так, хоча це відповідь майже на всі заміни регулярними виразками. Єдине особливе - використання $*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

Луа, 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

Ну, я не впевнений, чи найкраща мова для цього є луа з двома конкатенаціями періоду ... Але ей, в цьому є постріл. Я побачу, чи варто внести якісь поліпшення.

Редагувати:

Я вирішив щось випадково, що мені здається дивним, але це працює.

У Луї всі знають, що ти маєш можливість присвоювати функції змінним. Це одна з більш корисних функцій 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 ... для введення читання, а обмежуйте кількість балів до 57 так: z = '0'для i = 1, ... виконайте друк (z: rep (i-1) .. 1 ..z: rep (...- i)) кінець
тодішнє число

Раніше я знайшов когось, що пропонує ("") .rep, але мені не вдалося змусити його працювати. Це завжди виходило з помилки. Можливо, тут моя проблема перекладача. Я намагаюся знайти будь-яку документацію на вхід цього командного рядка, чи знаєте ви, де її можна знайти?
Skyl3r

6

Пітон 3, 48

Збережено 1 байт завдяки sp3000.

Я люблю виклики, які можу вирішити за один рядок. Досить просто: побудуйте рядок з 1 і 0, що дорівнює довжині переданої int. Виводиться у вигляді 2d масиву. Якщо ви загортаєте частину після: in '\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 байти збережено завдяки навіюванню з анатолігу: (n+1)->~n

Ітератує iвід n*n-1нуля. Друкує a 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 сьогодні.
Рівень річки Св.

Я не надто знайомий із С. Що робить i;?
Cyoce

@Cyoce i;просто оголошує змінну i. На C завжди потрібно оголосити змінну перед її використанням, вказуючи тип, щоб компілятор знав, скільки пам'яті потрібно виділити. Якщо компілятор GCC не вказав тип, він вважається таким int.
Рівень Рівер Сент

1
Ви можете зняти ще 1 байт другого, оскільки вкладки дозволені, ви можете замінити 32, на 9.
Bijan

5

Мата, 4 байти

I(3)

Вихідні дані

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

Mata - мова програмування матриць, доступна в статистичному пакеті Stata. I (n) створює матрицю ідентичності розміром n * n


5
Ласкаво просимо до головоломки програмування та обміну стека коду для гольфу. Це гарна відповідь; (аб) використання вбудованих модулів чудово підходить для гольфу. Я помітив, що ваша відповідь насправді 1 байт:, Iа інші 3 байти просто викликають функцію. Це зробить вашу відповідь однією з найнижчих на цей виклик! :-)
wizzwizz4


4

Pyth, 8 байт

mmsqdkQQ

Спробуйте тут .


1
Треба сказати, вкрай незвично, що відповідь Піта в чотири рази довший, ніж найкоротша відповідь ...
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 та повертає матрицю тотожності n. Ця відповідь можлива завдяки цій політиці .


4
Насправді я вважаю import numpy\nnumpy.identity, що це законна відповідь .
FryAmTheEggman

Дякую за пораду @MorganThrapp! І @FryAmTheEggman, ви маєте на увазі, що моя відповідь могла бути import numpy\nnumpy.identity()лише 30 байтами?
linkian209

Я так заплутався \ nnumpy lol ... Це також було б дійсно, @FryAmTheEggman, ні? from numpy import identity. 26 байт.
Огадай

Також дивіться у моїй відповіді щось подібне
Огадай

@Ogaday Я не думаю, що це правильно, рядок, який ви надали, не оцінює функцію. Вам знадобиться зробити це from numpy import identidy\nidentity(у такому випадку буде *замість конкретного вбудованого використовувати коротше )
FryAmTheEggman

4

Математика, 35 байт

без використання IdentityMatrix

Table[Boole[i==j],{i,1,#},{j,1,#}]&


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

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

Створює 2D масив і замінює елементи, у яких рядки та стовпці рівні 1.


Не потрібно додавати проміжну крапку з комою до підрахунку байтів для відповідей Java лямбда.
Кевін Кройсейсен


3

Математика, 14 байт

IdentityMatrix

Тестовий випадок

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

3

Perl, 39 33 байт

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

Завдяки Тонові Євангелії за збереження 6 байт

Запуск з -Eперлрун:

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

Гольфінг трохи більше: /$/,say map$`==$_|0,@%for@%=1..<>а ще краще, //,say map$'==$_|0,@%for@%=1..<>але так, але ви більше не можете його розміщувати в єдиних котируваннях
Тон Госпел

@TonHospel Нічого собі здорово, спасибі Пізніші зажадають використання printзамість сказати, тому що -Eце безкоштовно лише в командному рядку.
andlrc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.