Czy mój grot Matrix?


33

Definicja

Grot matryca jest matryca , która ma wszystkie wpisy równą 0 , z wyjątkiem tych, w głównej przekątnej, górnego wiersza i lewej kolumnie. Innymi słowy, matryca powinna wyglądać następująco:

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

Gdzie każdy * to dowolny niezerowy wpis.

Zadanie

Biorąc pod uwagę kwadratową macierz nieujemnych liczb całkowitych, sprawdź, czy jest to grot strzałki zgodnie z powyższą definicją.

Być może nie ma rozmiaru macierzy jako wejście, chyba odpowiednik Twojego język do tablicy jest coś takiego jak wskaźnik i długości (jak C). Zawsze będzie to co najmniej 3 x 3.

Najkrótszy kod w bajtach w każdym języku wygrywa.

Wejście i wyjście

Możesz wybrać jeden z następujących formatów otrzymywania danych wejściowych:

  • Macierz w rodzimym typie macierzy (jeśli twój język ma taki)
  • Tablica 2D 1 (tablica tablic 1D, każda odpowiadająca jednemu rzędowi)
  • Tablica 1D (ponieważ macierz jest zawsze kwadratowa)
  • Łańcuch (wybrałeś odstępy, ale proszę, nie używaj go w żaden sposób).

Jeśli chodzi o dostarczanie wyników, możesz albo zgłosić wartość prawdy / fałszu zgodnie ze standardową definicją problemu decyzyjnego , albo wybrać dowolne dwie odrębne i spójne wartości.

Ponadto można pobierać dane wejściowe i przekazywać dane wyjściowe dowolną standardową metodą w dowolnym języku programowania , zwracając uwagę, że te luki są domyślnie zabronione. Jeśli chcesz wybrać inny format lub czegoś nie wiesz, zapytaj w komentarzach.

1: lub odpowiednik Twojego języka (lista, wektor itp.)

Przykłady

Spójrzmy na następujące przykłady:

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

Jest to macierz grotów strzałek (twoje programy powinny zgłaszać prawdziwą wartość), ponieważ elementy na głównej przekątnej to 1 1 1 1te, które znajdują się w górnym rzędzie, 1 2 2 2a te w kolumnie po lewej stronie 1 2 3 4. Wszystkie pozostałe wpisy mają wartość 0 , więc spełnia wszystkie warunki.

3 5 6
7 1 0
8 0 0

Ta matryca nie jest grotem strzałki, ponieważ na głównej przekątnej znajduje się 0 .

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

Ten jest nie grot albo, ponieważ zawiera on 7 zamiast 0 .

Więcej przypadków testowych

Prawda:

[[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
Czy to możliwe, że matryca może zawierać liczby ujemne
Zacharý

2
@ Zacharý Nie, możesz założyć, że wszystkie są nieujemne .
Pan Xcoder,

Pedant: Dwuwymiarowa tablica i macierz to nie to samo, ani też to samo, co tablica tablic. Czy dane wejściowe jako tablice dwuwymiarowe są dopuszczalne, jeśli wybrany język jest wystarczająco cywilizowany, aby obsługiwać tablice wielowymiarowe?
Ian Bush,

@IanBush Tak, tablica 2D jest całkowicie w porządku.
Pan Xcoder,

9
@ Mr.Xcoder Byłoby to wystarczająco różne i interesujące wyzwanie, gdyby grot strzały mógł skierować się w dowolnym kierunku
dylnan

Odpowiedzi:


15

JavaScript (ES6), 48 47 bajtów

Zapisano 1 bajt dzięki edc65

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

Zwraca falsedla macierzy grotów strzałek i macierzy trueinnych niż groty strzałek (dozwolone, ponieważ dowolne dwie odrębne wartości mogą być użyte do przedstawienia wartości prawda i fałsz)

Przypadki testowe:


To naprawdę sprytne podejście!
Pan Xcoder,

1
czy to może zadziałać? f=m=>m.some((r,y)=>r.some((c,x)=>(x*y&&x!=y)^!c))
edc65,

@ edc65 Bez f=oczywiście;-)
Neil

11

J , 21 20 19 17 15 bajtów

-4 bajty dzięki @GalenIvanov.

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

Pobiera dane wejściowe jako macierz (tablica rangi 2).

Wypróbuj online!

Wyjaśnienie

Niech historia edycji będzie dla ciebie lekcją, aby nie grać w golfa i jednocześnie pisać wyjaśnienia.

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

Objaśnienie wizualne

Zauważ, że odbywa się to na REPL (dane wejściowe zaczynają się od trzech spacji, a dane wyjściowe są podawane bez spacji wiodących). Z tego powodu czasami pomijam funkcje kompozycji, takie jak @i, &ponieważ rzeczy na REPL są oceniane od prawej do lewej (funkcje są bardziej złożone).

Załóżmy, że masz następującą przykładową macierz:

   ] 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

