Apakah Matrix Arrowhead saya?


33

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 2dan 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]]

1
Apakah mungkin bahwa matriks dapat berisi angka negatif
Zacharý

2
@ Zacharý Tidak, Anda dapat menganggap semuanya non-negatif .
Tn. Xcoder

Pedant: Array dua dimensi dan matriks bukanlah hal yang sama, juga bukan sama dengan array array. Apakah input sebagai array dua dimensi dapat diterima jika bahasa pilihan Anda cukup beradab untuk mendukung array multidimensi?
Ian Bush

@IanBush Ya, array 2D benar-benar baik-baik saja.
Tn. Xcoder

9
@ Mr.Xcoder Ini akan menjadi tantangan yang cukup berbeda dan menarik jika panah bisa menunjuk ke segala arah
dylnan

Jawaban:


15

Javascript (ES6), 48 47 byte

Disimpan 1 byte berkat edc65

m=>m.some((r,y)=>r.some((c,x)=>(x*y&&x!=y)^!c))

Pengembalian falseuntuk matriks panah dan trueuntuk matriks non-panah (diizinkan karena dua nilai berbeda dapat digunakan untuk mewakili benar dan salah)

Kasus uji:


Nah, itu pendekatan yang benar-benar pintar!
Tn. Xcoder

1
dapatkah ini bekerja? f=m=>m.some((r,y)=>r.some((c,x)=>(x*y&&x!=y)^!c))
edc65

@ edc65 Tanpa f=tentu saja;-)
Neil

11

J , 21 20 19 17 15 byte

-4 byte terima kasih kepada @GalenIvanov.

*-:1,1,.=&/:@}.

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.

* -: 1, 1,. = & /: @ }.  Let m be the input matrix.
            = & /: @ }.  Identity matrix 1 smaller than m.
                     }.    Behead (m without its first row).
                   @       Composed with.
                /:         Grade up (get len(m) - 1 unique elements)
              &            Composed with.
            =              Self-classify (compare equality with
                           unique elements)
        1,.              Prepend a column of 1s
     1,                  Prepend a row of 1s
*                        Signum (0 becomes 0, n > 0 becomes 1)
  -:                     Does it match the generated arrowhead matrix?

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:

   ] m =. 4 4 $ 1 2 3 4 1 1 0 0 1 0 1 0 1 0 0 1
1 2 3 4
1 1 0 0
1 0 1 0
1 0 0 1

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 ( }.).

   }. m
1 1 0 0
1 0 1 0
1 0 0 1

Lalu kami mendapatkan indeks setiap baris akan berada di mana baris diurutkan menggunakan /:-grade.

   /: }. m
2 1 0

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

   = /: }. m
1 0 0
0 1 0
0 0 1
   NB. This is what is happening
   (2 = 2 1 0) , (1 = 2 1 0) ,: (0 = 2 1 0)
1 0 0
0 1 0
0 0 1

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

   1,. (=&/:@}. m)
1 1 0 0
1 0 1 0
1 0 0 1
   1, (1,. =&/:@}. m)
1 1 1 1
1 1 0 0
1 0 1 0
1 0 0 1

Kemudian kita cukup membandingkan matriks panah yang dihasilkan dengan signum dari matriks input.

   * m
1 1 1 1
1 1 0 0
1 0 1 0
1 0 0 1
   (* m) -: (1, 1,. =&/:@}. m)
1

2
Tidak *cukup alih-alih 0@<(untuk 17 byte)? Cobalah
Galen Ivanov

1
@GalenIvanov tangkapan yang bagus, saya kira begitu. Terima kasih! Saatnya mengedit ulang penjelasan lol.
cole

1
Saya rasa saya menemukan cara baru untuk menghasilkan matriks identitas: =&/:Ketika saya menggabungkannya dengan }., saya mendapatkan ini *-:1,1,.=&/:@}.selama 15 byte. Cobalah secara online!
Galen Ivanov

1
@GalenIvanov, pendekatan brilian (baik penggunaan -grade /:dan }.-behead), terima kasih lagi! Saya akan mengeditnya masuk
Cole

Hmm, sebenarnya *-: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 dengan 1dan seterusnya.
Galen Ivanov

