Addieren Sie bei einer gegebenen Matrix ihre Werte nach oben / unten oder links / rechts, um ein X zu bilden, falten Sie es nach oben und geben Sie die Liste zurück. Ich beschreibe den Algorithmus hier:
Algorithmus
Bei Ihrer Eingabe handelt es sich um eine quadratische Matrix mit ungeraden Zahlenwerten, die der angemessenen numerischen Kapazität Ihrer Sprache entspricht.
Nehmen wir als Beispiel die folgende Matrix:
1 2 3 2 1
0 3 2 3 0
4 2 5 6 3
7 4 7 9 4
0 6 7 2 5
Addieren Sie zunächst jede Zahl zu der nächstgelegenen Zahl auf der Hauptdiagonale oder der Antidiagonale. Das heißt, teilen Sie die Matrix in vier Abschnitte entlang der Hauptdiagonale und der Antidiagonale und addieren Sie dann alle Zahlen in jedem Abschnitt in Richtung der Mitte wie folgt:
1 2 3 2 1
↓ ↓ ↓
0 → 3 2 3 ← 0
↓
4 → 2 → 5 ← 6 ← 3
↑
7 → 4 7 9 ← 4
↑ ↑ ↑
0 6 7 2 5
Dieser Schritt ergibt folgendes Ergebnis:
1 1
5 5
39
17 15
0 5
Dann falten wir es, indem wir das X abflachen und die Elemente mit der linken oberen zuerst und der linken unteren zuletzt verweben. Dies ergibt folgendes Ergebnis:
1, 0, 5, 17, 39, 5, 15, 1, 5
Sie können sich vorstellen, die Hauptdiagonale zu dehnen und sie gegen den Uhrzeigersinn zu drehen.
Dies ist das Endergebnis.
Herausforderung
Implementieren Sie diesen Algorithmus. Es gelten Standardlücken. Alle sinnvollen E / A-Formate sind akzeptabel.
Testfälle
Input
Output
1 2 3 2 1
0 3 2 3 0
4 2 5 6 3
7 4 7 9 4
0 6 7 2 5
1, 0, 5, 17, 39, 5, 15, 1, 5
1 2 3 4 5
5 4 3 2 1
1 3 5 7 9
0 9 8 7 6
6 7 8 9 0
1, 6, 11, 16, 47, 7, 22, 5, 0
1 3 7 4 8 5 3
8 4 7 5 3 8 0
0 6 3 6 9 8 4
2 6 5 8 7 4 2
0 6 4 3 2 7 5
0 6 7 8 5 7 4
8 5 3 2 6 7 9
1, 8, 15, 11, 23, 20, 62, 32, 25, 13, 18, 3, 9
Antworten:
JavaScript, 113 Bytes
Code-Snippet anzeigen
quelle
~~
? Sie neutralisieren sich gegenseitig, so dass keine Notwendigkeit für sie besteht.~~undefined==0
, das ist also golfer als(a[q]||0)
.undefined
. Als ich den verwendeten Testfall tsh kopierte , bemerkte ich, dass es ohne den funktionierte~~
. Und da~~x
es sich ähnlich-(-x)
gegenseitig neutralisiert, dachte ich, dass es irgendwie aus Versehen dorthin gebracht wurde. Danke für die Korrektur.Jelly ,
252321 BytesProbieren Sie es online!
Alternative Version, 19 Byte
Dies hat nicht funktioniert, da
Ġ
sich verschachtelte Arrays nicht ordnungsgemäß verhalten haben. Der einzige Unterschied ist , dass die Paare [q, p] in erwähnt , wie es funktioniert sortiert sind lexikographisch anstelle des Abbildens sie zu p + nq vor dem Sortieren.Probieren Sie es online!
Hintergrund
Wir beginnen damit, die Elemente durch Koordinaten zu ersetzen, nach links und unten zu erhöhen und (0, 0) zu platzieren. in der Mitte der Matrix zu platzieren.
Für eine 7x7 Matrix M erhalten wir die folgenden Koordinaten.
Wir berechnen nun den minimalen Absolutwert jedes Koordinatenpaares und multiplizieren die Vorzeichen beider Koordinaten damit, indem wir (i, j) auf (Vorzeichen (i) m, Vorzeichen (j) m) abbilden. , wobei m = min (| i | , | j |) .
Matrixelemente, die demselben Paar entsprechen, müssen summiert werden. Um die Reihenfolge der Summen zu bestimmen, bilden wir jedes Paar (p, q) auf p + nq ab , wobei n die Anzahl der Zeilen / Spalten von M ist .
Die Reihenfolge der Summen entspricht der Reihenfolge der ganzen Zahlen und ihrer Summanden.
Wie es funktioniert
quelle
Python,
159158 BytesProbieren Sie es online!
quelle
y+1+(y>l-2)
kann sein(y>l-2)-~y
.Dyalog APL ,
10199646259 Bytes3 Bytes von @ Adám gespeichert
Probieren Sie es online!
Mit Dennis ' fantastischem Algorithmus .
quelle
APL (Dyalog) , 60 Byte *
In Zusammenarbeit mit meinem Kollegen Marshall .
Anonymes Präfix Lambda. Nimmt Matrix als Argument und gibt Vektor zurück. Geht davon aus
⎕IO
( I ndex O Rigin) Null sein, die standardmäßig auf vielen Systemen ist.Probieren Sie es online!
{
…}
Anonymes Lambda;⍵
ist das richtige Argument (als äußerster rechter Buchstabe des griechischen Alphabets):⍴⍵
Form des Arguments (Liste zweier identischer Elemente)r←
speichern alsr
(wie in r ho)⍳
Alle ɩ ndices einer Anordnung von dieser Größe, das heißt(0 0)
,(0 1)
...i←
speichern ini
(wie in i ota)=/¨
Boolescher Wert, bei dem die Koordinaten gleich sind (dh die Diagonale)(
…)
Wende diese anonyme implizite Präfixfunktion an:⌽
kehren Sie das Argument um⊢∨
ODER das mit dem unveränderten Argument,
ravel (in einfache Liste glätten)Wir haben jetzt eine Boolesche Maske für die Diagonalen.
(
… Damit)/⍨
filtern Sie Folgendes:⊢⍵
Geben Sier
das Argument (um es zu trennen ){
...}⌺r
auf jedes Elemente das folgende anonymous Infix lambda nennen, mit demr
-Umgebung (mit Nullen aufgefüllt , wie erforderlich) als rechtes Argument (⍵
), und eine Zwei - Element - Liste der Anzahl gepolsterter Zeilen, Spalten (negativ für Boden / rechts, Null für keine) als linkes Argument (⍺
):r÷2
r
mit zwei teilen⊃
wähle das erste Element (sie sind identisch)⌊
Boden ess←
Speicher alss
(für s hape)i∊⍨¨
für jedes Element voni
ist Boolean ifs
ein Mitglied davon⍵×
multiplizieren Sie die Nachbarschaft damit(
…)↓
Löschen Sie die folgende Anzahl von Zeilen und Spalten (negativ für unten / rechts):×⍺
Zeichen des linken Arguments (dh die Richtung der Auffüllungen)-
negierens×
multiplizieren Sies
damit,
ravel (in Liste begradigen)+/
Summe (plus Ermäßigung)Jetzt haben wir eine vollständige Summenmatrix, aber wir müssen alle gelesenen Werte spaltenweise filtern.
⍉
transponieren,
ravel (in einfache Liste glätten)* Durch Zählen
⌺
als⎕U233A
.Probieren Sie es online!quelle