Matrix Arrowhead'im mi?


33

Tanım

Bir ok matris a, matris tüm girişler için eşit olan , 0 , ana diyagonal, üst sırasında ve en soldaki kolonu üzerinde olanlar hariç. Başka bir deyişle, matris şöyle görünmelidir:

* * * * * *
* * 0 0 0 0
* 0 * 0 0 0
* 0 0 * 0 0
* 0 0 0 * 0
* 0 0 0 0 *

Her bir * sıfır olmayan herhangi bir girdi.

Görev

Negatif olmayan tamsayıların kare bir matrisi göz önüne alındığında, yukarıdaki tanıma göre ok ucu olup olmadığını kontrol edin.

Sen olabilir değil bir diziye dilinizin eşdeğer bir işaretçi ve (C) gibi bir uzunluğa gibi bir şey olmadığı sürece, girdi olarak matrisin boyutunu alır. Her zaman en az 3 x 3 olacaktır.

Her dilde bayt cinsinden en kısa kod kazanır.

Giriş ve çıkış

Girdi almak için aşağıdaki biçimlerden birini seçebilirsiniz:

  • Yerel matris türündeki bir matris (eğer dilinizde bir tane varsa)
  • Bir 2D dizi 1 (her biri bir satıra karşılık gelen 1D dizileri dizisi)
  • Bir 1D dizisi (matris her zaman kare olduğundan)
  • Bir dize (boşluğu seçtiniz, ancak lütfen bunu hiçbir şekilde kötüye kullanmayın).

Çıktı sağlamaya gelince , standart karar problemi tanımını izleyerek bir aşiret / sahtekarlık değeri bildirebilirsiniz ya da iki farklı ve tutarlı değer seçebilirsiniz.

Ayrıca, bu boşlukların varsayılan olarak yasak olduğunu not ederken, herhangi bir programlama dilinde herhangi bir standart yöntemle girdi alabilir ve çıktı verebilirsiniz . Başka bir format seçmek istiyorsanız veya bir şey hakkında emin değilseniz, lütfen yorumlarda sorun.

1: veya dilinizin eşdeğeri (liste, vektör vb.)

Örnekler

Aşağıdaki örneklere bakalım:

1 2 2 2
2 1 0 0
3 0 1 0
4 0 0 1

Bu bir ok ucu matrisidir (programlarınız bir hakikat değeri rapor etmelidir), çünkü ana köşegendeki öğeler 1 1 1 1, üst satırdakiler 1 2 2 2ve en soldaki sütundakiler 1 2 3 4. Diğer tüm girişler 0'dır , bu nedenle tüm şartları yerine getirir.

3 5 6
7 1 0
8 0 0

Bu matris ok ucu değildir , çünkü ana diyagonalde 0 vardır .

9 9 9 9
9 9 0 0
9 7 9 0
9 0 0 9

Bu da ok ucu değildir , çünkü 0 yerine 7 içerir .

Daha fazla test vakası

Truthy:

[[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
Matrisin negatif sayıları içermesi mümkün mü
Zacharý

2
@ Zacharý Hayır, hepsinin olumsuz olmadığını varsayabilirsin .
Bay Xcoder,

Pedant: İki boyutlu bir dizi ve bir matris aynı şey değildir, aynı zamanda bir dizi dizisi ile aynı değildir. Seçiminiz çok boyutlu dizileri destekleyecek kadar uygarsa, giriş iki boyutlu bir dizi olarak kabul edilebilir mi?
Ian Bush

@IanBush Evet, bir 2D dizi tamamen iyi.
Bay Xcoder

9
@ Mr.Xcoder Eğer ok ucu herhangi bir yöne işaret edebilseydi, bu oldukça farklı ve ilginç bir meydan okuma olurdu
dylnan

Yanıtlar:


15

Javascript (ES6), 48 47 bayt

Edc65 sayesinde 1 bayt kaydedildi

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

falseOk ucu matrisi ve ok ucu trueolmayan matrisi için döndürür (doğru ve yanlışı temsil etmek için herhangi iki farklı değer kullanılabildiğinden izin verilir)

Test durumları:


Şimdi bu gerçekten zekice bir yaklaşım!
Bay Xcoder,

1
bu işe yarayabilir mi? f=m=>m.some((r,y)=>r.some((c,x)=>(x*y&&x!=y)^!c))
edc65

@ edc65 olmadan f=tabii;-)
Neil

11

J , 21 20 19 17 15 bayt

@ GalenIvanov sayesinde -4 bayt.

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

Girdiyi bir matris olarak alır (sıra 2 dizi).

Çevrimiçi deneyin!

açıklama

Düzenleme geçmişinin size golf oynamak ve aynı zamanda bir açıklama yazmak için bir ders olmasına izin verin.

* -: 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?

Görsel açıklama

Bunun REPL üzerinde yapıldığına dikkat edin (girişler üç boşlukla başlayarak verilir ve çıkışlar herhangi bir boşluk olmadan verilir). Bu nedenle, böyle bazen omit kompozisyon fonksiyonları @ve &repl üzerinde şeylere beri sağdan sola değerlendirilir (fonksiyonları daha karmaşıktır).

Aşağıdaki örnek matrisin olduğunu varsayalım:

   ] 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