Po pierwsze, chciałbym wyjaśnić (i wykrzyczeć) bardzo sprytny sposób generowania macierzy tożsamości @ GalenIvanov, który jest następujący =&/:@}..

Najpierw ścięliśmy macierz wejściową ( }.).

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

Następnie otrzymujemy indeksy, w których znajdowałby się każdy wiersz, gdyby wiersze zostały posortowane przy pomocy /:-grade up.

   /: }. m
2 1 0

Zauważ, że powstałe indeksy są unikalne : lista nie ma zduplikowanych elementów (i dlaczego miałaby? Nie ma możliwości umieszczenia dwóch elementów w tej samej pozycji w tablicy).

Wreszcie używamy niszowej, ale =pomocnej klasyfikacji. Ta monada porównuje każdy unikalny element ze wszystkimi innymi elementami w tablicy. Pamiętasz, jak wspomniałem, że ważne jest, aby uzyskane oznaczenia były niepowtarzalne? Ponieważ =-self-classify dokonuje porównań w kolejności, w której unikalne elementy pojawiają się na liście, wynikowy wynik będzie macierzą tożsamości dla unikatowych danych wejściowych (dlatego =@i.właśnie można stworzyć macierz tożsamości o danej długości).

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

Gdy mamy już matrycę tożsamości, chodzi o dodanie rzędu jedności i kolumny jedynek, co odbywa się bardzo prosto (jeśli otrzymamy atom - tj. Pojedynczy element - ,rodzina powtórzy go, aby wypełnić, gdy jest dodawany) :

   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

Następnie po prostu porównujemy wygenerowaną macierz grotów strzałek z podpisem macierzy wejściowej.

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

2
Czy nie *wystarczy (zamiast 0@<17 bajtów)? Spróbuj
Galen Iwanow,

1
@GalenIvanov dobry połów, tak myślę. Dzięki! Czas ponownie edytować wyjaśnienie lol.
cole,

1
Wydaje mi się, że znalazłem nowy sposób na wygenerowanie macierzy tożsamości: =&/:kiedy to połączyłem }., dostałem to *-:1,1,.=&/:@}.na 15 bajtów Wypróbuj online!
Galen Iwanow

1
@GalenIvanov genialne podejście (zarówno użycie /:-grade i }.-behead), jeszcze raz dziękuję! Zmienię to.
cole

Hmm, w rzeczywistości *-:1,1,.=@}.działa dobrze - nie trzeba wymyślnego sposobu na znalezienie matrycy tożsamości. Możesz wygenerować macierz tożsamości z samej macierzy kwadratowej po prostu przez =. Tak więc upuść jeden wiersz za pomocą }., utwórz macierz tożsamości za pomocą = , dodaj wiersz i kolumnę za pomocą 1i tak dalej.
Galen Iwanow

9

Wolfram Language (Mathematica) , 47 bajtów

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

Wypróbuj online!

Objaśnienie: Clip@#zamienia wszystkie niezerowe liczby w macierzy na 1s, następnie porównujemy to z tablicą o wymiarach {1,1}Tr[1^#]= {Length@#, Length@#}z 0 w pozycji, i,jgdy 1 < i != j > 1i 1 w przeciwnym razie.

(Z grubsza w oparciu o odpowiedź Uriela .)

Oto kolejny pomysł, który ma 16 bajtów dłużej - możesz go ukraść, jeśli możesz zagrać w golfa:

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

Wypróbuj online!


8

APL (Dyalog Classic) , 19 16 15 13 bajtów

-1 bajt dzięki @ErikTheOutgolfer

( ⎕IO←0)

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

Wypróbuj online!

-2 bajty dzięki @ngn i @ H.PWiz

W jaki sposób?

(Macierz wejściowa 2D S )

  • ×≡Sprawdź, czy S jest dodatni tylko na ...
  • (∧=⌊ ... przekątne lub górny rząd i lewa kolumna ...
  • )/¨∘⍳∘⍴... od S .

