Eine Wechselzeichenmatrix ist eine n
By- n
Matrix bestehend aus den Zahlen -1, 0, 1, so dass:
- Die Summe jeder Zeile und Spalte ist 1
- Die Einträge ungleich Null in jeder Zeile und Spalte wechseln sich in Vorzeichen ab
Diese Matrizen verallgemeinern Permutationsmatrizen, und die Anzahl solcher Matrizen für eine gegebene Zeit n
war von Interesse. Sie treten natürlich während der Dodgson-Kondensationsmethode zur Berechnung von Matrixdeterminanten auf (benannt nach Charles Dodgson, besser bekannt als Lewis Carroll).
Hier einige Beispiele für 4 x 4 Wechselzeichenmatrizen:
0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0
0 0 1 0 0 0 1 0 0 1 -1 1 1 0 -1 1
1 0 0 0 0 1 -1 1 1 -1 1 0 0 1 0 0
0 0 0 1 0 0 1 0 0 1 0 0 0 0 1 0
Und hier sind einige Beispiele für 4 mal 4 Matrizen, bei denen es sich nicht um Matrizen mit alternierenden Vorzeichen handelt:
0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 -1 (last row and last column don't add to 1)
0 0 0 1
1 0 0 0
-1 1 1 0
1 0 0 0 (third row does not alternate correctly)
Ihr Programm oder der Funktion wird eine gegeben n
durch n
Matrix ( n >= 1
Ausgang a -) von -1S, 0en und 1en truthy Wert , wenn die gegebenen Matrix ist ein alternierendes Zeichen matrix, andernfalls Ausgeben eines falsy Wert.
Dies ist Codegolf , daher besteht das Ziel darin, die Anzahl der verwendeten Bytes zu minimieren.
Testfälle
Die folgenden Testfälle werden in einem Python-ähnlichen 2D-Listenformat angegeben.
Wahrheit:
[[1]]
[[1,0],[0,1]]
[[0,1],[1,0]]
[[0,1,0],[0,0,1],[1,0,0]]
[[0,1,0],[1,-1,1],[0,1,0]]
[[0,1,0,0],[0,0,1,0],[1,0,0,0],[0,0,0,1]]
[[1,0,0,0],[0,0,1,0],[0,1,-1,1],[0,0,1,0]]
[[0,0,1,0],[0,1,-1,1],[1,-1,1,0],[0,1,0,0]]
[[0,0,1,0],[1,0,-1,1],[0,1,0,0],[0,0,1,0]]
[[0,0,1,0,0],[0,1,-1,1,0],[1,-1,1,0,0],[0,1,0,-1,1],[0,0,0,1,0]]
[[0,0,1,0,0,0,0,0],[1,0,-1,0,1,0,0,0],[0,0,0,1,-1,0,0,1],[0,0,1,-1,1,0,0,0],[0,0,0,0,0,0,1,0],[0,0,0,0,0,1,0,0],[0,1,-1,1,0,0,0,0],[0,0,1,0,0,0,0,0]]
[[0,0,0,0,1,0,0,0],[0,0,1,0,-1,1,0,0],[0,0,0,1,0,0,0,0],[1,0,0,-1,1,-1,1,0],[0,1,-1,1,-1,1,0,0],[0,0,0,0,1,0,0,0],[0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1]]
Falsch:
[[0]]
[[-1]]
[[1,0],[0,0]]
[[0,0],[0,1]]
[[-1,1],[1,0]]
[[0,1],[1,-1]]
[[0,0,0],[0,0,0],[0,0,0]]
[[0,1,0],[1,0,1],[0,1,0]]
[[-1,1,1],[1,-1,1],[1,1,-1]]
[[0,0,1],[1,0,0],[0,1,-1]]
[[0,1,0,0],[0,0,0,1],[1,0,0,0],[0,0,1,-1]]
[[0,0,1,0],[0,0,1,0],[1,0,-1,1],[0,1,0,0]]
[[0,0,0,1],[1,0,0,0],[-1,1,1,0],[1,0,0,0]]
[[1,0,1,0,-1],[0,1,0,0,0],[0,0,0,0,1],[0,0,0,1,0],[0,0,0,0,1]]
[[0,0,1,0,0],[0,1,-1,1,0],[1,-1,1,0,0],[0,1,1,-1,0],[0,0,-1,1,1]]
[[0,-1,0,1,1],[1,-1,1,-1,1],[0,1,1,0,-1],[1,1,-1,1,-1],[-1,1,0,0,1]]
[[0,0,1,0,0,0,0,0],[1,0,1,0,1,0,0,0],[0,0,0,1,-1,0,0,1],[0,0,1,-1,1,0,0,0],[0,0,0,0,0,0,1,0],[0,0,0,0,0,1,0,0],[0,1,-1,1,0,0,0,0],[0,0,1,0,0,0,0,0]]
Antworten:
Retina ,
62585653 BytesDie Byteanzahl setzt die ISO 8859-1-Codierung voraus und
\t
sollte durch tatsächliche Tabulatoren ersetzt werden (0x09, die andernfalls von SE in Leerzeichen umgewandelt würden).Das Eingabeformat ist eine Matrix, in der jede Spalte drei rechtsbündige Zeichen verwendet, z.
Die Ausgabe ist entweder
0
(falsch) oder1
(wahr).Testsuite. (Die ersten Zeilen transformieren das Eingabeformat und lassen Retina mehrere Testfälle gleichzeitig ausführen.)
Erläuterung
Zum Glück handelt es sich bei der Eingabe um eine quadratische Matrix: Das Transponieren von Quadraten ist in der Netzhaut praktisch möglich, während das Transponieren von Rechtecken ein schwerwiegender Schmerz ist.
Wir beginnen, indem wir einen Tabulator anfügen, die gesamte Eingabe erneut (mit dem Präfix
$`
) und am Ende einen Zeilenvorschub (mit dem Alias der Retina¶
). Wir verwenden einen Tabulator, um die beiden Kopien zu trennen, damit wir sie beim Transponieren voneinander unterscheiden können, und indem wir ein Leerzeichen verwenden, können wir später ein paar Bytes sparen.Dies ist das schwierigste Bit: die erste Kopie der Matrix transponieren. Die Idee ist, Zellen in der ersten Kopie abzugleichen und sie dann (stabil) nach der horizontalen Position zu sortieren. Wir gleichen die Zellen mit
...
(da sie immer drei Zeichen breit sind) ab und messen dann die horizontale Position(.+)
innerhalb des Lookbehind. Um sicherzustellen, dass nur die erste Kopie transponiert wird, prüfen wir, ob der Anfang der Zeichenfolge erreicht werden kann, ohne an einem Tabulator vorbeizugehen.Möglicherweise stellen Sie fest, dass dies auch einigen Drei-Byte-Zeichenfolgen (die nicht einmal an den Zellen ausgerichtet sind) in der ersten Zeile der zweiten Kopie entspricht, da
.+
diese die Registerkarte passieren können. Dies ist jedoch kein Problem, da die horizontale Position dieser Übereinstimmungen streng größer ist als diejenige in der ersten Kopie, sodass diese Übereinstimmungen an ihrer Position verbleiben.Der Rest ist ziemlich einfach:
Wir entfernen Leerzeichen und Nullen aus der Eingabe.
Und schließlich prüfen wir, ob die gesamte Eingabe aus Zeilen besteht, die mit Leerzeichen abgeschlossen sind
1(-11)*
, dh eine abwechselnde Folge von1
und-1
die beginnt und endet mit1
(weil sie sonst nicht summiert1
).quelle
Gelee, 15 Bytes
Probieren Sie es online!
quelle
Pyth, 16 Bytes
Probieren Sie es online aus: Demo oder Test Suite
Erläuterung:
quelle
Jelly , 11 Bytes
Gibt 1 für Matrizen mit alternierendem Vorzeichen zurück, andernfalls 0 .Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Hintergrund
Ohne Berücksichtigung von Nullen muss jede Zeile und Spalte aus dem Muster (1, -1) * 1 bestehen , dh abwechselnd 1 und -1 , beginnend und endend mit einer 1 (die Summe ist also 1 ).
Um dies zu überprüfen, nehmen wir das Array aller Zeilen und Spalten und verbinden sie mit -1 als Trennzeichen. Da alle Endpunkte 1 sind , erfüllt das resultierende flache Array das Muster (1, -1) * 1 genau dann, wenn die Zeilen und Spalten dies tun.
Für den eigentlichen Test berechnen wir die kumulative Summe des Arrays. Für eine Wechselzeichenmatrix ist das Ergebnis ein Array von 0 und 1 , das mit einer 1 endet .
Wir kehren die kumulative Summe um und deduplizieren sie, wobei wir die Reihenfolge der anfänglichen Vorkommen aller eindeutigen Elemente beibehalten. Für eine wahrheitsgemäße Eingabe ist das Ergebnis die Liste [1, 0] .
Um den entsprechenden Booleschen Wert auszugeben, konvertieren wir die duplizierten kumulativen Summen von binär in ganzzahlig und prüfen, ob das Ergebnis ist 2 ist .
Wie es funktioniert
quelle
MATL,
18,16,1513 Bytes3 Bytes gespart dank @Luis
Diese Lösung akzeptiert ein 2D-Array als Eingabe und gibt ein wahres oder falsches Array aus. Es ist wichtig zu beachten, dass in MATL ein wahres Array aus allen Nicht-Null-Elementen besteht, während ein falsches Ergebnis mindestens ein Null-Element enthält. Hier ist eine weitere Demonstration von Truthy / Falsey-Arrays .
Probieren Sie es online
Geänderte Version, um alle Testfälle anzuzeigen
Erläuterung
quelle
Julia, 36 Bytes
Probieren Sie es online!
quelle
JavaScript (ES6),
112100 ByteVerflacht das Array und seine Transponierung in Strings und
0
prüft dann (ohne Berücksichtigung von s), ob1-11...1-11
in jedem String ein Muster vorhanden ist .Bearbeiten: 12 Bytes dank @PeterTaylor gespeichert.
quelle
-11-1...-11-1
suchen, da sich die Einträge abwechseln und eine positive Summe haben, muss es mehr1
als eins geben-1
, also muss das Muster sein1-11...1-11
.Python 2,
6360 BytesInput ist eine Liste von Tupeln.
Dies endet mit dem Exit-Code 0 für Matrizen mit wechselndem Vorzeichen und dem Exit-Code 1 ansonsten. Dies ist das, was true und false tun, und - wie im Abschnitt zur Überprüfung gezeigt - kann es tatsächlich als Bedingung in z. B. einem Bash-Skript verwendet werden.
Nachprüfung
test-cases.txt
test-suite.sh
Ausgabe
Wie es funktioniert
Ohne Berücksichtigung von Nullen muss jede Zeile und Spalte aus dem Muster (1, -1) * 1 bestehen , dh abwechselnd 1 und -1 , beginnend und endend mit einer 1 (die Summe ist also 1) ).
Um dies zu überprüfen, müssen wir die Eingabematrix M zippen / transponieren , das Ergebnis an M anhängen (jetzt bestehend aus einer Liste von Zeilen und Spalten) und jeder Zeile / Spalte ein -1 voranstellen .
Zum Beispiel, wenn M eine der folgenden Matrizen ist (gültig, ungültig)
Die Ergebnisse sind
Das zeilenweise Lesen der generierten Matrix muss zu einer flachen Sequenz mit dem Muster (-1, 1) führen * . Um dies zu überprüfen, nehmen wir die kumulative Summe aller Einträge, beginnend mit der obersten Zeile.
Für die Beispielmatrizen ergibt sich
Für eine gültige Wechselzeichenmatrix besteht die Ausgabe aus -1 und 0 und - da bei jedem -1 die vorherige 1 gelöscht wird und umgekehrt - aus keinen anderen Zahlen.
Auf den ersten Blick scheint dies zu scheitern, wenn geprüft wird, ob die letzte Spalte mit einer 1 endet . Für eine n × n- Matrix mit k Nullen enthalten gültige Zeilen jedoch n + k Einsen. Wenn alle Spalten außer der letzten ebenfalls gültig wären, gäbe es n + k - 1 in den Spalten, was unmöglich ist.
Um zu testen, dass es keine anderen Zahlen gibt, speichern wir die Teilsummen in einer Variablen s und aktualisieren sie für jeden Eintrag mit der generierten Matrix mit
s+=[n][s]
.Wenn s = 0 oder s = -1 ist , ist dies äquivalent zu
s+=n
. Bei allen anderen Werten von s wird jedoch ein IndexError ausgelöst , sodass Python sofort mit Exit-Code 1 beendet wird . Geschieht dies zu keinem Zeitpunkt, wird das Programm sauber mit dem Exit-Code beendet 0 beendet .quelle
R, 54 Bytes
Bei der anonymen Funktion wird dieselbe Logik wie bei Dennis 'Antworten zu Python 2, Jelly und Julia verwendet.
quelle