Herausforderung:
Bestimmen Sie bei einer Matrixeingabe die Anzahl der Diagonalen und Antidiagonalen mit doppelten Zahlen.
Wenn wir also eine Matrix wie diese haben:
[[aa,ab,ac,ad,ae,af],
[ba,bb,bc,bd,be,bf],
[ca,cb,cc,cd,ce,cf],
[da,db,dc,dd,de,df]]
Alle Diagonalen und Antidiagonalen wären:
[[aa],[ab,ba],[ac,bb,ca],[ad,bc,cb,da],[ae,bd,cc,db],[af,be,cd,dc],[bf,ce,dd],[cf,de],[df],
[af],[ae,bf],[ad,be,cf],[ac,bd,ce,df],[ab,bc,cd,de],[aa,bb,cc,dd],[ba,cb,dc],[ca,db],[da]]
Beispiel:
[[1,2,1,2,1,2],
[1,2,3,4,5,6],
[6,5,4,3,2,1],
[2,1,2,1,2,1]]
Alle Diagonalen und Antidiagonalen wären:
[[1],[2,1],[1,2,6],[2,3,5,2],[1,4,4,1],[2,5,3,2],[6,2,1],[1,2],[1],
[2],[1,6],[2,5,1],[1,4,2,1],[2,3,3,2],[1,2,4,1],[1,5,2],[6,1],[2]]
Entfernen aller Diagonalen und Antidiagonalen, die nur eindeutige Zahlen enthalten:
[[2,3,5,2],[1,4,4,1],[2,5,3,2],[1,4,2,1],[2,3,3,2],[1,2,4,1]]
Die Ausgabe ist also die Menge der Diagonalen und Antidiagonalen, die doppelte Zahlen enthalten:
6
Herausforderungsregeln:
- Wenn die Eingabematrix leer ist, nur 1 Zahl enthält oder in der gesamten Matrix nur eindeutige Zahlen enthält, erfolgt die Ausgabe immer
0
. - Die Eingabe enthält garantiert nur positive Ziffern
[1,9]
(es sei denn, sie ist vollständig leer). - Die Matrix ist immer rechteckig (dh alle Zeilen sind gleich lang).
- I / O ist flexibel. Die Eingabe kann als Liste von Listen mit ganzen Zahlen oder als 2D-Array von ganzen Zahlen oder als Matrix-Objekt als Zeichenfolge usw. usw. erfolgen. Sie können auch eine oder beide Dimensionen der Matrix als zusätzliche Eingabe verwenden wenn es Bytes in der Sprache Ihrer Wahl sparen würde.
Allgemeine Regeln:
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden. - Für Ihre Antwort gelten Standardregeln mit Standard-E / A-Regeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp, verwenden. Ihr Anruf.
- Standardlücken sind verboten.
- Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu (z. B. TIO ).
- Außerdem wird dringend empfohlen, eine Erklärung für Ihre Antwort hinzuzufügen.
Testfälle:
Input: Output:
[[1,2,1,2,1,2], 6
[1,2,3,4,5,6],
[6,5,4,3,2,1],
[2,1,2,1,2,1]]
[[]] 0
[[1,2], 0
[3,4]]
[[1,1], 2
[1,1]]
[[9,9,9], 6
[9,9,9],
[9,9,9]]
[[7,7,7,7], 8
[7,7,7,7],
[7,7,7,7]]
[[1,1,1], 1
[2,3,4],
[2,5,1]]
[[1,8,4,2,9,4,4,4], 12
[5,1,2,7,7,4,2,3],
[1,4,5,2,4,2,3,8],
[8,5,4,2,3,4,1,5]]
[[1,2,3,4], 4
[5,6,6,7],
[8,6,6,9],
[8,7,6,5]]
quelle
row
undcol
zu meiner Liste der "extrem situativen Funktionen" hinzufügen . Wirklich clevere Lösung.c(m|x-y,m|x+y)
gerade in den sapply Anruf bewegen , dasl=
Teil entfernen . Ich sehe keine fehlgeschlagenen Tests. Probieren Sie es online!l
Instanz übrig war.row
und hinzugefügt habencolumn
, weil ich noch nie von ihnen gehört habe.J ,
21-20Bytes-1 Byte danke an Jonah!
Probieren Sie es online!
Erläuterung:
quelle
(-.@-:~.)
mit "Die einzigartigen Gegenstände stimmen nicht überein" in J, aber ich bin auch schon oft darauf gestoßen und ich glaube nicht, dass man ... wir haben=
und~:
, eines Hand, und-:
und<this is missing>
.1#.|.,&((~:&#~.)/.)]
. Probieren Sie es online!&
, danke!Japt , 31 Bytes
Probieren Sie alle Testfälle aus
Erläuterung:
Ich habe auch eine Version ausprobiert, die auf Kirill Ls Haskell-Antwort basierte, konnte aber keinen guten Weg finden, um "nach einer Funktion des X- und Y-Index zu gruppieren", und die Alternative, die ich fand, war nicht gut genug.
quelle
JavaScript (ES6),
107 105 10198 ByteProbieren Sie es online!
Hinweis
Bei der Art und Weise, wie dieser Code gespielt wird, wird die Anti-Diagonale, die aus der einzigen unteren linken Zelle besteht, niemals getestet. Das ist in Ordnung, weil es möglicherweise keine doppelten Werte enthalten kann.
Kommentiert
quelle
05AB1E , 25 Bytes
Probieren Sie es online! oder als Testsuite
Erläuterung
Ich habe das Gefühl, hier etwas verpasst zu haben.
Versuchen Sie es später noch einmal.
quelle
rotate N left
wäre aberN._
jetzt. Soí‚εεygÅ0«N._]
funktioniert das auch. Kann auch die Abflachung mit dieser neuen Änderung entfernen ... immer noch keine Byte-Einsparungen:í‚vyεygÅ0«N._}ø}«ʒ0KDÙÊ}g
N(._
, aber deineNFÁ}
Länge ist gleich und in diesem Fall sogar noch kürzer, da sich]
die Schleife und die Maps gleichzeitig schließen. Insgesamt ist die Verwendung von._
nur dann sinnvoll, wenn im Vergleich zu 1 Byte gespart werden sollNFÀ}
.Python 2 ,
144136 BytesProbieren Sie es online!
quelle
Oktave , 98 Bytes
Probieren Sie es online!
quelle
cellfun
auch, und für die Masochistenstructfun
auch. In Octave ist es entweder eine for-Schleife oder eine havingfun
!Haskell,
118112 BytesProbieren Sie es online!
quelle
Charcoal ,
615653 BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Schleife über Vorwärts- und Rückwärtsdiagonalen;
i=0
stellt Vorwärtsdiagonalen dar, währendi=1
umgekehrte Diagonalen darstellt.Schleife über jeden Zeilenindex. Dies ist der Index für den Beginn der Diagonale.
Schleife über jeden Spaltenindex.
Berechnen Sie den Zeilenindex der Diagonale an diesem Spaltenindex. Ich verwende eine
for
Schleife über ein einzelnes Elementarray anstelle einer Zuweisung, da dies vermeidet, dass die Zuweisung mit der folgenden Anweisung in einen Block eingeschlossen werden muss, wodurch ein Byte gespeichert wird.Überprüfen Sie, ob dies die erste Spalte ist oder ob die Diagonale zwischen unten und oben gewickelt werden soll.
Ist dies nicht der Fall, entfernen Sie die letzte Liste aus der Liste der Listen.
Wenn dies der Fall ist, starten Sie eine neue leere Liste.
Fügen Sie der Liste den aktuellen diagonalen Eintrag hinzu.
Und schieben Sie diese Liste (zurück) zur Liste der Listen.
Zählen Sie die Anzahl der Listen, die Duplikate enthalten.
Nehmen wir ein Beispiel, wann
i=0
undk=1
. Dies bedeutet, dass wir bereits zwei Diagonalen gesammelt haben[[1,1,5,2],[9,4,3,5]]
. Hier ist unser Input:Wir machen dann eine Schleife
l
von0
bis7
. Dies erhöht sowohl die Zeile als auch die Spalte jedes Mal um 1:Die Liste ist jetzt
[[1,1,5,2],[9,4,3,5],[5,4,4]]
. Wenn dies jedoch der Falll
ist3
, haben wirk+l=4
ein Vielfaches der Höhe des Arrays. Dies bedeutet , dass wir brauchen , um eine neue Liste zu starten:[[1,1,5,2],[9,4,3,5],[5,4,4],[]]
. Wir sammeln dann weiterhin diagonale Elemente:Die Liste ist jetzt
[[1,1,5,2],[9,4,3,5],[5,4,4],[2,7,2,1]]
. Nun, wannl
ist7
, haben wir eink+l=8
weiteres Vielfaches der Höhe des Arrays. Dies bedeutet , dass wir brauchen , um eine neue Liste beginnen, die mit dem letzten Element dieser Diagonale endet:[[1,1,5,2],[9,4,3,5],[5,4,4],[2,7,2,1],[4]]
.Durch das Sammeln von Umhüllungsdiagonalen beginnend mit dem ersten Element jeder Reihe akkumulieren wir schließlich alle Diagonalen des Arrays.
quelle
Wolfram Language (Mathematica) ,
99 98 96 9483 BytesProbieren Sie es online!
Function[a,a~Diagonal~#&/@Range[t=-#~Total~2,-t]]
erhält alle Diagonalen vona
- was funktioniert, weil#~Total~2
größer ist als jede Dimension vona
.quelle
APL + WIN, 69 Bytes
Fordert zur Eingabe einer 2D-Matrix der Form 4 6⍴1 2 1 2 1 2 1 2 3 4 5 6 6 5 4 3 2 1 2 1 2 1 2 1 2 1 auf
Dies ergibt:
Probieren Sie es online! Mit freundlicher Genehmigung von Dyalog Classic
Erläuterung:
Erträge:
quelle
Perl 5,
8982 BytesTIO
quelle
TSQL,
140128 BytesEs wurde ein Weg gefunden, 12 Charaktere zu spielen. Dies ist nicht mehr die längste Lösung.
Golf gespielt:
Ungolfed:
Versuch es
quelle