ładne wykorzystanie ⍳∘⍴dla produktu kartezjańskiego.
Uriel,

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

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

2
@ngn Jeszcze lepiej: (∧=⌊)/oczywiście oba wymagają⎕IO←0
H.PWiz

7

PowerShell , 112 108 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe i manipuluje jako tablicę tablic, ponieważ PowerShell nie obsługuje macierzy (poza obsługą macierzy transformacji .NET Direct3D, co jest czymś zupełnie innym).

Cały algorytm opiera się na fakcie, że niezerowe liczby są prawdziwe, a zero jest falsey w PowerShell, i przy użyciu mnożenia do określenia tych wartości true / falsey.

Najpierw bierzemy pierwszy wiersz $a[0]i sprawdzamy, czy 0jest -into tablica, przechowujemy go w naszej $ozmiennej utput. Jeśli cokolwiek w tym wierszu jest równe zero, $oto również jest równe zero, w przeciwnym razie jest to jeden, wykonywany przez szybkie rzutowanie na int +.

Następnie zapętlamy od 1do $a.count-1, ustawiając $xpo drodze - będziemy zapętlać każdy rząd po jednym na raz.

W każdej iteracji ustawiamy zmienną pomocniczą, $iaby śledzić, na którym rzędzie się znajdujemy, a następnie zapętlamy od 0do, $xaby iterować każdy element w tym rzędzie. Wewnątrz wewnętrznej pętli znów się mnożymy $o, tym razem wybierając z zestawu krotek jako operator pseudo-trójskładnikowy.

Warunek krotki !$_-or$_-eq$i, mówi „kiedy jesteśmy na 0 kolumnie lub kolumna pasuje do wiersza (tj. Głównej przekątnej)”, aby wybrać drugą połowę krotki, gdy jest prawdą, lub pierwszą połowę, gdy falsey. Krotka składa się z !($y=$a[$i][$_]), $y. Pierwsza połowa ustawia się $yw golfa w drugiej połowie, ale tak czy inaczej wybieramy aktualny element. Pierwsza połowa robi na niej boolowską negację, podczas gdy druga połowa po prostu przyjmuje element takim, jaki jest. Zatem jeśli nie znajdujemy się na zerowej kolumnie ani głównej przekątnej, upewniamy się, że element jest równy zero, biorąc wartość logiczną. Podobnie, zapewniamy, że zerowa kolumna lub główna przekątna jest niezerowa, po prostu biorąc ją.

Więc teraz, gdy przeprowadziliśmy iterację przez każdy element w macierzy, $oalbo będzie, 0jeśli jakiś element był niepoprawny, albo inna niezerowa liczba całkowita, jeśli jest to macierz grotu strzałki. Podwoimy wartość logiczną, aby uzyskać jeden Falselub Trueodpowiednio, aby nasze wyniki były spójne, i pozostaje to w potoku, w którym drukowanie jest niejawne.


+= [int]? To miłe.
korzeń

@root Jedna ze wskazówek programu PowerShell .
AdmBorkBork,

7

Galaretka , 14 12 bajtów

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

-2 bajty z Pietu1998

Wypróbuj online!

Wyjaśnienie

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

Użyj powyższej macierzy jako przykładowego wejścia.

Œ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 Nie jestem pewien, co masz na myśli
dylnan

@ wizzwizz4 ten kod pokazuje, w jaki sposób elementy macierzy są przegrupowane. To zajmuje górną, lewą i główną przekątną. Czy o to ci chodziło?
dylnan

Miałem na myśli rzeczywistą wizualną reprezentację kodu, który podałeś w wyjaśnieniu. Starałem się być zabawny, ale to oczywiście nie działało. Wyczyszczę te komentarze.
wizzwizz4

7

APL (Dyalog) , 21 18 17 bajtów

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

Wypróbuj online!

W jaki sposób?

Ten idzie w drugą stronę -

=/¨∘⍳ - tworzy matrycę tożsamości

1-⍨⍴ - dla n - 1

1⍪1, - wstawia kolumnę i wiersz 1s

- porównuje z

× - pierwotna matryca, po tym jak została podpisana pod względem elementów


6

MATL , 15 bajtów

gtZyXy,!llY(]X=

Dane wejściowe to macierz (używana ;jako separator wierszy). Wyjście dotyczy 1grotu strzałki, w 0przeciwnym razie.

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

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
Czym dokładnie jest macierz Indeity ?
Erik the Outgolfer,

13
@EriktheOutgolfer oczywiście macierz zawierająca bóstwo.
cole,

