Definition
Eine Pfeilspitzenmatrix ist eine Matrix , in der alle Einträge gleich 0 sind , mit Ausnahme der Einträge in der Hauptdiagonale, der oberen Reihe und der ganz linken Spalte. Mit anderen Worten sollte die Matrix so aussehen:
* * * * * * * * 0 0 0 0 * 0 * 0 0 0 * 0 0 * 0 0 * 0 0 0 * 0 * 0 0 0 0 *
Wobei jedes * ein Eintrag ungleich Null ist.
Aufgabe
Überprüfen Sie anhand einer quadratischen Matrix nicht negativer Ganzzahlen, ob es sich um eine Pfeilspitze gemäß der obigen Definition handelt.
Sie können nicht die Größe der Matrix als Eingabe, es sei denn , äquivalent Ihre Sprache ist zu einem Array so etwas wie ein Zeiger und eine Länge (wie C). Es wird immer mindestens 3 x 3 sein.
Der kürzeste Code in Bytes in jeder Sprache gewinnt.
Ein- und Ausgang
Sie können eines der folgenden Formate für den Empfang von Eingaben auswählen:
- Eine Matrix im nativen Matrixtyp (falls Ihre Sprache eine hat)
- Ein 2D-Array 1 (ein Array von 1D-Arrays, die jeweils einer Zeile entsprechen)
- Ein 1D-Array (da die Matrix immer quadratisch ist)
- Ein String (Sie haben den Abstand gewählt, aber bitte missbrauchen Sie diesen in keiner Weise).
Wenn es um die Ausgabe geht, können Sie entweder einen Wahrheits- / Falschwert gemäß der Standarddefinition für Entscheidungsprobleme melden oder zwei unterschiedliche und konsistente Werte auswählen.
Darüber hinaus können Sie Eingaben und Ausgaben mit jeder Standardmethode und in jeder Programmiersprache vornehmen , wobei zu beachten ist, dass diese Lücken standardmäßig verboten sind. Wenn Sie ein anderes Format auswählen möchten oder unsicher sind, fragen Sie bitte in den Kommentaren.
1: oder die Entsprechung Ihrer Sprache (Liste, Vektor usw.)
Beispiele
Schauen wir uns die folgenden Beispiele an:
1 2 2 2 2 1 0 0 3 0 1 0 4 0 0 1
Dies ist eine Pfeilspitzenmatrix (Ihre Programme sollten einen Wahrheitswert melden), da die Elemente in der Hauptdiagonale 1 1 1 1
, die in der oberen Reihe 1 2 2 2
und die in der linken Spalte sind 1 2 3 4
. Alle anderen Einträge sind 0 , dies erfüllt also alle Bedingungen.
3 5 6 7 1 0 8 0 0
Diese Matrix ist keine Pfeilspitze, da sich auf der Hauptdiagonale eine 0 befindet .
9 9 9 9 9 9 0 0 9 7 9 0 9 0 0 9
Diese ist auch keine Pfeilspitze, da sie eine 7 anstelle einer 0 enthält .
Weitere Testfälle
Wahrheit:
[[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]]
Falsch:
[[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]]
quelle
Antworten:
Javascript (ES6),
4847 BytesDank edc65 1 Byte gespeichert
Rückgabe
false
für Pfeilspitzenmatrizen undtrue
für Nicht-Pfeilspitzenmatrizen (zulässig, da zwei unterschiedliche Werte verwendet werden können, um true und false darzustellen)Testfälle:
Code-Snippet anzeigen
quelle
f=m=>m.some((r,y)=>r.some((c,x)=>(x*y&&x!=y)^!c))
f=
natürlich;-)
J ,
21,20,19,17,15 Bytes-4 Bytes dank @GalenIvanov.
Nimmt die Eingabe als Matrix (Array Rang 2).
Probieren Sie es online!
Erläuterung
Lassen Sie die Bearbeitungshistorie eine Lektion für Sie sein, nicht Golf zu spielen und gleichzeitig eine Erklärung zu schreiben.
Visuelle Erklärung
Beachten Sie, dass dies auf dem REPL gemacht wird (Eingaben beginnen mit drei Leerzeichen und Ausgaben ohne führende Leerzeichen). Aus diesem Grund verzichte ich manchmal auf Kompositionsfunktionen wie
@
und&
da die REPL-Funktionen von rechts nach links ausgewertet werden (Funktionen sind komplexer).Angenommen, Sie haben die folgende Beispielmatrix:
Zunächst möchte ich @ GalenIvanovs sehr geschickte Art der Generierung der Identitätsmatrix erläutern (und ihm einen Gruß aussprechen). Dies ist die folgende
=&/:@}.
.Zuerst enthaupten wir die Eingabematrix (
}.
).Dann erhalten wir die Indizes, in denen sich jede Zeile befinden würde, wenn die Zeilen mit
/:
-grade up sortiert würden.Beachten Sie, dass die resultierenden Indizes eindeutig sind : Die Liste enthält keine doppelten Elemente (und warum? Es gibt keine Möglichkeit, zwei Elemente in einem Array an derselben Position zu platzieren).
Schließlich nutzen wir die Nische aber hilfreich-
=
selbst-klassifizieren. Diese Monade vergleicht jedes einzelne Element mit allen anderen Elementen in einem Array. Weißt du noch, wie ich erwähnt habe, dass es wichtig ist, dass die resultierenden Angaben eindeutig sind? Da=
-selbstklassifizieren die Vergleiche in der Reihenfolge durchführt, in der die eindeutigen Elemente in der Liste angezeigt werden, ist die resultierende Ausgabe die Identitätsmatrix für eine eindeutige Eingabe (aus diesem Grund=@i.
können Sie eine Identitätsmatrix mit einer bestimmten Länge erstellen ).Sobald wir die Identitätsmatrix haben, ist es eine Frage eine Reihe von Einsen des Hinzufügens und eine Spalte von Einsen, die sehr einfach gemacht wird (wenn ein Atom gegeben - dh eines einzelne Element - die
,
Familie wird es wiederholen zu füllen , wenn es hinzugefügt werden wird) :Dann vergleichen wir einfach die erzeugte Pfeilspitzenmatrix mit dem Signum der Eingabematrix.
quelle
*
Reicht nicht statt0@<
(für 17 Bytes)? Probieren Sie es aus=&/:
Als ich sie mit kombinierte}.
, bekam ich sie*-:1,1,.=&/:@}.
für 15 Bytes. Probieren Sie es online aus!/:
-grade und}.
-behead), nochmals vielen Dank! Ich werde es in bearbeiten.*-:1,1,.=@}.
funktioniert es einwandfrei - es ist kein ausgefallener Weg nötig, die Identitätsmatrix zu finden. Sie können eine Identitätsmatrix aus der Quadratmatrix selbst einfach durch generieren=
. Löschen Sie also eine Zeile mit}.
, erstellen Sie die Identitätsmatrix mit=
, fügen Sie eine Zeile und eine Spalte mit1
usw. hinzu.Wolfram-Sprache (Mathematica) , 47 Bytes
Probieren Sie es online!
Erklärung:
Clip@#
Ersetzt alle Zahlen in der Matrix, die nicht Null sind, durch 1 und vergleicht dies mit einem Array mit den Dimensionen{1,1}Tr[1^#]
={Length@#, Length@#}
mit 0 an der Position,i,j
wenn1 < i != j > 1
und 1 ansonsten.(Grob basierend auf Uriels Antwort .)
Hier ist eine weitere Idee, die 16 Byte länger ist:
Probieren Sie es online!
quelle
APL (Dyalog Classic) ,
19161513 Bytes-1 Byte dank @ErikTheOutgolfer
(
⎕IO←0
)Probieren Sie es online!
-2 Bytes dank @ngn und @ H.PWiz
Wie?
(2D Eingangsmatrix S )
×≡
Prüfen Sie, ob S nur bei ... positiv ist.(∧=⌊
... die Diagonalen oder die obere Reihe und linke Spalte ...)/¨∘⍳∘⍴
... von S .quelle
⍳∘⍴
für kartesisches Produkt.×≡(=/∨1∊⊢)¨∘⍳∘⍴
(=/∨1∊⊢)
->(~≠⌊⌊)/
(∧=⌊)/
natürlich erfordern beide⎕IO←0
PowerShell ,
112108 ByteProbieren Sie es online!
Nimmt Eingaben und Manipulationen als Array von Arrays, da PowerShell keine Matrizen unterstützt (außerhalb der Unterstützung für .NET Direct3D-Transformationsmatrizen, was etwas völlig anderes ist).
Der gesamte Algorithmus basiert auf der Tatsache, dass Zahlen ungleich Null wahr sind und Null in PowerShell falsch ist, und verwendet die Multiplikation, um diese Wahrheits / Falsch-Werte zu bestimmen.
Wir nehmen zuerst die erste Zeile
$a[0]
und prüfen, ob0
es sich um-in
dieses Array handelt. Speichern Sie dies in unserer$o
utput-Variablen. Wenn irgendetwas in dieser Zeile Null ist, dann$o
ist das auch Null, andernfalls ist es Eins, was durch ein schnelles Cast-to-Int mit gemacht wird+
.Als nächstes gehen wir in einer Schleife von
1
oben nach$a.count-1
unten, wobei$x
wir uns auf dem Weg befinden. Wir werden jede Reihe einzeln durchlaufen.Bei jeder Iteration setzen wir die Hilfsvariable
$i
, um zu verfolgen, in welcher Zeile wir uns befinden, und durchlaufen dann die Schleife von0
bis$x
, um jedes Element in dieser Zeile zu iterieren. Innerhalb der inneren Schleife multiplizieren wir erneut$o
aus einem Tupel-Setup einen pseudoternären Operator auswählen.Das Tupel ist bedingt,
!$_-or$_-eq$i
lautet "Wenn wir uns in der 0. Spalte befinden oder wenn die Spalte mit der Zeile (dh der Hauptdiagonale) übereinstimmt", um die zweite Hälfte des Tupels als wahr oder die erste Hälfte als falsch auszuwählen. Das Tupel besteht aus!($y=$a[$i][$_]), $y
. Die erste Hälfte ist$y
für das Golfen in der zweiten Hälfte vorgesehen, aber in beiden Fällen wird das aktuelle Element ausgewählt. In der ersten Hälfte wird die Boolesche Negation ausgeführt, während in der zweiten Hälfte das Element unverändert übernommen wird. Wenn wir uns also weder in der 0. Spalte noch in der Hauptdiagonale befinden, stellen wir sicher, dass das Element Null ist, indem wir das Boolesche-Nicht davon nehmen. In ähnlicher Weise stellen wir sicher, dass die 0. Spalte oder Hauptdiagonale nicht Null ist, indem wir sie einfach nehmen.Nun, da wir alle Elemente in der Matrix durchlaufen haben,
$o
ist dies entweder der Fall,0
wenn ein Element falsch war, oder eine Ganzzahl ungleich Null, wenn es sich um eine Pfeilspitzenmatrix handelt. Wir haben einen doppelten Booleschen Wert - nicht das, um einesFalse
oder dasTrue
andere zu erhalten, um unsere Ausgabe konsistent zu machen, und das verbleibt in der Pipeline, in der das Drucken implizit ist.quelle
+
=[int]
? Das ist nett.Jelly ,
1412 Bytes-2 Bytes von Pietu1998
Probieren Sie es online!
Erläuterung
Verwenden Sie die obige Matrix als Beispieleingabe.
quelle
APL (Dyalog) ,
211817 BytesProbieren Sie es online!
Wie?
Dieser geht den anderen Weg -
=/¨∘⍳
- Erstellt die Identitätsmatrix1-⍨⍴
- zumn - 1
1⍪1,
- Stellt eine Spalte und eine Zeile mit einer 1 voran≡
- vergleicht mit×
- die ursprüngliche Matrix, nachdem sie elementweise signiert wurdequelle
MATL , 15 Bytes
Die Eingabe ist eine Matrix (die
;
als Zeilentrennzeichen verwendet wird). Ausgabe ist1
0
ansonsten für die Pfeilspitze .Probieren Sie es online!Oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
C (gcc) ,
8075 BytesProbieren Sie es online!
5 Bytes gespart dank scottinet!
Wiederverwendung des Testcodes aus dieser Antwort .
Durchsucht das Array linear nach falschen Werten und gibt 0 für eine Pfeilspitzenmatrix und 1 für andere Werte zurück. Wir prüfen, indem wir das Exklusive oder berechnen, ob der Gegenstand an einer bestimmten Position Null ist und ob sich diese Position auf dem Pfeil befindet.
Das Codieren der Informationen des 2D-Arrays in eine Dimension führt zu einem relativ einfachen Satz von Bedingungen. Wenn wir
i
unseren 0-basierten Index in dasn
dimensionale Array aufnehmen lassen,i<n
wird die erste Zeile beschrieben. Ebensoi%n==0
beschreibt die erste Spalte undi/n==i%n
beschreibt die Diagonale.Der beste Trick, den ich für die Behandlung der Rückgabe gefunden habe, besteht darin, die Dimension auf Null zu setzen, wenn ein Fehler auftritt. Dadurch wird die Schleife sofort beendet. Wenn Sie dann die logische Negation der Dimension zurückgeben, erhalten Sie einen von zwei unterschiedlichen Werten. scottinet hat den Weg gefunden, GCC dazu zu bringen, es besser zurückzugeben.
quelle
Python 2 , 75 Bytes
Probieren Sie es online!
Python 2 , 85 Bytes
Nehmen Sie das Array als 1D-Matrix:
Probieren Sie es online!
quelle
R ,
787069685453 BytesProbieren Sie es online!
Porting Luis Mendo Antwort ist viel kürzer als mein früherer Ansatz.
Vielen Dank an rturnbull für das Aufzeigen eines Fehlers und das Abarbeiten eines Bytes!
alte Antwort, 68 Bytes:
Probieren Sie es online!
Die Antwort von duckmayr testet, dass alle Einträge in der Hauptdiagonale und in der ersten Zeile / Spalte (
m[i]
) ungleich Null sind und der Rest (m[-i]
) Null ist, wobei eine nette Arithmetik verwendet wird, um die Diagonale und die erste Zeile zu erhalten.Diese Antwort prüft jedoch, ob (1) Null-Einträge nicht in der Hauptdiagonale oder in der ersten Zeile / Spalte vorhanden sind und (2) ob bei einer gegebenen
n x n
Matrix3*n-2
Nicht-Null-Einträge vorhanden sind.which
Gibt die Indizes zurück, bei denen die Eingabe erfolgtTRUE
. Mit der Option "Optional"arr.ind=T
wird ein Array von Indizes für jede Arraydimension zurückgegeben, in diesem Fall zwei.Daher wenn
any(i[,1]==i[,2])
der Diagonale eine Null vorhanden ist, und wennany(i==1)
in der ersten Zeile oder in der ersten Spalte eine Null vorhanden ist.Schließlich wenig Arithmetik zeigt , dass die Anzahl von Nicht - Null - Einträgen muß
3*n-2
,n
von der ersten Spalte,n-1
von den Diagonalen, undn-1
aus der ersten Reihe.quelle
all(!m==!d)
in der letzten Zeile?(!!m)==d
aber!
hat eine niedrigere Priorität als==
. Ich denke,d==!!m
sollte den Trick machen.d!=!m
genauso aus, für ein Byte weniger. Sie können ein weiteres Byte speichern, indem Sie stattdessen auch diepryr::f
Syntax verwendenfunction
.Python 2 ,
92 bis90 BytesProbieren Sie es online!
Credits
quelle
Haskell , 62 Bytes
-3 Bytes dank Herrn Xcoder. -13 Bytes dank user28667. -5 Bytes dank Zgarb.
Probieren Sie es online!
quelle
<1
und solche Tricks? : P(x==y||x==0||y==0)==(m!!y!!x/=0)
sollte kürzer seinx*y<1
.Gelee , 10 Bytes
Probieren Sie es online!
quelle
Python 3 ,
7271 BytesVielen Dank an @xnor für das Golfen ab 1 Byte!
Probieren Sie es online!
quelle
0<i!=j>0
speichert ein Byte,Pyth,
2221 BytesDies ist definitiv nicht die Sprache für die Matrixmanipulation.
Ergreift für jede Zeile
b
und ihren Indexk
in der Matrix (.e
) die ersten undk
dritten Einträge (linke Seite und Diagonale) mit,@bkh
und (+
) alle anderen Einträge mit.Db,0k
. Wennk
nicht 0 ist, um der ersten Zeile (Wk
) zu entsprechen , dann sind!
nichtM
alle diese Einträge vorhanden. Wenn Sie alle ausgewählt haben, stellen Sie sicher, dass sie alle wahr sind. (.As
) Wenn es eine 0 gibt, bei der es keine geben sollte, wird der entsprechende Ort so wie er ist erfasst und das und durcheinander gebracht, und wenn es eine Nicht-Null gibt, bei der es keine geben sollte, wird dies!
mit 0 angegeben auch falsch.Testsuite.
-1 Bytes zum Vertauschen der Aufträge.
quelle
@VQUQ
oder.DVQUQ
Für Diagonalen / Löschen von Diagonalen verkürzen . Das würde aber einen ganz anderen Ansatz erfordern. Nicht sicher, aber ... (BTW vergessen, den Link zu aktualisieren?)VQUQ
Idee:>.A++hCQhQ.(VQUQsstCt
. Dies scheint jedoch überflüssig zu sein. Möglicherweise können Sie es optimieren, um ein paar Bytes zu sparen.Pip ,
312322 BytesDies ist eine Funktion, die eine in 2D verschachtelte Liste von Zahlen akzeptiert. Probieren Sie es online!
Erläuterung
Viele Vergleiche finden hier statt. Das Erste, was Sie wissen müssen, ist, dass Vergleichsoperatoren in Pip wie in Python miteinander verkettet werden können:
5>4>3
ist5>4 and 4>3
(wahr), nicht(5>4)>3
(falsch). Das zweite ist, dass dies nicht für==
den Operator "genau gleich" gilt. Ein weiterer Unterschied: Regelmäßige Vergleiche haben eine höhere Priorität als die Mapping-OperatorenMC
undMM
können in Lambda-Ausdrücken verwendet werden, während sie==
eine niedrigere Priorität haben und dies nicht können.Um die erste Matrix zu erzeugen, verwenden wir
MC
"Kartenkoordinaten". Dieser Operator nimmt eine Zahl, generiert ein quadratisches Koordinatengitter dieser Größe und ordnet jedem (x, y) Koordinatenpaar eine Funktion zu, die eine Liste mit Listen der Ergebnisse zurückgibt. Zum Beispiel{a+b} MC 3
würde das Ergebnis geben[[0; 1; 2]; [1; 2; 3]; [2; 3; 4]]
.Hier ist die Größe des Rasters
#a
die Größe unseres ursprünglichen Arguments. Die Funktion ist0<_!=B>0
, was eine kürzere Schreibweise ist{0 < a != b > 0}
:Dies gibt 0 für die erste Zeile / Spalte und die Hauptdiagonale und 1 an anderer Stelle zurück.
quelle
Schale ,
1211 BytesProbieren Sie es online!
Erläuterung
Die Idee ist, dass Husk 0 hoch 0 als 1 definiert, sodass das äußere Produkt in der ersten Zeile und Spalte 1s hat. Außerdem ist 1 hoch 1, sodass das äußere Produkt 1s auf der Diagonale hat. Andere Einträge sind 0 hoch einer positiven Zahl, die 0 ist. Dies ergibt eine binäre Pfeilspitzenmatrix, mit der wir die Eingabe vergleichen
≡
.quelle
APL + WIN,
3633 BytesFordert zur Bildschirmeingabe einer APL 2d-Matrix auf.
quelle
Clojure,
128959285 BytesEs ist immer wieder aufregend, zwei aufeinanderfolgende öffnende Klammern zu sehen.
Originalfassung:
Im ersten Teil werden
assoc
diagonale Elemente der Submatrix auf Null gesetzt und überprüft, ob alle Zeilen gleich sind :) Ich habe einen ähnlichen Trick bei der Jacobian-Methode angewendet .Der
concat
letzte Teil markiert die Diagonale + erste Zeile und Spalte und prüft, ob sie positiv sind.quelle
Javascript (ES6), 58 Byte
Meine Lösung für Javascript:
Nicht so schlau wie Hermans Antwort, aber ich hatte das Gefühl, dass ich es auch hier posten sollte.
Code-Snippet anzeigen
quelle
Clojure,
212206188 Bytes-6 Bytes durch Entfernen einiger fehlender Leerzeichen und Verknüpfung
range
. Möglicherweise muss ich das sitzen lassen, damit ich mir einen besseren Weg ausdenken kann.-18 Bytes dank @NikoNyrh und Erstellen von Verknüpfungen für
map
.Schrecklich, nur schrecklich. Ich weiß nicht, warum ich mich nicht um eine vernünftige Lösung kümmern kann.
Nimmt einen verschachtelten Vektor als Eingabe.
Ich habe versucht, dies mit einer anderen Methode von Grund auf neu zu schreiben, und es endete länger. Anstatt die "Rest" -Abschnitte der Matrix manuell herauszuschneiden, habe ich stattdessen beschlossen, alle Koordinaten in der Matrix zu generieren, die Koordinaten der Pfeilspitze zu generieren und dann
clojure.set/difference
die Nicht-Pfeilspitzenzellen zu erhalten. Leider ist der Anruf zu diesem eingebauten System teuer:223 Bytes
quelle
#(drop 1 %)
ist es dasselbe wierest
und#(not(zero? %))
dasselbe wiepos?
(da wir nicht negative Zahlen haben). Vielleicht möchten Sie einen Blick auf meine 128-Byte-Antwort werfen, die in diesem Fall einen ähnlichen Ansatz hat. Nachdem ich das implementiert hatte, wurde mir klar, dass es sehr kurz ist, sich mit indexbasiertem Zugriff in einer for-Schleife zu befassen.rest
. Ich sollte diesen Versuch wahrscheinlich einfach ausrangieren und es erneut versuchen.Stax , 11 Bytes CP437
Probieren Sie es online!
Entpackte Version mit 13 Bytes:
Endlich Husk gefesselt und von Jelly mit nur einem Byte geschlagen ...
Erläuterung
quelle
R ,
8179 Bytes-2 Bytes dank Mr. Xcoder
Probieren Sie es online!
quelle
C 117 Bytes
Probieren Sie es online!
quelle
PowerShell , 186 Byte
Probieren Sie es online!
quelle
param($a)
zu nehmen Eingang, die-contains
für ein getauscht werden-in
und alle die-eq0
für getauscht werden!
. Schließlich können Sie eine Schleife von1
bis zu$a.length
und loswerden derif($_-ne0)
in der Schleife Körper.Perl 5 , 136 + 2 (
-ap
) = 138 BytesProbieren Sie es online!
quelle
Sauber , 79 Bytes
Probieren Sie es online!
quelle
Japt , 16 Bytes
Online testen!
Mann, das bringt mich zurück in die guten alten Zeiten, als Japt regelmäßig viel länger als andere langsame Golfer war ...
quelle
K (ok) ,
2730 BytesLösung:
Probieren Sie es online!
Erläuterung:
Ich muss etwas Dummes tun, da die APL-Lösungen weniger als die Hälfte der Byteanzahl sind ...
24 Bytes für die Erstellung der Pfeilspitze.
or
zusammen die folgenden drei Matrizen:Vollständige Aufschlüsselung:
quelle