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 1
te, które znajdują się w górnym rzędzie, 1 2 2 2
a 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]]
źródło
Odpowiedzi:
JavaScript (ES6),
4847 bajtówZapisano 1 bajt dzięki edc65
Zwraca
false
dla macierzy grotów strzałek i macierzytrue
innych 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:
Pokaż fragment kodu
źródło
f=m=>m.some((r,y)=>r.some((c,x)=>(x*y&&x!=y)^!c))
f=
oczywiście;-)
J ,
2120191715 bajtów-4 bajty dzięki @GalenIvanov.
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.
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:
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ą (
}.
).Następnie otrzymujemy indeksy, w których znajdowałby się każdy wiersz, gdyby wiersze zostały posortowane przy pomocy
/:
-grade up.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).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) :Następnie po prostu porównujemy wygenerowaną macierz grotów strzałek z podpisem macierzy wejściowej.
źródło
*
wystarczy (zamiast0@<
17 bajtów)? Spróbuj=&/:
kiedy to połączyłem}.
, dostałem to*-:1,1,.=&/:@}.
na 15 bajtów Wypróbuj online!/:
-grade i}.
-behead), jeszcze raz dziękuję! Zmienię to.*-: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ą1
i tak dalej.Wolfram Language (Mathematica) , 47 bajtów
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,j
gdy1 < i != j > 1
i 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:
Wypróbuj online!
źródło
APL (Dyalog Classic) ,
19161513 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 .źródło
⍳∘⍴
dla produktu kartezjańskiego.×≡(=/∨1∊⊢)¨∘⍳∘⍴
(=/∨1∊⊢)
->(~≠⌊⌊)/
(∧=⌊)/
oczywiście oba wymagają⎕IO←0
PowerShell ,
112108 bajtówWypró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, czy0
jest-in
to tablica, przechowujemy go w naszej$o
zmiennej utput. Jeśli cokolwiek w tym wierszu jest równe zero,$o
to również jest równe zero, w przeciwnym razie jest to jeden, wykonywany przez szybkie rzutowanie na int+
.Następnie zapętlamy od
1
do$a.count-1
, ustawiając$x
po drodze - będziemy zapętlać każdy rząd po jednym na raz.W każdej iteracji ustawiamy zmienną pomocniczą,
$i
aby śledzić, na którym rzędzie się znajdujemy, a następnie zapętlamy od0
do,$x
aby 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ę$y
w 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,
$o
albo będzie,0
jeśli jakiś element był niepoprawny, albo inna niezerowa liczba całkowita, jeśli jest to macierz grotu strzałki. Podwoimy wartość logiczną, aby uzyskać jedenFalse
lubTrue
odpowiednio, aby nasze wyniki były spójne, i pozostaje to w potoku, w którym drukowanie jest niejawne.źródło
+
=[int]
? To miłe.Galaretka ,
1412 bajtów-2 bajty z Pietu1998
Wypróbuj online!
Wyjaśnienie
Użyj powyższej macierzy jako przykładowego wejścia.
źródło
APL (Dyalog) ,
211817 bajtówWypróbuj online!
W jaki sposób?
Ten idzie w drugą stronę -
=/¨∘⍳
- tworzy matrycę tożsamości1-⍨⍴
- dlan - 1
1⍪1,
- wstawia kolumnę i wiersz 1s≡
- porównuje z×
- pierwotna matryca, po tym jak została podpisana pod względem elementówźródło
MATL , 15 bajtów
Dane wejściowe to macierz (używana
;
jako separator wierszy). Wyjście dotyczy1
grotu strzałki, w0
przeciwnym razie.Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
źródło
C (gcc) ,
8075 bajtówWypró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
i
być naszym indeksem 0 wn
tablicy wymiarowej, wtedyi<n
opisuje pierwszy wiersz. Podobniei%n==0
opisuje pierwszą kolumnę ii/n==i%n
opisuje 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.
źródło
Python 2 , 75 bajtów
Wypróbuj online!
Python 2 , 85 bajtów
Przyjmując tablicę jako matrycę 1D:
Wypróbuj online!
źródło
R ,
787069685453 bajtówWypró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:
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 n
macierz,3*n-2
niezerowe wpisy.which
zwraca indeksy tam, gdzie jest jego wejścieTRUE
, a opcjonalniearr.ind=T
zwraca 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 kiedyany(i==1)
- w pierwszym rzędzie lub pierwszej kolumnie.Ostatecznie, małe arytmetyczne pokazuje, że liczba niezerowych wpis musi być
3*n-2
,n
z pierwszej kolumny,n-1
od przekątnej, an-1
w pierwszym rzędzie.źródło
all(!m==!d)
w ostatnim wierszu?(!!m)==d
ale!
ma niższy priorytet niż==
. Myślę jednak, żed==!!m
powinienem załatwić sprawę.d!=!m
robi to samo, o jeden bajt mniej. Możesz zapisać kolejny bajt, używającpryr::f
składni zamiastfunction
.Python 2 ,
9290 bajtówWypróbuj online!
Kredyty
źródło
Haskell , 62 bajty
-3 bajty dzięki Mr. Xcoder. -13 bajtów dzięki user28667. -5 bajtów dzięki Zgarb.
Wypróbuj online!
źródło
<1
takich sztuczkach? : P(x==y||x==0||y==0)==(m!!y!!x/=0)
powinien być krótszyx*y<1
.Galaretka , 10 bajtów
Wypróbuj online!
źródło
Python 3 ,
7271 bajtówDzięki @xnor za grę w golfa na 1 bajcie!
Wypróbuj online!
źródło
0<i!=j>0
zapisuje bajt,Pyth,
2221 bajtówTo zdecydowanie nie jest język do manipulacji matrycami.
Dla każdego wiersza
b
i jego indeksuk
w macierzy (.e
) chwyta pierwszy ik
czwarty wpis (lewy bok i przekątną) za pomocą,@bkh
i (+
) wszystkie pozostałe wpisy za pomocą.Db,0k
. Jeślik
0 nie odpowiada pierwszemu wierszowi (Wk
), to!
nieM
wszystkie 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ń.
źródło
@VQUQ
lub.DVQUQ
dla przekątnych / usuwania przekątnych. Wymagałoby to jednak zupełnie innego podejścia. Nie jestem pewien ... (BTW zapomniałeś zaktualizować link?)VQUQ
pomysłu:>.A++hCQhQ.(VQUQsstCt
. Wydaje się to jednak bardzo zbędne. Możesz być w stanie go ulepszyć, aby zaoszczędzić kilka bajtów.Pip ,
312322 bajtówJest 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>3
jest5>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 mapowaniaMC
iMM
i mogą być używane w wyrażeniach lambda, natomiast==
ma niższy priorytet i nie mogę.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 3
dałby wynik[[0; 1; 2]; [1; 2; 3]; [2; 3; 4]]
.Tutaj rozmiar siatki jest
#a
rozmiarem naszego oryginalnego argumentu. Funkcja0<_!=B>0
, która jest krótsza droga piśmie{0 < a != b > 0}
:Zwraca 0 dla pierwszego wiersza / kolumny i głównej przekątnej oraz 1 w innym miejscu.
źródło
Łuska ,
1211 bajtówWypróbuj online!
Wyjaśnienie
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
≡
.źródło
APL + WIN,
3633 bajtówMonity o wprowadzenie ekranu matrycy APL 2d.
źródło
Clojure,
128959285 bajtówZawsze ekscytujące są dwa kolejne nawiasy otwierające.
Orginalna wersja:
Pierwsza część polega na
assoc
zró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 .concat
Ostatnia część tworzy przekątną + pierwszy rząd i kolumnę i sprawdza, czy są dodatnie.źródło
JavaScript (ES6), 58 bajtów
Moje rozwiązanie dla Javascript:
Nie tak sprytna jak odpowiedź Hermana , ale po prostu czułem, że powinienem ją tutaj zamieścić.
Pokaż fragment kodu
źródło
Clojure,
212206188 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
.Okropne, po prostu okropne. Nie wiem, dlaczego nie mogę owinąć głowy rozsądnym rozwiązaniem.
Pobiera na wejściu wektor zagnieżdżony.
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/difference
aby uzyskać komórki inne niż grot strzałki. Niestety połączenie z tym wbudowanym urządzeniem jest kosztowne:223 bajty
źródło
#(drop 1 %)
jest taki sam jakrest
i#(not(zero? %))
jest taki sam jakpos?
(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.rest
. Prawdopodobnie powinienem po prostu zrzucić tę próbę i spróbować ponownie.Stax , 11 bajtów CP437
Wypróbuj online!
Wersja rozpakowana z 13 bajtami:
Nareszcie związałem Łuskę i pobiłem Galaretę jednym bajtem ...
Wyjaśnienie
źródło
R ,
8179 bajtów-2 bajty dzięki Mr. Xcoder
Wypróbuj online!
źródło
C, 117 bajtów
Wypróbuj online!
źródło
PowerShell , 186 bajtów
Wypróbuj online!
źródło
param($a)
aby pobierać dane,-contains
można je zamieniać na-in
wszystkie i-eq0
można je zamieniać!
. Wreszcie, można pętla od1
góry do$a.length
i pozbyć sięif($_-ne0)
w ciele pętli.Perl 5 , 136 + 2 (
-ap
) = 138 bajtówWypróbuj online!
źródło
Czysty , 79 bajtów
Wypróbuj online!
źródło
Japt , 16 bajtów
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 ...
źródło
K (oK) ,
2730 bajtówRozwiązanie:
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.
or
razem następujące trzy matryce:Pełny podział:
źródło