5
@cole być może związany z macierzą nad polem Elizejskim
13

5

C (gcc) ,80 75 bajtów

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

Wypróbuj online!

Zaoszczędź 5 bajtów dzięki scottinet!

Ponownie wykorzystałem kod testowy z tej odpowiedzi .

Liniowo skanuje tablicę pod kątem niepoprawnych wartości, zwracając 0 dla macierzy grotów strzałek i 1 w przeciwnym razie. Sprawdzamy obliczając wartość wyłączną lub czy pozycja na danej pozycji ma wartość zero i czy ta pozycja znajduje się na strzałce.

Kodowanie informacji z tablicy 2D w jednym wymiarze prowadzi do dość prostego zestawu warunków. Jeśli pozwolimy ibyć naszym indeksem 0 w ntablicy wymiarowej, wtedy i<nopisuje pierwszy wiersz. Podobnie i%n==0opisuje pierwszą kolumnę i i/n==i%nopisuje przekątną.

Najlepszą sztuczką, jaką znalazłem do obsługi zwrotu, jest ustawienie wymiaru na zero po napotkaniu błędu. Powoduje to natychmiastowe zakończenie pętli, a następnie zwrócenie logicznej negacji wymiaru da nam jedną z dwóch różnych wartości. scottinet znalazł sposób, aby GCC zwrócił go ładniej.


-2 bajty i trochę więcej golfa
scottinet

i dodatkowe -4 bajty poprzez nadużywanie sposobu zwracania wartości przez gcc
scottinet

@scottinet Thanks! Miałem problem z ustaleniem, jaką wartość powinienem ustawić, aby użyć tej sztuczki.
FryAmTheEggman

Właściwie nie wierzę, że twój pierwszy golf działa. Zdał testy, ponieważ nigdy nie było zera na pierwszej pozycji. Dodano skrzynkę i wycofano tę zmianę.
FryAmTheEggman

int test0 [] = {0, 1, 1, 1, 1, 0, 1, 0, 1}; printf ("% d \ n", f (test0, 3)); Musi zwrócić 0, a nie 1 (jeśli jest to macierz 3x3 011 110 101), ponieważ [0,0] wynosi 0
RosLuP


5

R , 78 70 69 68 54 53 bajtów

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

Wypróbuj online!

Odpowiedź na przeniesienie Luisa Mendo jest znacznie krótsza niż moje poprzednie podejście.

Dzięki rturnbull za wskazanie błędu i grę w golfa!

stara odpowiedź, 68 bajtów:

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

Wypróbuj online!

Odpowiedź duckmayra sprawdza, czy wszystkie wpisy na głównej przekątnej i pierwszym wierszu / kolumnie ( m[i]) są niezerowe, a pozostałe ( m[-i]) są zerowe, przy użyciu jakiejś ładnej arytmetyki, aby uzyskać przekątną i pierwszy wiersz.

Ta odpowiedź sprawdza jednak, czy (1) wpisy zerowe nie znajdują się na głównej przekątnej lub pierwszym wierszu / kolumnie i (2), że istnieją, biorąc pod uwagę n x nmacierz, 3*n-2niezerowe wpisy.

whichzwraca indeksy tam, gdzie jest jego wejście TRUE, a opcjonalnie arr.ind=Tzwraca tablicę indeksów dla każdego wymiaru tablicowego, w tym przypadku dwóch.

Stąd kiedy any(i[,1]==i[,2])na przekątnej istnieje zero, a kiedy any(i==1)- w pierwszym rzędzie lub pierwszej kolumnie.

Ostatecznie, małe arytmetyczne pokazuje, że liczba niezerowych wpis musi być 3*n-2, nz pierwszej kolumny, n-1od przekątnej, a n-1w pierwszym rzędzie.


Wydaje się, że to nie działa w przypadku macierzy strzałek, w których wartości nie są 1. Czy chodziło Ci o to all(!m==!d)w ostatnim wierszu?
rturnbull

@rturnbull ah! Dziękuję Ci. Składnia operatora R jest tak dziwna. Naprawdę miałem na myśli, (!!m)==dale !ma niższy priorytet niż ==. Myślę jednak, że d==!!mpowinienem załatwić sprawę.
Giuseppe,

Wygląda na to, że d!=!mrobi to samo, o jeden bajt mniej. Możesz zapisać kolejny bajt, używając pryr::fskładni zamiast function.
rturnbull