9

Bahasa Wolfram (Mathematica) , 47 byte

Clip@#==Array[If[1<#!=#2>1,0,1]&,{1,1}Tr[1^#]]&

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 posisi i,jsaat1 < 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:

Union@@Array[{1,#}~Tuples~2&,Length@#]==Most@Keys@ArrayRules@#&

Cobalah online!


8

APL (Dyalog Classic) , 19 16 15 13 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 .

pemanfaatan yang bagus ⍳∘⍴untuk produk kartesius.
Uriel

×≡(=/∨1∊⊢)¨∘⍳∘⍴
Erik the Outgolfer

1
(=/∨1∊⊢)->(~≠⌊⌊)/
ngn

2
@ ngn Bahkan lebih baik:, (∧=⌊)/tentu saja keduanya membutuhkan⎕IO←0
H.PWiz

7

PowerShell , 112 108 byte

param($a)$o=+!(0-in$a[0]);1..($x=$a.count-1)|%{$i=$_;0..$x|%{$o*=(!($y=$a[$i][$_]),$y)[!$_-or$_-eq$i]}};!!$o

Cobalah 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 -inarray, toko yang ke kami $ovariabel utput. Jika ada sesuatu di baris itu adalah nol, maka $oitu juga nol, jika tidak itu adalah satu, dilakukan oleh cast-to-int dengan cepat +.

Selanjutnya kita 1beralih dari hingga $a.count-1, pengaturan $xsepanjang 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 dari 0ke $xuntuk 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, $oapakah akan terjadi 0jika beberapa elemen salah, atau bilangan bulat bukan nol jika itu adalah matriks panah. Kami menggandakan-Boolean-bukan untuk mendapatkan salah satu Falseatau Truemasing - masing, untuk membuat output kami konsisten, dan yang tersisa di jalur pipa di mana pencetakan tersirat.


+= [int]? Menyenangkan.
root

@root Salah satu kiat PowerShell .
AdmBorkBork

7

Jelly , 14 12 byte

ŒDµḢ;Ḣ€Ȧ>FẸ$

-2 byte dari Pietu1998

Cobalah online!

Penjelasan

[[9,7,1],
 [7,1,0],
 [7,0,1]]

Gunakan matriks di atas sebagai contoh input.

ŒDµḢ;Ḣ€Ȧ>FẸ$
ŒD              Diagonals → [[9, 1, 1], [7, 0], [1], [7], [7, 0]]
  µ             New monadic link
   Ḣ            Head → [9, 1, 1]. Alters diagonals list.
    ;Ḣ€         Append with the head of each of the other diagonals → [9, 1, 1, 7, 1, 7, 7]
       Ȧ        Logical all → 1
         FẸ$    Flatten what's left in diagonals then take logical any → [[0],[],[],[0]] → [0,0] → 0
        >       Matrix is an arrowhead iff result of Ȧ > result of Ẹ

@ wizzwizz4 Saya tidak yakin apa yang Anda maksud
dylnan

@ wizzwizz4 kode ini menunjukkan bagaimana elemen-elemen dari matriks dikelompokkan kembali. Itu mengambil diagonal atas, kiri dan utama. Apakah ini yang Anda maksud?
dylnan

Maksud saya representasi visual sebenarnya dari kode yang Anda berikan dalam penjelasan Anda. Saya mencoba untuk menjadi lucu tetapi jelas tidak berhasil. Saya akan membersihkan komentar ini.
wizzwizz4

7

APL (Dyalog) , 21 18 17 bytes

×≡11,(=/¨∘⍳1-⍨⍴)

Cobalah online!

Bagaimana?

Yang ini sebaliknya -

=/¨∘⍳ - menciptakan matriks identitas

1-⍨⍴ - untuk n - 1

1⍪1, - menambahkan kolom dan deretan 1s

- bandingkan dengan

× - Matriks asli, setelah melewati elemen signum-ing


6

MATL , 15 byte

gtZyXy,!llY(]X=

Input adalah sebuah matriks (menggunakan ;sebagai pemisah baris). Output adalah1 untuk panah, 0jika tidak.

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

g        % Implicit input. Convert to logical values (nonzero becomes true and
         % zero becomes false)
t        % Duplicate
Zy       % Size
Xy       % Identity matrix of that size
,        % Do twice
  !      %   Transpose
  ll     %   Push 1 twice
  Y(     %   Write 1 at all entries of row 1
]        % End
X=       % Are the two matrices (input and constructed) equal? Implicit display

1
Apa sebenarnya matriks Indeity ?
Erik the Outgolfer

13
@EriktheOutgolfer jelas sebuah matriks yang mengandung dewa.
cole

5
@cole mungkin terkait dengan matriks di bidang Elysian
jld

5

C (gcc) ,80 75 byte

i;f(A,n)int*A;{for(i=0;i<n*n;i++)n=A[i]>0^(i<n||i%n<1||i/n==i%n)?0:n;n=!n;}

Cobalah 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 iindeks berbasis 0 kita ke dalam narray dimensi, maka i<njelaskan baris pertama. Demikian pula, i%n==0jelaskan 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.


-2 byte dengan golf lagi
scottinet

dan tambahan -4 byte dengan menyalahgunakan cara gcc untuk mengembalikan nilai
scottinet

@ skottinet Terima kasih! Saya mengalami kesulitan mencari tahu nilai mana yang harus saya tetapkan untuk menggunakan trik itu.
FryAmTheEggman

Sebenarnya, saya tidak percaya golf pertama Anda berhasil. Ini lulus ujian karena tidak pernah ada nol di posisi pertama. Menambahkan kasus dan mengembalikan perubahan itu.
FryAmTheEggman

int test0 [] = {0, 1, 1, 1, 1, 0, 1, 0, 1}; printf ("% d \ n", f (test0, 3)); Harus mengembalikan 0 bukan 1 (jika adalah 3x3 matrx 011 110 101) karena [0,0] adalah 0
RosLuP


5

R , 78 70 69 68 54 53 byte

function(m){d=diag(nrow(m))
d[1,]=d[,1]=1
all(d!=!m)}

Cobalah 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:

function(m,i=which(!m,T))all(i[,1]-i[,2],i!=1,sum(m>0)==3*nrow(m)-2)

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 nmatriks,3*n-2 entri bukan nol.

whichmengembalikan indeks di mana inputnya berada TRUE, 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, ndari kolom pertama, n-1dari diagonal, dan n-1dari baris pertama.


Ini sepertinya tidak berfungsi untuk matriks panah di mana nilainya tidak 1. Apakah maksud Anda all(!m==!d)di baris terakhir?
rturnbull

@ aturnbull ah! Terima kasih. Sintaks operator R sangat aneh. Maksud saya sebenarnya (!!m)==dtetapi !memiliki prioritas lebih rendah dari ==. Saya pikir d==!!mharus melakukan triknya.
Giuseppe

Sepertinya d!=!mmelakukan hal yang sama, kurang dari satu byte. Anda dapat menyimpan byte lain dengan menggunakan pryr::fsintaks daripada functionjuga.
rturnbull


@JayCe nah jawaban Anda dan saya dapat di-golf ke 52, dan saya tidak yakin mengapa itu tidak terpikir oleh saya sebelumnya ... Saya akan memposting Anda sebagai terpisah; pendekatan satu baris cukup bagus dan saya kira mungkin ada lebih banyak ruang untuk perbaikan dalam diri Anda
Giuseppe




3

Python 3 , 72 71 byte

lambda x,e=enumerate:any(0**n^(0<i!=j>0)for i,r in e(x)for j,n in e(r))

Terima kasih kepada @xnor karena bermain golf 1 byte!

Cobalah online!


I think 0<i!=j>0 saves a byte,
xnor

@xnor Thanks! I don't think I've ever re-used a number in a comparison chain...
Dennis

2

Pyth, 22 21 bytes

This is definitely not the language for matrix manipulation.

.As.e+!MWk.Db,0k,@bkh

For each row b and its index k in the matrix (.e), grabs the first and kth entries (left side and diagonal) with ,@bkh and (+) all the other entries with .Db,0k. If k isn't 0 to correspond to the first row (Wk), then !not M 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.


1
Wow this solution is really nice given that Pyth is quite parallel with matrix manipulation. Probably up for another Pyth duel tomorrow :P
Mr. Xcoder

You might be able to shorten this using either @VQUQ or .DVQUQ For diagonals / deleting diagonals. But that would require a completely different approach. Not sure though... (BTW forgot to update link?)
Mr. Xcoder

@Mr.Xcoder Fixed link, I'll try to mess around with other strategies tomorrow.
Steven H.

I arrived at an alternative 21-byter using my VQUQ idea: >.A++hCQhQ.(VQUQsstCt. This seems highly redundant, though. You might be able to tweak it in order to save a few bytes.
Mr. Xcoder

2

Pip, 31 23 22 bytes

{0<_!=B>0MC#a==0=_MMa}

This 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 is 5>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 operators MC and MM and can be used in lambda expressions, while == has lower precedence and can't.

{                    }  Define a function with argument a:
 0<_!=B>0MC#a            Generate a matrix (as nested lists) that has 0 on the first row,
                          first column, and main diagonal, and 1 elsewhere (see below for
                          details)
               0=_MMa    Map the function 0=_ to the elements of the elements of a,
                          generating a matrix that is 0 where a is nonzero and vice versa
             ==          Test if the two matrices are equal, returning 0 or 1 accordingly

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 is 0<_!=B>0, which is a shorter way of writing {0 < a != b > 0}:

{        }  Function; a and b are the arguments (in our case, row and column)
 0<a        Return 1 (truthy) if a is greater than 0
    !=b     and a is not equal to b
       >0   and b is greater than 0

This returns 0 for the first row/column and the main diagonal, and 1 elsewhere.


2

Husk, 12 11 bytes

S≡ȯ´Ṫ§^*=ŀL

Try it online!

Explanation

S≡ȯ´Ṫ§^*=ŀL  Input is a k×k array A.
          L  The length, k.
         ŀ   The range [0,1..k-1].
  ȯ´Ṫ        Outer product with itself by this function:
              Arguments are two numbers x and y.
        =     Equality of x and y
     §^       to the power of
       *      x times y.
S≡           Does the result have the same shape and distribution of truthy values as A?

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 .


2

APL+WIN, 36 33 bytes

(↑⍴m)=+/(+⌿m)=+/m←×m×n∘.×n←⍳↑⍴m←⎕

Prompts for screen input of an APL 2d matrix.


2

Clojure, 128 95 92 85 bytes

#(every? neg?(for[R[(range(count %))]i R j R]((if((set[i(- i j)j])0)- dec)((% i)j))))

It is always exciting to see two consecutive opening brackets.

Original version:

#(and(apply =(map assoc(for[i(rest %)](subvec i 1))(range)(repeat 0)))(every? pos?(concat(map nth %(range))(% 0)(map first %))))

The first part works by associng 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 concatenates the diagonal + first row and column and checks that they are positive.


2

Javascript (ES6), 58 bytes

My solution for Javascript:

m=>m.some((r,i)=>m[0][i]*r[0]*r[i]==0|r.filter(c=>i*c)[2])

Not as clever as Herman's answer, but I just felt like I should post it here too.


3
Welcome to PPCG!
Steadybox

2

Clojure, 212 206 188 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.

(fn[m](let[r range a map z zero?](and(every? #(not(z %))(concat(m 0)(rest(a #(% 0)m))(a get m(r))))(every? z(apply concat(into(a #(take(dec %)%2)(r)(a rest m))(a take-last(r)(reverse(rest m)))))))))

Awful, just awful. I don't know why I can't wrap my head around a reasonable solution.

Takes a nested vector as input.

(defn arrowhead? [matrix]
  (let [; Get the 0th cell of the 0th row, then the 1st cell of the 1st row...
        main-diagonal (map get matrix (range))

        ; Get the 0th cell of each row
        first-col (rest (map #(% 0) matrix))
        arrowhead (concat (matrix 0) first-col main-diagonal)

        ;
        right-rest (map take-last (range) (reverse (rest matrix)))
        left-rest (map #(take (dec %) %2) (range) (map rest matrix))
        rest-matrix (apply concat (into left-rest right-rest))]

    ; And check them
    (and (every? pos? %) arrowhead
         (every? zero? rest-matrix))))

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

(fn[m](let[l(range(count m))g #(get-in m(reverse %))e every? a(for[y l x l][x y])k #(map % l)r(concat(k #(do[% %]))(k #(do[0%]))(k #(do[% 0])))](and(e #(zero?(g %))(clojure.set/difference(set a)(set r)))(e #(pos?(g %)))r)))

(defn arrowhead? [matrix]
  (let [length-range (range (count matrix))
        get-cell #(get-in matrix (reverse %))
        all-coords (for [y length-range
                         x length-range]
                     [x y])

        k #(map % length-range)

        diag (k #(do[% %]))
        top-side (k #(do [0 %]))
        left-side (k #(do [% 0]))
        arrowhead (concat diag top-side left-side)

                   ; 22 bytes! Ouch
        rest-cells (clojure.set/difference (set all-coords) (set arrowhead))]

    (and (every? #(zero? (get-cell %)) rest-cells)
         (every? #(pos? (get-cell %)) arrowhead))))

There is quite lot of room for improvement, for example #(drop 1 %) is same as rest and #(not(zero? %)) is same as pos? (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.
NikoNyrh

@NikoNyrh Ya, I wasn't in a very good groove that day. I don't know how I forgot about rest. I should probably just scrap this attempt and try again.
Carcigenicate

2

Stax, 11 bytesCP437

ä¢⌠┐xⁿtH↔BU

Try it online!

Unpacked version with 13 bytes:

B|AsF:10i^\=*

Finally tied Husk and beaten by Jelly by just one byte ...

Explanation

B                Push tail (all except 1st row) of the input array, then push the head (1st row)
 |A              All elements in the head are truthy
                 This will be used as an accumulator
   sF            For each element in the tail, execute the rest of the program
     :1          All truthy indices
       0i^\      Expected truthy indices (0 and the current row number)
           =     The truthy indices are as expected
            *    Perform logical "and" with the accumulator
                 Implicit output of the final accumulator


1

C, 117 bytes

i,j,r;f(A,n)int*A;{for(i=r=0;i<n;++i)for(j=-1;++j<n;(!i||!j||i==j)&&!A[i*n+j]&&++r)i*j&&i-j&&A[i*n+j]&&++r;return!r;}

Try it online!


1

PowerShell, 186 bytes

$a=$($args);if($a[0]-contains0){0;exit};0..($a.Length-1)|%{if($a[$_][0]-eq0-or$a[$_][$_]-eq0){0;exit};$r=$a[$_];$d=$_;if($_-ne0){1..($r.Length-1)|%{if($r[$_]-ne0-and$_-ne$d){0;exit}}}};1

Try it online!


2
Some golfs -- use 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 from 1 up to $a.length and get rid of the if($_-ne0) in the loop body.
AdmBorkBork

1

Perl 5, 136 + 2 (-ap) = 138 bytes

push@a,[@F]}{push@b,"@{$a[0]}"=~/\b0\b/;map{//;map$a[$'][$_]=!$a[$'][$_],0,$';shift@{$a[$']};push@b,@{$a[$']}}1..$#a;say!("@b"=~y/ 0//c)

Try it online!




1

K (oK), 27 30 bytes

Solution:

x~a*x|a:a|+(a:1,(#1_x)#0)|=#x:

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:

/ assume 4x4 matrix
=#x
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

+(a:1,(#1_x)#0)
1 0 0 0
1 0 0 0
1 0 0 0
1 0 0 0

a
1 1 1 1
0 0 0 0
0 0 0 0
0 0 0 0

Full breakdown:

x~a*x|a:a|+(a:1,(#1_x)#0)|=#x: / the solution
                            x: / save input as x
                           #   / count length
                          =    / identity matrix
                         |     / or with
           (            )      / do this together
                      #0       / take from 0
                ( 1_x)         / drop first of x
                 #             / count
              1,               / prepend 1
            a:                 / save as a
          +                    / flip rows/cols
         |                     / or with
        a                      / a
      a:                       / save as a
     |                         / or with
    x                          / x
  a*                           / multiply by arrowhead
x~                             / matches input?
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.