Nehmen Sie eine Matrix A, die aus positiven ganzen Zahlen und einer einzelnen positiven ganzen Zahl N besteht, als Eingabe und bestimmen Sie, ob in einer Zeile oder Spalte in der Matrix mindestens N aufeinanderfolgende Vorkommen derselben Zahl vorhanden sind.
Sie müssen nur horizontal und vertikal testen.
Testfälle
N = 1
A =
1
Result: True
----------------
N = 3
A =
1 1 1
2 2 3
Result: True
----------------
N = 4
A =
1 1 1
2 2 3
Result: False
----------------
N = 3
A =
3 2 3 4 2 1
4 1 4 2 4 2
4 2 3 3 4 1
1 1 2 2 3 4
3 2 3 1 3 1
1 1 2 2 3 4
Result: True
----------------
N = 1
A =
5 2 3 8
Result: True
----------------
N = 3
111 23 12 6
111 53 2 5
112 555 5 222
Result: False
----------------
N = 2
4 2 6 2 1 5
2 3 3 3 3 3
11 34 4 2 9 7
Result: True
Erklärungen sind immer eine gute Sache :)
code-golf
number
decision-problem
matrix
Stewie Griffin
quelle
quelle
Antworten:
Schale , 9 Bytes
Nimmt ein 2D-Array und eine Zahl, gibt
0
für falsche Instanzen eine positive und für wahrheitsgemäße Instanzen eine positive Zahl zurück. Probieren Sie es online!Erläuterung
Husk ist eine funktionale Sprache, daher besteht das Programm nur aus mehreren Funktionen.
quelle
Dyalog APL,
272523 BytesProbieren Sie es online!
Dank an @MartinEnder und @Zgarb für jeweils -2 Bytes (Komposition macht die Verwendung von
w
und sinnlosen Parens überflüssig)Benachrichtigen Sie mich bei Problemen und / oder Problemen mit dem Golfsport. Linkes Argument ist N , rechtes Argument ist A .
Erläuterung:
quelle
Perl 6 , 60 Bytes
Probieren Sie es online!
@^m
ist die Eingabematrix (erstes Argument) und$^n
die Anzahl aufeinanderfolgender Vorkommen, auf die geprüft werden soll (zweites Argument).[Z,] @^m
ist die Transponierte der Eingangsmatrix.(@^m | [Z,] @^m)
ist eine Oder-Verknüpfung der Eingangsmatrix und ihrer Transponierten. Das Folgende wirdmap
zu einem Wahrheitswert ausgewertet, wenn$^n
aufeinanderfolgende gleiche Werte in einer Zeile des Aufrufers auftreten. Wird sie auf die Eingabematrix ODER ihre Transponierung angewendet, ergibt sie einen Wahrheitswert, wenn entweder die Eingabematrix oder ihre Transponierung$^n
aufeinanderfolgende gleiche Werte in einer Zeile enthält. Wenn die Transponierte diese Bedingung erfüllt, bedeutet dies, dass die Eingabematrix$^n
aufeinanderfolgende gleiche Werte in einer ihrer Spalten enthält.*.rotor($^n => $^n - 1)
verwandelt jede Zeile in eine Folge von$^n
-Element-Slices. Wenn beispielsweise$^n
3 und eine Zeile 3 ist<1 2 2 2 3>
, wird dies zu ausgewertet(<1 2 2>, <2 2 2>, <2 2 3>)
..map({ [==] $_ })
verwandelt jedes Slice in einen Booleschen Wert, der angibt, ob alle Elemente des Slice gleich sind. Fortsetzung des vorherigen Beispiels wird dies(False, True, False)
..any
verwandelt diese Folge von Booleschen Werten in eine Oder-Verknüpfung, die wahr ist, wenn einer der Booleschen Werte wahr ist.Die Ausgabe ist ein Wahrheits- oder Verknüpfungswert, der wahr ist, wenn entweder die Eingabematrix oder ihre Transponierte eine beliebige Zeile haben, in der
$^n
aufeinanderfolgende Werte gleich sind.quelle
MATL , 12 Bytes
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
Eine nicht quadratische Matrix kann weder vertikal noch horizontal ordnungsgemäß mit ihrer Transponierten verknüpft werden. Der Code verkettet sie also diagonal , indem er eine blockdiagonale Matrix erstellt.
Die resultierende Matrix wird in Spaltenhauptordnung und Lauflängencodierung linearisiert. Die aus der blockdiagonalen Verkettung resultierenden Nullen dienen dazu, die Läufe der Istwerte zu isolieren.
Die Ergebnisse der Lauflängencodierung sind ein Array von Werten und ein Array von Lauflängen. Die Lauflängen, die Nicht-Null-Werten entsprechen, werden beibehalten. Die Ausgabe erfolgt,
1
wenn einige dieser Längen größer oder gleich der Eingabenummer sind, und0
andernfalls.Lassen Sie uns die Zwischenergebnisse sehen, um es klarer zu machen. Betrachten Sie Eingaben
und
Die Blockdiagonalmatrix mit der Eingangsmatrix und ihrer Transponierung (Code
t!Yd
) lautet:Diese Matrix ist implizit linearisiert in der Hauptreihenfolge der Spalten (unten, dann quer):
Die Lauflängencodierung (Code
Y'
) ergibt die folgenden zwei Vektoren (hier als Zeilenvektoren gezeigt; tatsächlich sind sie Spaltenvektoren): Vektor mit Wertenund Vektor mit Lauflängen
Wenn Sie nur die Längen einhalten, die Nicht-Null-Werten (Code
wg)
) entsprechen, erhalten SieWenn man vergleicht, um zu sehen, welche Längen größer oder gleich der eingegebenen Nummer (Code
>~
) sind, wird der Vektor erzeugtSchließlich sollte die Ausgabe
true
(angezeigt als1
) sein, wenn der obige Vektor mindestens einentrue
Eintrag (Codea
) enthält. In diesem Fall ist das Ergebnisquelle
Oktave,
77-70BytesProbieren Sie es online!
Erläuterung: Da die Matrix nur Ganzzahlen ungleich Null enthält, können wir der Matrix einen Rand von Nullen hinzufügen und die Lauflängencodierung der Matrix berechnen (in einen Vektor umgeformt).
quelle
runlength
... Lernen Sie jeden Tag etwas Neues ...runlength
! Da ich mich mehr auf Matlab konzentrierte, erinnerte ich mich nicht daran, dass es in Octaverunlength
.Gelee ,
98 BytesNimmt die Matrix als Argumente und liest die Ganzzahl aus STDIN.
Probieren Sie es online!
Wie es funktioniert
Beispiellauf
quelle
;Z
, obwohl in Japt statt Jelly ...Ȧ
Atom wurde jedoch von MATL inspiriert.E
ja, meins war viel zu lang. Richtig, das Eingebaute war der Weg, es zu tun. Schön :)Python 2 ,
609291 BytesProbieren Sie es online!
Anstatt zu zählen, wird eine Liste mit der Größe
n
(für jedes Element in der Matrix) erstellt und überprüft, ob es sich in der Matrix befindetOhne Zeichenketten 94 Bytes
Probieren Sie es online!
quelle
Oktave , 59 Bytes
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Dies verwendet den gleichen Ansatz wie meine MATL-Antwort (siehe Erläuterung dort).
quelle
blkdiag(A,A')
. Sehr schön!Japt ,
181514 BytesProbier es aus
Erläuterung
quelle
cUy)®ò¦ d_l ¨V\nd
und mit 2 Bytes einsparencUy)d_ò¦ d_l ¨V
, und dann haben Sie praktisch meine (gelöschte) Lösung.CJam , 16 Bytes
Probieren Sie es online!
Erläuterung
quelle
runlength
Funktion die Ausgänge auch in dieser Reihenfolge aus. Aber irgendwie fühle ich die Reihenfolgevalue, length
natürlicherPython 3 ,
129128125120104101 BytesVielen Dank an @Zachary T, @Stewie Griffin, @Mr. Xcoder, @Rod, @totallyhuman für die deutliche Verbesserung.
Probieren Sie es online!
quelle
1
undif
.a=b;b=0;c=0
mita=b=c=0
m+zip(*m)
stattdessenm
in der 4. Zeile die 1. Zeile ganz weglassenn<=max()
und die letzte Zeile verschieben könnten alsn<=c
b=b+1
benutzenb+=1
... Ahh, Ninja'd von @StewieGriffin05AB1E ,
16 1412 BytesProbieren Sie es online!
quelle
0
s in der zweiten Zeile. Es sollte also wahr sein.[3,3,3]
. Ich habe die Herausforderung in diesem Fall falsch verstanden, also denke ich, dass ich hier falsch liege.Jelly , 18 Bytes
Probieren Sie es online!
Gibt
0
für false und für truthy eine Ganzzahl ungleich Null zurück.Ew, das ist schlecht. Und sehr lange. Golftipps wären willkommen :)
quelle
JavaScript (ES6), 99 Byte
Übernimmt die Matrix
m
und die erwartete Anzahl der Vorkommenn
in der Currying-Syntax(m)(n)
. Gibt einen Booleschen Wert zurück.Wie?
Dieser Code ist nicht besonders kurz, aber ich wollte einen Ansatz ausprobieren, der ausschließlich auf regulären Ausdrücken basiert.
Umwandlung der Matrix in einen String
Wir verwenden,
m.join('|')
um das 2D-Array in einen String umzuwandeln. Dies bewirkt zunächst einen impliziten Zwang der Matrixzeilen zu durch Kommas getrennten Zeichenfolgen.Zum Beispiel diese Eingabe:
wird umgewandelt in:
Zeilenabgleich
Wir suchen nach aufeinanderfolgenden Vorkommen in einer Reihe mit:
Das passt zusammen:
\b
eine Wortgrenze\d+
gefolgt von einer Nummer(){n-1}
n-1 mal gefolgt von:,
ein Komma\1
gefolgt von unserer Referenz: eine Wortgrenze + die erste Zahl\b
gefolgt von einer WortgrenzeSpaltenübereinstimmung
Wir suchen nach aufeinanderfolgenden Vorkommen in einer Spalte mit:
wo
L
ist die Länge einer Reihe.Das passt zusammen:
\b
eine Wortgrenze\d+
gefolgt von einer Nummer(){n-1}
n-1 mal gefolgt von:(){L-1}
L-1 mal:.
Beliebiges Zeichen (effektiv: entweder ein Komma oder eine Pipe)\d+?
gefolgt von einer Zahl (diese darf nicht gierig sein).
gefolgt von einem beliebigen Zeichen (erneut: entweder ein Komma oder eine Pipe)\1
gefolgt von unserer Referenz: eine Wortgrenze + die erste Zahl\b
gefolgt von einer WortgrenzeTestfälle
Code-Snippet anzeigen
quelle
Python 2 , 64 Bytes
Probieren Sie es online!
quelle
Clojure, 77 Bytes
Erstellt alle aufeinander folgenden Partitionen
p
der LängeN
(Symbol%2
) und zählt, wie viele unterschiedliche Werte es hat. Dann bildet es die Menge dieser Längen und gibt zurück,1
ob es aus der Menge undnil
anderen gefunden wird.for
Das Konstrukt passte perfekt dazu, mein ursprünglicher Versuchflatten
,concat
oder so etwas in der Art.quelle