Öncelikle, @ GalenIvanov'un aşağıda belirtilen kimlik matrisini oluşturmanın çok zekice bir yolunu açıklamak (ve bir not vermek) istiyorum =&/:@}..

İlk önce giriş matrisinin ( }.) başını çiziyoruz .

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

Sonra her satırın /:içerdiği endeksleri alırız - -grade kullanarak sıralar.

   /: }. m
2 1 0

Sonuçta ortaya çıkan endekslerin benzersiz olduğuna dikkat edin : listenin yinelenen öğeleri yoktur (ve neden? Bir dizide aynı konumda iki öğe yerleştirmenin yolu yoktur).

Sonunda, niş kullanır ancak yardımcı oluruz =-sınıflandırır. Bu monad, her benzersiz öğeyi bir dizideki diğer tüm öğelerle karşılaştırır. Elimdeki sonuçların benzersiz olmasının önemli olduğunu söylediğimi hatırlıyor musunuz? Yana =-Self-sınıflandırmak benzersiz öğeleri listede göründükleri sırayla karşılaştırmalar yapar (bu yüzden, elde edilen çıktının benzersiz giriş için kimlik matrisi olacak =@i.belirli bir uzunlukta bir kimlik matrisi yapabilir nasıl).

   = /: }. 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

Kimlik matrisine sahip olduğumuzda, bir satır dizisi ve bir sütun dizisi ekleme meselesi çok basit bir şekilde yapılır (eğer bir atom verilirse - yani tek bir element - ,aile eklendiğinde doldurmak için tekrar eder). :

   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

Daha sonra, üretilen ok ucu matrisini giriş matrisinin işaretiyle karşılaştırırız.

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

2
Is not *yeterince yerine 0@<(17 bayt)? Deneyin
Galen Ivanov

1
@ GalenIvanov iyi yakalamak, sanırım öyle. Teşekkürler! Açıklama lol yeniden düzenleme zamanı.
cole,

1
Sanırım kimlik matrisini oluşturmanın yeni bir yolunu buldum: =&/:Birleştirdiğimde }., bunu *-:1,1,.=&/:@}.15 bayt için aldım Çevrimiçi deneyin!
Galen Ivanov

1
@GalenIvanov brilliant yaklaşım (hem -grade hem de /:-bead kullanımı }.), tekrar teşekkür ederim! Düzenleyeceğim.
cole

Hmm, aslında *-:1,1,.=@}.sadece iyi çalışıyor - kimlik matrisi bulmak için fantezi bir şekilde gerek yok. Kare matristen basitçe bir kimlik matrisi oluşturabilirsiniz =. Böylece bir satır bırakın }., kimlik matrisini yapın = , bir satır ekleyin ve bir sütun ile 1vb.
Galen Ivanov

9

Wolfram Dili (Mathematica) , 47 bayt

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

Çevrimiçi deneyin!

Açıklama: Clip@#1 sn matris içinde sıfır olmayan tüm sayılar yerine, o zaman boyutlara sahip bir dizi bu karşılaştırmak {1,1}Tr[1^#]= {Length@#, Length@#}pozisyonda 0 ile i,jzaman 1 < i != j > 1ve 1, aksi.

