Definisi
Sebuah matriks panah adalah matriks yang memiliki semua entri sama untuk 0 , kecuali orang-orang pada diagonal utama, baris atas dan kolom paling kiri. Dengan kata lain, matriksnya akan terlihat seperti ini:
* * * * * * * * 0 0 0 0 * 0 * 0 0 0 * 0 0 * 0 0 * 0 0 0 * 0 * 0 0 0 0 *
Di mana setiap * adalah entri yang bukan nol.
Tugas
Diberi matriks persegi bilangan bulat non-negatif, periksa apakah itu panah sesuai dengan definisi di atas.
Anda tidak boleh menggunakan ukuran matriks sebagai input, kecuali jika bahasa Anda setara dengan array adalah sesuatu seperti pointer dan panjang (seperti C). Itu akan selalu minimal 3 x 3.
Kode terpendek dalam byte di setiap bahasa menang.
Masukan dan keluaran
Anda dapat memilih di antara salah satu format berikut untuk menerima input:
- Matriks dalam jenis matriks asli (jika bahasa Anda memilikinya)
- 2D array 1 (array array 1D, masing-masing sesuai dengan satu baris)
- Array 1D (karena matriks selalu persegi)
- String (Anda memilih spasi, tapi tolong jangan menyalahgunakan ini dengan cara apa pun).
Ketika datang untuk memberikan output, Anda dapat melaporkan nilai kebenaran / kepalsuan mengikuti definisi masalah keputusan standar , atau memilih dua nilai yang berbeda dan konsisten.
Selain itu, Anda dapat mengambil input dan memberikan output melalui metode standar apa pun , dalam bahasa pemrograman apa pun , sambil memperhatikan bahwa celah ini dilarang secara default. Jika ingin memilih format lain atau tidak yakin tentang sesuatu, silakan tanyakan di komentar.
1: atau padanan bahasa Anda (daftar, vektor, dll.)
Contohnya
Mari kita lihat contoh-contoh berikut:
1 2 2 2 2 1 0 0 3 0 1 0 4 0 0 1
Ini adalah matriks panah (program Anda harus melaporkan nilai kebenaran), karena elemen-elemen pada diagonal utama adalah 1 1 1 1
, yang ada di baris paling atas 1 2 2 2
dan yang ada di kolom paling kiri 1 2 3 4
. Semua entri lainnya adalah 0 , jadi ini memenuhi semua persyaratan.
3 5 6 7 1 0 8 0 0
Matriks ini bukan panah karena ada 0 pada diagonal utama.
9 9 9 9 9 9 0 0 9 7 9 0 9 0 0 9
Yang ini juga bukan panah, karena mengandung angka 7 menggantikan angka 0 .
Lebih banyak kasus uji
Benar:
[[1, 1, 1], [1, 1, 0], [1, 0, 1]] [[1, 2, 3, 4], [1, 1, 0, 0], [1, 0, 1, 0], [1, 0, 0, 1]]] [[1, 2, 2, 2], [2, 1, 0, 0], [3, 0, 1, 0], [4, 0, 0, 1]]] [[34, 11, 35, 5], [56, 567, 0, 0], [58, 0, 679, 0], [40, 0, 0, 7]]
Falsy:
[[3, 5, 6], [7, 1, 0], [8, 0, 0]] [[9, 9, 9, 9], [9, 9, 0, 0], [9, 7, 9, 0], [9, 0, 0, 9]] [[1, 0, 3, 4], [1, 1, 0, 0], [1, 0, 1, 0], [1, 0, 0, 1]]] [[1, 6, 3, 4], [13, 2, 0, 6], [29, 0, 1, 0], [2, 0, 0, 4]]
sumber
Jawaban:
Javascript (ES6),
4847 byteDisimpan 1 byte berkat edc65
Pengembalian
false
untuk matriks panah dantrue
untuk matriks non-panah (diizinkan karena dua nilai berbeda dapat digunakan untuk mewakili benar dan salah)Kasus uji:
Tampilkan cuplikan kode
sumber
f=m=>m.some((r,y)=>r.some((c,x)=>(x*y&&x!=y)^!c))
f=
tentu saja;-)
J ,
2120191715 byte-4 byte terima kasih kepada @GalenIvanov.
Mengambil input sebagai matriks (peringkat 2 array).
Cobalah online!
Penjelasan
Biarkan edit sejarah menjadi pelajaran bagi Anda untuk tidak bermain golf dan menulis penjelasan pada saat yang sama.
Penjelasan visual
Perhatikan bahwa ini dilakukan pada REPL (input diberikan dimulai dengan tiga spasi dan output diberikan tanpa spasi utama). Karena itu, saya kadang-kadang menghilangkan fungsi komposisi seperti
@
dan&
karena hal-hal pada REPL dievaluasi dari kanan ke kiri (fungsi lebih kompleks).Misalkan Anda memiliki matriks sampel berikut:
Pertama, saya ingin menjelaskan (dan memberikan shoutout kepada) @ GalenIvanov cara yang sangat pintar untuk menghasilkan matriks identitas, yang adalah sebagai berikut
=&/:@}.
.Pertama, kita memotong matriks input (
}.
).Lalu kami mendapatkan indeks setiap baris akan berada di mana baris diurutkan menggunakan
/:
-grade.Perhatikan bahwa indeks yang dihasilkan unik : daftar tidak memiliki elemen duplikat (dan mengapa? Tidak ada cara untuk menempatkan dua elemen di posisi yang sama dalam sebuah array).
Akhirnya, kami menggunakan ceruk tetapi membantu
=
-diri-mengklasifikasikan. Monad ini membandingkan setiap elemen unik dengan semua elemen lain dalam array. Ingat bagaimana saya sebutkan itu penting bahwa indeks yang dihasilkan unik? Karena=
-diri-mengklasifikasikan melakukan perbandingan dalam urutan bahwa elemen unik muncul dalam daftar, output yang dihasilkan akan menjadi matriks identitas untuk input unik (inilah mengapa=@i.
Anda dapat membuat matriks identitas dengan panjang tertentu).Setelah kita memiliki matriks identitas, itu masalah menambahkan satu baris dan satu kolom, yang dilakukan dengan sangat sederhana (jika diberi atom - yaitu elemen tunggal -
,
keluarga akan mengulanginya untuk mengisi ketika ditambahkan) :Kemudian kita cukup membandingkan matriks panah yang dihasilkan dengan signum dari matriks input.
sumber
*
cukup alih-alih0@<
(untuk 17 byte)? Cobalah=&/:
Ketika saya menggabungkannya dengan}.
, saya mendapatkan ini*-:1,1,.=&/:@}.
selama 15 byte. Cobalah secara online!/:
dan}.
-behead), terima kasih lagi! Saya akan mengeditnya masuk*-:1,1,.=@}.
berfungsi dengan baik - tidak perlu cara mewah untuk menemukan matriks identitas. Anda dapat menghasilkan matriks identitas dari matriks kuadrat itu sendiri hanya dengan=
. Jadi letakkan satu baris dengan}.
, buat matriks identitas dengan=
, tambahkan satu baris dan satu kolom dengan1
dan seterusnya.Bahasa Wolfram (Mathematica) , 47 byte
Cobalah online!
Penjelasan:
Clip@#
mengganti semua angka bukan nol dalam matriks dengan 1s, lalu kita membandingkannya dengan array dengan dimensi{1,1}Tr[1^#]
={Length@#, Length@#}
dengan 0 pada posisii,j
saat1 < i != j > 1
, dan 1 sebaliknya.(Secara kasar berdasarkan jawaban Uriel .)
Inilah ide lain yang panjangnya 16 byte - jangan ragu untuk mencurinya jika Anda dapat melakukannya:
Cobalah online!
sumber
APL (Dyalog Classic) ,
19161513 byte-1 byte terima kasih kepada @ErikTheOutgolfer
(
⎕IO←0
)Cobalah online!
-2 byte terima kasih kepada @ngn dan @ H.PWiz
Bagaimana?
(Matriks input 2D S )
×≡
Periksa apakah S positif hanya pada ...(∧=⌊
... diagonal atau baris atas dan kolom kiri ...)/¨∘⍳∘⍴
... dari S .sumber
⍳∘⍴
untuk produk kartesius.×≡(=/∨1∊⊢)¨∘⍳∘⍴
(=/∨1∊⊢)
->(~≠⌊⌊)/
(∧=⌊)/
tentu saja keduanya membutuhkan⎕IO←0
PowerShell ,
112108 byteCobalah online!
Mengambil input dan memanipulasi sebagai array-of-array, karena PowerShell tidak mendukung matriks (di luar. NET Direct3D mengubah dukungan matriks, yang merupakan sesuatu yang sama sekali berbeda).
Seluruh algoritma didasarkan pada fakta bahwa angka-angka bukan nol adalah benar dan nol adalah palsu di PowerShell, dan menggunakan perkalian untuk menentukan nilai-nilai kebenaran / palsu itu.
Kami pertama-tama mengambil baris pertama
$a[0]
,, dan memeriksa apakah0
adalah-in
array, toko yang ke kami$o
variabel utput. Jika ada sesuatu di baris itu adalah nol, maka$o
itu juga nol, jika tidak itu adalah satu, dilakukan oleh cast-to-int dengan cepat+
.Selanjutnya kita
1
beralih dari hingga$a.count-1
, pengaturan$x
sepanjang jalan - kita akan mengulang-ulang setiap baris satu per satu.Setiap iterasi, kami menetapkan variabel pembantu
$i
untuk melacak baris apa yang kita gunakan, kemudian beralih dari0
ke$x
untuk mengulangi setiap elemen di baris ini. Di dalam lingkaran dalam, kita mengalikan lagi$o
, kali ini dengan memilih dari pengaturan tuple sebagai operator pseudo-ternary.Tuple bersyarat,
!$_-or$_-eq$i
,, mengatakan "ketika kita berada di kolom ke-0, atau kolom cocok dengan baris (yaitu, diagonal utama)" untuk memilih paruh kedua dari tuple ketika benar atau babak pertama ketika falsey. Tupel terdiri dari!($y=$a[$i][$_]), $y
. Set babak pertama$y
untuk bermain golf di babak kedua, tetapi kami memilih elemen saat ini. Babak pertama melakukan negasi Boolean, sementara babak kedua hanya mengambil elemen apa adanya. Jadi, jika kita tidak berada di kolom 0 atau diagonal utama, kita memastikan bahwa elemen tersebut nol dengan mengambil Boolean-bukan dari itu. Demikian pula, kami memastikan kolom ke-0 atau diagonal utama tidak nol dengan hanya mengambilnya.Jadi sekarang kita telah mengulangi setiap elemen dalam matriks,
$o
apakah akan terjadi0
jika beberapa elemen salah, atau bilangan bulat bukan nol jika itu adalah matriks panah. Kami menggandakan-Boolean-bukan untuk mendapatkan salah satuFalse
atauTrue
masing - masing, untuk membuat output kami konsisten, dan yang tersisa di jalur pipa di mana pencetakan tersirat.sumber
+
=[int]
? Menyenangkan.Jelly ,
1412 byte-2 byte dari Pietu1998
Cobalah online!
Penjelasan
Gunakan matriks di atas sebagai contoh input.
sumber
APL (Dyalog) ,
211817 bytesCobalah online!
Bagaimana?
Yang ini sebaliknya -
=/¨∘⍳
- menciptakan matriks identitas1-⍨⍴
- untukn - 1
1⍪1,
- menambahkan kolom dan deretan 1s≡
- bandingkan dengan×
- Matriks asli, setelah melewati elemen signum-ingsumber
MATL , 15 byte
Input adalah sebuah matriks (menggunakan
;
sebagai pemisah baris). Output adalah1
untuk panah,0
jika tidak.Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
sumber
C (gcc) ,
8075 byteCobalah online!
Disimpan 5 byte berkat skottinet!
Digunakan kembali kode tes dari jawaban ini .
Linearly memindai array untuk nilai yang salah, mengembalikan 0 untuk matriks panah dan 1 jika tidak. Kami memeriksa dengan menghitung eksklusif atau apakah item pada posisi yang diberikan adalah nol dan apakah posisi itu ada di panah.
Pengkodean informasi array 2D ke dalam satu dimensi mengarah ke serangkaian kondisi yang cukup sederhana. Jika kita membiarkan
i
indeks berbasis 0 kita ke dalamn
array dimensi, makai<n
jelaskan baris pertama. Demikian pula,i%n==0
jelaskan kolom pertama dani/n==i%n
jelaskan diagonal.Trik terbaik yang saya temukan untuk menangani pengembalian adalah mengatur dimensi ke nol ketika menemukan kesalahan. Ini menyebabkan perulangan berakhir segera, kemudian mengembalikan negasi logis dari dimensi akan memberi kita satu dari dua nilai berbeda. scottinet menemukan cara untuk membuat GCC mengembalikannya dengan lebih baik.
sumber
Python 2 , 75 byte
Cobalah online!
Python 2 , 85 byte
Mengambil array sebagai matriks 1D:
Cobalah online!
sumber
R ,
787069685453 byteCobalah online!
Jawaban Porting Luis Mendo jauh lebih pendek daripada pendekatan saya sebelumnya.
Terima kasih kepada rturnbull karena menunjukkan bug, dan bermain golf dengan byte!
jawaban lama, 68 byte:
Cobalah online!
duckmayr's jawaban menguji bahwa semua entri pada diagonal utama dan baris / kolom pertama (
m[i]
) adalah nol dan sisanya (m[-i]
) adalah nol, menggunakan beberapa aritmatika bagus untuk mendapatkan diagonal dan baris pertama.Jawaban ini, bagaimanapun, menguji untuk memastikan bahwa (1) nol entri tidak pada diagonal utama atau baris / kolom pertama, dan (2) yang ada, diberi
n x n
matriks,3*n-2
entri bukan nol.which
mengembalikan indeks di mana inputnya beradaTRUE
, dan dengan opsionalarr.ind=T
, mengembalikan array indeks untuk setiap dimensi array, dalam hal ini, dua.Karenanya kapan
any(i[,1]==i[,2])
, ada nol pada diagonal, dan kapanany(i==1)
, ada nol di baris pertama atau kolom pertama.Akhirnya, sedikit aritmatika menunjukkan bahwa jumlah entri bukan nol harus
3*n-2
,n
dari kolom pertama,n-1
dari diagonal, dann-1
dari baris pertama.sumber
all(!m==!d)
di baris terakhir?(!!m)==d
tetapi!
memiliki prioritas lebih rendah dari==
. Saya pikird==!!m
harus melakukan triknya.d!=!m
melakukan hal yang sama, kurang dari satu byte. Anda dapat menyimpan byte lain dengan menggunakanpryr::f
sintaks daripadafunction
juga.Python 2 ,
9290 byteCobalah online!
Kredit
sumber
Haskell , 62 byte
-3 byte terima kasih kepada Tn. Xcoder. -13 byte terima kasih ke user28667. -5 byte terima kasih kepada Zgarb.
Cobalah online!
sumber
<1
dan trik seperti itu? : P(x==y||x==0||y==0)==(m!!y!!x/=0)
harus lebih pendekx*y<1
.Jelly , 10 byte
Cobalah online!
sumber
Python 3 ,
7271 byteTerima kasih kepada @xnor karena bermain golf 1 byte!
Cobalah online!
sumber
0<i!=j>0
saves a byte,Pyth,
2221 bytesThis is definitely not the language for matrix manipulation.
For each row
b
and its indexk
in the matrix (.e
), grabs the first andk
th entries (left side and diagonal) with,@bkh
and (+
) all the other entries with.Db,0k
. Ifk
isn't 0 to correspond to the first row (Wk
), then!
notM
all of those entries. Once all of those have been selected, make sure all of them are true. (.As
) If there's a 0 where there shouldn't be, then the corresponding location will be grabbed as is and mess up the and, and if there's a nonzero where there shouldn't be, it'll be!
notted to 0, which is also false.Test suite.
-1 bytes for swapping the orders around.
sumber
@VQUQ
or.DVQUQ
For diagonals / deleting diagonals. But that would require a completely different approach. Not sure though... (BTW forgot to update link?)VQUQ
idea:>.A++hCQhQ.(VQUQsstCt
. This seems highly redundant, though. You might be able to tweak it in order to save a few bytes.Pip,
312322 bytesThis is a function that takes a 2D nested list of numbers. Try it online!
Explanation
A whole lot of comparisons going on here. The first thing to know is that comparison operators in Pip can be chained together, like in Python:
5>4>3
is5>4 and 4>3
(true), not(5>4)>3
(false). The second is that this doesn't apply to==
, the "exactly equals" operator. Another difference: regular comparisons have higher precedence than the mapping operatorsMC
andMM
and can be used in lambda expressions, while==
has lower precedence and can't.To generate the first matrix, we use
MC
, "map-coords." This operator takes a number, generates a square coordinate grid of that size, and maps a function to each (x,y) coordinate pair, returning a list of lists of the results. For example,{a+b} MC 3
would give the result[[0; 1; 2]; [1; 2; 3]; [2; 3; 4]]
.Here, the size of the grid is
#a
, the size of our original argument. The function is0<_!=B>0
, which is a shorter way of writing{0 < a != b > 0}
:This returns 0 for the first row/column and the main diagonal, and 1 elsewhere.
sumber
Husk,
1211 bytesTry it online!
Explanation
The idea is that Husk defines 0 to the power of 0 as 1, so the outer product has 1s on the first row and column. Also, 1 to the power of any number is 1, so the outer product has 1s on the diagonal. Other entries are 0 to the power of some positive number, which is 0. This gives a binary arrowhead matrix, which we compare to the input with
≡
.sumber
APL+WIN,
3633 bytesPrompts for screen input of an APL 2d matrix.
sumber
Clojure,
128959285 bytesIt is always exciting to see two consecutive opening brackets.
Original version:
The first part works by
assoc
ing diagonal elements of the sub-matrix to zero, and checking that all rows are equal :) I used a similar trick at Jacobian method.Latter part
concat
enates the diagonal + first row and column and checks that they are positive.sumber
Javascript (ES6), 58 bytes
My solution for Javascript:
Not as clever as Herman's answer, but I just felt like I should post it here too.
Show code snippet
sumber
Clojure,
212206188 bytes-6 bytes by removing some missed spaces, and shortcutting
range
. I might have to let this sit so I can think of a better way.-18 bytes thanks to @NikoNyrh, and creating shortcuts for
map
.Awful, just awful. I don't know why I can't wrap my head around a reasonable solution.
Takes a nested vector as input.
I tried rewriting this from scratch using a different method, and it ended up longer. Instead of manually carving out the "rest" sections of the matrix, I instead decided to try generating all the coordinates in the matrix, generating the coordinates of the arrowhead, then use
clojure.set/difference
to get the non-arrowhead cells. Unfortunately, the call to that built-in is costly:223 bytes
sumber
#(drop 1 %)
is same asrest
and#(not(zero? %))
is same aspos?
(as we have non-negative numbers). You might want to have a look at my 128-byte answer, which has similar approacha s this one. After implementing that I realized that it is a lot shorted to deal with index-based access in a for-loop.rest
. I should probably just scrap this attempt and try again.Stax, 11 bytesCP437
Try it online!
Unpacked version with 13 bytes:
Finally tied Husk and beaten by Jelly by just one byte ...
Explanation
sumber
R,
8179 bytes-2 bytes thanks to Mr. Xcoder
Try it online!
sumber
C, 117 bytes
Try it online!
sumber
PowerShell, 186 bytes
Try it online!
sumber
param($a)
to take input, the-contains
can be swapped for an-in
and all of the-eq0
can be swapped for!
. Finally, you can loop from1
up to$a.length
and get rid of theif($_-ne0)
in the loop body.Perl 5, 136 + 2 (
-ap
) = 138 bytesTry it online!
sumber
Clean, 79 bytes
Try it online!
sumber
Japt, 16 bytes
Test it online!
Man, this takes me back to the good old days when Japt was regularly much longer than other golfing langs...
sumber
K (oK),
2730 bytesSolution:
Try it online!
Explanation:
I must be doing something dumb as the APL solutions are less than half the byte count...
24 bytes spent creating the arrowhead.
or
together the following three matrices:Full breakdown:
sumber