Próbowałem grać w golfa, ale najlepsze, co mogę zrobić, to wciąż 53 .
JayCe

@JayCe nah zarówno twoją odpowiedź, jak i moją można zagrać w golfa do 52, i nie jestem pewien, dlaczego nie przyszło mi to do głowy ... opublikowałbym twoje jako osobne; podejście jednowierszowe jest całkiem miłe i podejrzewam, że może być jeszcze trochę miejsca na ulepszenie
Giuseppe,




3

Python 3 , 72 71 bajtów

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

Dzięki @xnor za grę w golfa na 1 bajcie!

Wypróbuj online!


Myślę, że 0<i!=j>0zapisuje bajt,
xnor

@xnor Thanks! Nie sądzę, żebym kiedykolwiek użył ponownie liczby w łańcuchu porównawczym ...
Dennis

2

Pyth, 22 21 bajtów

To zdecydowanie nie jest język do manipulacji matrycami.

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

Dla każdego wiersza bi jego indeksu kw macierzy ( .e) chwyta pierwszy i kczwarty wpis (lewy bok i przekątną) za pomocą ,@bkhi ( +) wszystkie pozostałe wpisy za pomocą .Db,0k. Jeśli k0 nie odpowiada pierwszemu wierszowi ( Wk), to! nie Mwszystkie z tych wpisów. Po wybraniu wszystkich z nich upewnij się, że wszystkie są prawdziwe. ( .As) Jeśli jest 0, gdzie nie powinno być, to odpowiednia lokalizacja zostanie złapana w takim stanie, w jakim jest i !zepsuje i, a jeśli jest niezerowa, w której nie powinna być, zostanie oznaczona jako 0, która jest również fałszywe.

Zestaw testowy.

-1 bajtów do zamiany zamówień.


1
Wow, to rozwiązanie jest naprawdę fajne, biorąc pod uwagę, że Pyth jest dość równoległy do ​​manipulacji matrycą. Prawdopodobnie jutro kolejny pojedynek w Pyth: P
Mr. Xcoder,

Możesz to skrócić za pomocą przycisku @VQUQlub .DVQUQ dla przekątnych / usuwania przekątnych. Wymagałoby to jednak zupełnie innego podejścia. Nie jestem pewien ... (BTW zapomniałeś zaktualizować link?)
Pan Xcoder,

@ Mr.Xcoder Naprawiono link, jutro postaram się zadzierać z innymi strategiami.
Steven H.

Przyjechałem w alternatywnym 21-byter używając mojego VQUQpomysłu: >.A++hCQhQ.(VQUQsstCt. Wydaje się to jednak bardzo zbędne. Możesz być w stanie go ulepszyć, aby zaoszczędzić kilka bajtów.
Pan Xcoder,

2

Pip , 31 23 22 bajtów

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

Jest to funkcja, która pobiera zagnieżdżoną listę liczb 2D. Wypróbuj online!

Wyjaśnienie

Tutaj dzieje się wiele porównań. Pierwszą rzeczą, o której należy wiedzieć, jest to, że operatory porównania w Pip można łączyć ze sobą, tak jak w Pythonie: 5>4>3jest 5>4 and 4>3(prawda), a nie (5>4)>3(fałsz). Po drugie, nie dotyczy ==to operatora „dokładnie równa się”. Kolejna różnica: regularne porównania mają wyższy priorytet niż operatorów mapowania MCi MMi mogą być używane w wyrażeniach lambda, natomiast ==ma niższy priorytet i nie mogę.

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

Aby wygenerować pierwszą macierz, używamy MC„map-coords”. Ten operator pobiera liczbę, generuje kwadratową siatkę współrzędnych o tym rozmiarze i odwzorowuje funkcję na każdą parę współrzędnych (x, y), zwracając listę list wyników. Na przykład {a+b} MC 3dałby wynik [[0; 1; 2]; [1; 2; 3]; [2; 3; 4]].

Tutaj rozmiar siatki jest #arozmiarem naszego oryginalnego argumentu. Funkcja 0<_!=B>0, która jest krótsza droga piśmie {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

Zwraca 0 dla pierwszego wiersza / kolumny i głównej przekątnej oraz 1 w innym miejscu.


2

Łuska , 12 11 bajtów

S≡ȯ´Ṫ§^*=ŀL

Wypróbuj online!

Wyjaśnienie

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?

Chodzi o to, że Husk definiuje 0 do potęgi 0 jako 1, więc zewnętrzny produkt ma 1s w pierwszym rzędzie i kolumnie. Również 1 do potęgi dowolnej liczby wynosi 1, więc produkt zewnętrzny ma 1s na przekątnej. Pozostałe wpisy są równe 0 potęgi pewnej liczby dodatniej, która wynosi 0. Daje to binarną macierz grotów strzały, którą porównujemy z danymi wejściowymi .


2

APL + WIN, 36 33 bajtów

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

Monity o wprowadzenie ekranu matrycy APL 2d.


2

Clojure, 128 95 92 85 bajtów

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

Zawsze ekscytujące są dwa kolejne nawiasy otwierające.

Orginalna wersja:

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

Pierwsza część polega na assoczrównaniu do zera ukośnych elementów macierzy podrzędnej i sprawdzeniu, czy wszystkie rzędy są równe :) Zastosowałem podobną sztuczkę w metodzie jakobian .