(Kabaca Uriel'in cevabına dayanır .)

İşte 16 byte daha uzun olan başka bir fikir - aşağı golf yapabiliyorsanız çalmaktan çekinmeyin:

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

Çevrimiçi deneyin!


8

APL (Dyalog Klasik) , 19 16 15 13 bayt

@ErikTheOutgolfer sayesinde -1 bayt

( ⎕IO←0)

×≡(∧=⌊)/¨∘⍳∘⍴

Çevrimiçi deneyin!

@Ngn ve @ H.PWiz sayesinde -2 bayt

Nasıl?

(2D giriş matrisi S )

  • ×≡S'nin sadece açık olup olmadığını kontrol et ...
  • (∧=⌊ ... köşegenler veya üst sıra ve sol sütun ...
  • )/¨∘⍳∘⍴Ve ... S .

⍳∘⍴kartezyen ürün için iyi kullanımı .
Uriel

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

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

2
@ngn Daha da iyisi: (∧=⌊)/elbette her ikisi de gerektirir⎕IO←0
H.PWiz

7

PowerShell , 112 108 bayt

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

Çevrimiçi deneyin!

PowerShell matrisleri desteklemediğinden (dizi tamamen farklı bir şey olan .NET Direct3D dönüştürme matrisleri desteği dışında) bir dizi dizisi olarak girdi alır ve düzenler.

Tüm algoritma, sıfır olmayan sayıların gerçeğe aykırı ve sıfırın PowerShell'de falsey olduğu ve bu gerçeği / falsey değerlerini belirlemek için çarpım kullanarak olduğu temeline dayanıyor.

Öncelikle ilk satırı alırız $a[0]ve bu dizinin olup olmadığını kontrol edin 0, -inonu $output değişkenimize kaydedin. Bu satırdaki herhangi bir şey sıfırsa, o zaman $oda sıfırdır, aksi halde hızlı bir to-int ile yapılır +.

Dan Sonra döngü 1kadar $a.count-1, ayar $xyol boyunca - bir anda her satır biri döngü olarak gidiyoruz.

$iHangi satırda olduğumuzu takip etmek için yardımcı değişken olarak belirlediğimiz her yineleme , daha sonra bu satırdaki her öğeyi yinelemek 0için döngü $x. İç döngü içinde $o, bu sefer bir sahte kurulum olarak sözde üçlü bir operatör olarak seçerek tekrar çarpıyoruz.

Tanımlama grubu en koşullu, !$_-or$_-eq$i"biz 0 sütunda kaldığından veya sütun satır (yani ana diyagonal) eşleştiğinde" ikinci başlığın yarısını truthy veya ilk yarı zaman Falsey seçmek için söylüyor. Demeti oluşur !($y=$a[$i][$_]), $y. İlk yarı $yikinci yarıyı golf oynamak için ayarlar , ancak her iki durumda da şu anki elementi seçiyoruz. İlk yarı buna Boole ihmali verirken, ikinci yarı sadece öğeyi olduğu gibi alır. Bu nedenle, eğer 0 ncı sütunda ya da ana köşegen üzerinde değilsek, onu Boolean yerine alarak elementin sıfır olmasını sağlıyoruz. Benzer şekilde, 0ncı sütunun veya ana diagonalın basitçe alarak sıfır olmadığından emin oluruz.

Şimdi, matristeki her element boyunca yinelediğimiz $o, ya 0bir eleman hatalıysa ya da bir ok başı matrisi ise sıfır olmayan bir tamsayı olacak. Boolean'ı ikiye katlıyoruz; sırayla Falseveya elde Trueetmek, çıktımızı tutarlı hale getirmek için değil ve bu, baskının örtülü olduğu boru hattında kaldı.


+= [int]? Güzel.
Kök


7

Jöle , 14 12 bayt

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

Pietu1998'den -2 bayt

Çevrimiçi deneyin!

açıklama

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

Yukarıdaki matrisi örnek girdi olarak kullanın.

Œ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 Ne demek istediğinizi
bilmiyorum

@ wizzwizz4 bu kod , matris öğelerinin nasıl yeniden toplandığını gösterir. Üst, sol ve ana diyagonal alır. Demek istediğin bu mu?
dylnan

Açıklamasında verdiğin kodun asıl görsel temsili demek istedim. Komik olmaya çalışıyordum ama belli ki işe yaramadı. Bu yorumları temizleyeceğim.
wizzwizz4

7

APL (Dyalog) , 21 18 17 bayt

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

Çevrimiçi deneyin!

Nasıl?

Bu, diğer tarafa gider -

=/¨∘⍳ - kimlik matrisi yaratır

1-⍨⍴ - için n - 1

1⍪1, - bir sütun ve 1 satırlık bir satır hazırlar

- ile karşılaştırır

× - orijinal matris, eleman şeklinde bir imza attıktan sonra


6

MATL , 15 bayt

gtZyXy,!llY(]X=

Giriş bir matristir ( ;satır ayırıcı olarak kullanılır ). Aksi halde çıktı 1ok ucu içindir 0.

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

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
Indeity matrisi tam olarak nedir ?
Outgolfer Erik

13
@EriktheOutgolfer açık bir tanrı içeren bir matris.
cole

5
@cole, Elysian sahasındaki bir matrisle ilişkili olabilir
jld

5

C (gcc) ,80 75 bayt

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

Çevrimiçi deneyin!

Scottinet sayesinde 5 byte kurtarıldı!

Test kodu Yeniden kullanılan bu cevap .

Diziyi herhangi bir yanlış değer için doğrusal olarak tarar, ok ucu matrisi için 0, aksi halde 1 döndürür. Münhasırlığı hesaplayarak veya belirli bir pozisyondaki öğenin sıfır olup olmadığını ve o pozisyonun ok üzerinde olup olmadığını kontrol ederek kontrol ederiz.

2B dizinin bilgilerinin bir boyuta kodlanması oldukça basit koşullara yol açar. i0 tabanlı dizinin nboyutsal diziye girmesine izin verirsek i<n, ilk satırı açıklar. Benzer şekilde, i%n==0ilk sütunu ve i/n==i%nköşegeni açıklar.

Dönüşü işlerken bulduğum en iyi numara, bir hatayla karşılaştığında boyutu sıfıra ayarlamak. Bu, döngünün derhal sona ermesine neden olur, ardından boyutun mantıksal olumsuzluğunu döndürmek bize iki farklı değerden birini verir. scottinet, GCC'nin daha iyi iade etmesinin yolunu buldu.


-2 daha fazla golf oynamaya sahip bayt
scottinet

ve
gcc'nin

@scottinet Teşekkürler! Bu numarayı kullanmak için hangi değeri belirlemem gerektiğini bulmakta güçlük çekiyordum.
FryAmTheEggman

Aslında ilk golfünün işe yarayacağına inanmıyorum. Testlerden geçti çünkü ilk pozisyonda hiç sıfır olmadı. Bir dava eklendi ve bu değişikliği geri aldı.
FryAmTheEggman

int test0 [] = {0, 1, 1, 1, 1, 0, 1, 0, 1}; printf ("% d \ n", f (test0, 3)); 0 değil 1 döndürmek zorunda (3x3 matrx 011 110 101 ise) çünkü bir [0,0] 0
RosLuP


5

R , 78 70 69 68 54 53 bayt

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

Çevrimiçi deneyin!

Taşımak Luis Mendo'nun cevabı eski yaklaşımımdan çok daha kısa.

Bir hatayı işaret ettiğin için rturnbull'a ve bir byte'a golf attığı için teşekkürler !

eski cevap, 68 bayt:

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

Çevrimiçi deneyin!

duckmayr'ın cevabı , ana diyagonal ve ilk satır / column ( m[i]) ' daki tüm girişlerin sıfır olmadığını ve geri kalanının ( m[-i]) sıfır olduğunu, diyagonal ve ilk sırayı almak için bazı güzel aritmetik kullanarak test ettiğini gösterir .

Bununla birlikte, bu cevap, (1) sıfır girişlerin ana diyagonal veya ilk satır / sütunda olmadığından ve (2) bir n x nmatris verilen 3*n-2sıfır olmayan girişlerin olduğundan emin olmak için testler .

whichgirişinin olduğu endeksleri TRUEve isteğe bağlı olarak arr.ind=T, her bir dizi boyutu için bir indeks dizisi döndürür, bu durumda, iki tane.

Dolayısıyla any(i[,1]==i[,2]), köşegen üzerinde bir sıfır olduğu zaman any(i==1)ve ilk satırda veya ilk sütunda bir sıfır olduğu zaman .

Son olarak, sıfırdan farklı girişlerin sayısı olması gerektiğini biraz aritmetik gösterileri 3*n-2, nbirinci sütundan, n-1Diagonal'a ve n-1ilk satırdan.


Bu, değerlerin 1 olmadığı ok matrislerinde işe yaramaz gibi görünüyor. all(!m==!d)Son satırda mı demek istediniz ?
rturnbull

@ rturnbull ah! Teşekkür ederim. R operatörü sözdizimi çok garip. Gerçekten demek istedim (!!m)==dama !öncekinden daha düşük önceliğe sahip ==. Bence d==!!mhile yapmalıyım.
Giuseppe

d!=!mBir bayt daha az, aynı şekilde görünüyor . Başka bir baytı da pryr::fdeğil, sözdizimi kullanarak kaydedebilirsiniz function.
rturnbull

Golf oynamaya çalıştım ama yapabileceğimin en iyisi hala 53 .
JayCe

@JayCe nah hem cevabını hem de benimki 52'ye kadar golf oynayabilir ve neden daha önce başıma gelmediğinden emin değilim. tek hat yaklaşımı oldukça güzel ve sizinkinde iyileşme için daha fazla yer olabileceğinden şüpheleniyorum
Giuseppe




3

Python 3 , 72 71 bayt

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

1 byte kapalı golf için @xnor için teşekkürler!

Çevrimiçi deneyin!


Sanırım 0<i!=j>0bir baytı kurtarıyor,
xnor

@xnor Teşekkürler! Karşılaştırma zincirinde bir sayı yeniden kullandığımı sanmıyorum ...
Dennis

2

Pyth, 22 21 bayt

Bu kesinlikle matris manipülasyonunun dili değil.

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

Her satır bve kmatristeki ( .e) dizini için, ve ( ) ile diğer tüm kgirişlerle ilk ve üçüncü girişleri (sol ve çapraz) alır . Eğer değil 0 ilk satırında (karşılık gelecek şekilde , sonra) değil tüm bu girdilerin. Bunların tümü seçildikten sonra, hepsinin doğru olduğundan emin olun. ( ) Olmaması gereken bir 0 varsa, o zaman karşılık gelen konum olduğu gibi ele geçirilir ve ve ile karıştırılır, ve olması gereken bir sıfır yoksa, 0 olarak bildirilir, ayrıca yanlış.,@bkh+.Db,0kkWk!M.As!

Test odası.

Etrafındaki emirleri değiştirmek için -1 bayt.


1
Vay bu çözüm Pyth matris manipülasyonu ile oldukça paralel olduğu göz önüne alındığında gerçekten güzel. Muhtemelen yarın başka bir Pyth düello için hazır: P
Bay Xcoder

Bunu @VQUQveya .DVQUQ Çaprazlar için / Çaprazları silme işlevini kullanarak kısaltabilirsiniz . Ancak bu tamamen farklı bir yaklaşım gerektiriyor. Emin değilim ... (BTW bağlantısını güncellemeyi unuttum?)
Bay Xcoder

@ Mr.Xcoder Sabit bağlantı, yarın diğer stratejilerle uğraşmaya çalışacağım.
Steven H.

Benim kullanarak Byter 21-alternatif geldi VQUQfikri: >.A++hCQhQ.(VQUQsstCt. Bu olsa da, çok gereksiz görünüyor. Birkaç byte tasarruf etmek için ince ayar yapabilirsiniz.
Bay Xcoder

2

Pip , 31 23 22 bayt

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

Bu, 2B iç içe sayıların listesini alan bir işlevdir. Çevrimiçi deneyin!

açıklama

Burada bir çok karşılaştırma yapılıyor. Bilinmesi gereken ilk şey, Pip'deki karşılaştırma operatörlerinin Python'da 5>4>3olduğu gibi birlikte zincirlenebileceğidir: 5>4 and 4>3(true), (5>4)>3(false) değil . İkincisi, bunun =="tam olarak eşittir" işlecine uygulanmadığıdır. Diğer bir fark: Düzenli karşılaştırmalar haritalama operatörleri daha yüksek önceliğe sahip MCve MMve süre lambda ifadeleri kullanılabilir ==düşük önceliğe sahip ve olamaz.

{                    }  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

İlk matrisi oluşturmak için MC"map-coords" kullanıyoruz . Bu işleç bir sayı alır, o boyutta bir kare koordinat ızgarası oluşturur ve sonuçların listelerinin bir listesini döndürerek her bir (x, y) koordinat çiftine bir işlev eşler. Örneğin {a+b} MC 3, sonucu verirdi [[0; 1; 2]; [1; 2; 3]; [2; 3; 4]].

Burada, şebekenin #aboyutu, orijinal tartışmamızın boyutu. İşlev, 0<_!=B>0daha kısa bir yazı biçimidir {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

Bu, ilk satır / sütun ve ana diyagonal için 0, başka bir yerde 1 döndürür.


2

Kabuğu , 12 11 bayt

S≡ȯ´Ṫ§^*=ŀL

Çevrimiçi deneyin!

açıklama

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?

Buradaki fikir, Husk'un 0 değerini 1 olarak 1 olarak tanımlamasıdır, böylece dış ürün ilk sırada ve sütunda 1 değerine sahiptir. Ayrıca, herhangi bir sayının gücüne 1, 1'dir, bu nedenle dış ürünün köşegen üzerinde 1s vardır. Diğer girişler, 0 olan bazı pozitif sayının gücünde 0'dır. Bu, girişle karşılaştırdığımız bir ikili ok ucu matrisi verir .


2

APL + WIN, 36 33 bayt

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

Bir APL 2d matrisinin ekran girişi için ister.


2

Clojure, 128 95 92 85 bayt

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

İki ardışık açılış braketi görmek her zaman heyecan vericidir.

Orijinal versiyon:

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

İlk bölüm assocalt matrisin köşegen unsurlarını sıfıra getirerek ve tüm satırların eşit olduğunu kontrol ederek çalışır :) Jacobian yönteminde benzer bir numara kullandım .

concatİkinci bölüm , köşegen + ilk satır ve sütunu yönlendirir ve pozitif olduklarını kontrol eder.


2

Javascript (ES6), 58 bayt

Javascript için çözümüm:

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

Herman'ın cevabı kadar zekice değil , ama onu da buraya göndermem gerektiğini hissettim.


3
PPCG'ye Hoşgeldiniz!
Steadybox

2

Clojure, 212 206 188 bayt

-6 bayt bazı cevapsız boşlukları kaldırarak ve kısayol range . Daha iyi bir yol düşünebilmem için oturmasına izin vermek zorunda kalabilirim.

-NikoNyrh sayesinde 18 bayt, için kısayollar oluşturuyor 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)))))))))

Çok kötü, çok kötü. Neden kafamı makul bir çözüm etrafında doyamıyorum bilmiyorum.

İç içe geçmiş bir vektörü giriş olarak alır.

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

Bunu farklı bir yöntem kullanarak sıfırdan yazmaya çalıştım ve daha uzun sürdü. Matrisin "dinlenme" bölümlerini elle yapmak yerine, matristeki tüm koordinatları oluşturmaya karar verdim, ok ucunun koordinatlarını oluşturmaya karar verdim.clojure.set/difference ok ucu olmayan hücreleri almak için . Maalesef, bu dahili arama çağrısı masraflıdır:

223 bayt

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

İyileştirilmesi için oda oldukça çok şey var, örneğin #(drop 1 %)aynıdır restve #(not(zero? %))aynı pos?(biz negatif olmayan numaralar gibi). 128 baytlık cevabımı incelemek isteyebilirsiniz, ki bu da buna benzer bir yaklaşıma sahip. Uyguladıktan sonra bir for-loop içinde indeks tabanlı erişim ile uğraşmanın çok kısa olduğunu fark ettim.
NikoNyrh

@NikoNyrh Ya, o gün pek iyi olmadým. Nasıl unuttuğumu bilmiyorum rest. Muhtemelen bu girişimi bir kenara atıp tekrar denemeliyim.
Carcigenicate

2

Stax , 11 bayt CP437

ä¢⌠┐xⁿtH↔BU

Çevrimiçi deneyin!

13 baytlık paketsiz sürüm:

B|AsF:10i^\=*

Sonunda Husk'u bağladı ve Jelly tarafından sadece bir byte yenildi ...

açıklama

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

PowerShell , 186 bayt

$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

Çevrimiçi deneyin!


2
Bazı golf - param($a)giriş almak için kullanın-contains bir -inve tüm -eq0için değiştirilebilir !. Son olarak, döngü gelen yapabilirsiniz 1up $a.lengthve kurtulmak if($_-ne0)döngü gövdesinde.
AdmBorkBork

1

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

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)

Çevrimiçi deneyin!




1

K (OK) , 27 30 bayt

Çözüm:

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

Çevrimiçi deneyin!

Açıklama:

APL çözümleri bayt sayısının yarısından daha az olduğu için aptalca bir şey yapıyor olmalıyım ...

Ok ucu oluşturmak için harcanan 24 bayt. orbirlikte aşağıdaki üç matris:

/ 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

Tam arıza:

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