concatOstatnia część tworzy przekątną + pierwszy rząd i kolumnę i sprawdza, czy są dodatnie.


2

JavaScript (ES6), 58 bajtów

Moje rozwiązanie dla Javascript:

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

Nie tak sprytna jak odpowiedź Hermana , ale po prostu czułem, że powinienem ją tutaj zamieścić.


3
Witamy w PPCG!
Steadybox

2

Clojure, 212 206 188 bajtów

-6 bajtów poprzez usunięcie niektórych brakujących spacji i skrótów range. Być może będę musiał pozwolić temu usiąść, aby wymyślić lepszy sposób.

-18 bajtów dzięki @NikoNyrh i tworzeniu skrótów do 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)))))))))

Okropne, po prostu okropne. Nie wiem, dlaczego nie mogę owinąć głowy rozsądnym rozwiązaniem.

Pobiera na wejściu wektor zagnieżdżony.

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

Próbowałem przepisać to od zera przy użyciu innej metody i zakończyło się to dłużej. Zamiast ręcznie wykonać sekcje „spoczynkowe” macierzy, postanowiłem spróbować wygenerować wszystkie współrzędne w macierzy, wygenerować współrzędne grotu strzałki, a następnie użyć, clojure.set/differenceaby uzyskać komórki inne niż grot strzałki. Niestety połączenie z tym wbudowanym urządzeniem jest kosztowne:

223 bajty

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

Jest wiele miejsca na ulepszenia, na przykład #(drop 1 %)jest taki sam jak resti #(not(zero? %))jest taki sam jak pos?(ponieważ mamy liczby nieujemne). Możesz rzucić okiem na moją 128-bajtową odpowiedź, która ma podobne podejście w tym przypadku. Po wdrożeniu zdałem sobie sprawę, że bardzo trudno jest poradzić sobie z dostępem opartym na indeksie w pętli for.
NikoNyrh

@NikoNyrh Tak, tego dnia nie byłem w dobrym nastroju. Nie wiem, o czym zapomniałem rest. Prawdopodobnie powinienem po prostu zrzucić tę próbę i spróbować ponownie.
Carcigenicate,

2

Stax , 11 bajtów CP437

ä¢⌠┐xⁿtH↔BU

Wypróbuj online!

Wersja rozpakowana z 13 bajtami:

B|AsF:10i^\=*

Nareszcie związałem Łuskę i pobiłem Galaretę jednym bajtem ...

Wyjaśnienie

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 bajtów

$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

Wypróbuj online!


2
Niektóre gry w golfa - używaj, param($a)aby pobierać dane, -containsmożna je zamieniać na -inwszystkie i -eq0można je zamieniać !. Wreszcie, można pętla od 1góry do $a.lengthi pozbyć się if($_-ne0)w ciele pętli.
AdmBorkBork,

1

Perl 5 , 136 + 2 ( -ap) = 138 bajtów

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)

Wypróbuj online!



1

Japt , 16 bajtów

Ëe@!X^!(E*Y*nE
e

Przetestuj online!

Człowieku, to przenosi mnie z powrotem do dawnych dobrych czasów, kiedy Japt był regularnie znacznie dłuższy niż inne gry w golfa ...


1

K (oK) , 27 30 bajtów

Rozwiązanie:

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

Wypróbuj online!

Wyjaśnienie:

Muszę robić coś głupiego, ponieważ rozwiązania APL mają mniej niż połowę liczby bajtów ...

24 bajty wydane na tworzenie grotu strzałki. orrazem następujące trzy matryce:

/ 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

Pełny podział:

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?
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.