Nicht überlappende Matrixsumme
Geben Sie bei k Arrays der Länge n die maximal mögliche Summe aus, indem Sie ein Element aus jedem Array verwenden, sodass keine zwei Elemente aus demselben Index stammen. Es ist garantiert, dass k <= n ist.
Eingang
Eine nicht leere Liste von nicht leeren Arrays mit ganzen Zahlen.
Ausgabe
Eine Ganzzahl, die die maximale Summe darstellt.
Beispiele
Input -> Output
[[1]] -> 1
[[1, 3], [1, 3]] -> 4
[[1, 4, 2], [5, 6, 1]] -> 9
[[-2, -21],[18, 2]] -> 0
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] -> 15
[[1, 2, 3, 4], [5, 4, 3, 2], [6, 2, 7, 1]] -> 16
[[-2, -1], [-1, -2]] -> -2
code-golf
array-manipulation
Quintec
quelle
quelle
Antworten:
Gelee ,
106 BytesProbieren Sie es online!
(4 Bytes gespart von @Dennis, der darauf hinwies, dass Jelly eine "Summe der Hauptdiagonalen" eingebaut hatte. Ich hatte nicht damit gerechnet, dass es eine davon gibt. Die vorherige Lösung hat die Operation implementiert, ohne die eingebaute zu verwenden. Die fragliche Operation,
Æṭ
, wird als "trace" definiert, aber der Trace wird nur für quadratische Matrizen definiert; Jelly implementiert auch eine Verallgemeinerung auf rechteckige Matrizen.)Die Verbesserung gegenüber den anderen Antworten beruht hauptsächlich auf einem einfacheren Algorithmus (der daher genauer ausgedrückt werden kann). Dieses Programm wurde ursprünglich in Brachylog v2 (
{\p\iᶠ∋₎ᵐ+}ᶠot
) geschrieben, aber Jelly verfügt über einige integrierte Funktionen für Teile des Programms, die in Brachylog geschrieben werden müssen.Erläuterung
Es sollte klar sein, dass wir für jede Lösung des Problems die Spalten der ursprünglichen Matrix permutieren können, um diese Lösung auf die Hauptdiagonale zu setzen. Diese Lösung kehrt das einfach um und findet alle möglichen Hauptdiagonalen von Permutationen.
Beachten Sie, dass die Operation "Spalten transponieren" als "Zeilen transponieren" ausgeführt wird, ohne sich die Mühe zu machen, zurück zu transponieren. Der Rest des Algorithmus ist zufällig symmetrisch zur Hauptdiagonale, sodass wir die Transponierung nicht rückgängig machen müssen und somit ein Byte sparen können.
quelle
ZŒ!ÆṭṀ
spart vier Bytes. Probieren Sie es online!ZŒ!ŒD§ṀḢ
vor, sich daran zu erinnern, dassÆṭ
das eine Sache war.J , 28 Bytes
Probieren Sie es online!
Hier wird der rekursive Aufruf ausgeführt,
$:
der die größte anonyme Funktion darstellt, die ihn enthält. Wir haben das Glück, in J das Primitive zu habenx u\. y
, das füru
aufeinanderfolgende "Outfixes" gilt ,y
die durch Unterdrücken aufeinanderfolgender Infixe der Längex
der Elemente in erhalten werdeny
. Hier möchten wir aufeinanderfolgende Spalten unterdrücken, um "Minderjährige" zu erhalten, also transponieren wir|:
die unteren Zeilen (oder Endpunkte}.
) vony
und greifen dann auf die Transponierung ihrer Outfixes zurück.quelle
Python 3 ,
94 90 89 8480 Bytes-4 Bytes dank xnor (mit Mengen anstelle von Listen)!
Probieren Sie es online!
quelle
y
einen Satz die Mitgliedschaft Prüfung zu verkürzen:f=lambda x,y={-1}:x>[]and max(e+f(x[1:],y|{i})for(i,e)in enumerate(x[0])if{i}-y)
.-1
Trick ist wirklich klug :) Vielen Dank!Schale ,
12 119 BytesProbieren Sie es online!
Vielen Dank an BMO , der einen Port für die Antwort von ais523 und eine 2-Byte-Speicherung vorgeschlagen hat, die ich weiter verbessert habe. BMO hat im Gegenzug 2 weitere Bytes gespart.
Vorherige Lösung (14 Bytes)
Probieren Sie es online!
Ich konnte keine Testsuite erstellen, da in dieser Antwort das erste Befehlszeilenargument explizit verwendet wird. Da Husk jedoch STDIN überhaupt nicht verwendet, habe ich alle Testfälle dort eingefügt. Sie können also zum Auschecken einfach Paste in das Argumentfeld kopieren. Beachten Sie auch, dass Arrays in Husk bei der Eingabe möglicherweise keine Leerzeichen zwischen Elementen enthalten.
Wie es funktioniert?
Code-Aufschlüsselung
Beispiel
Man muss genau einen Index aus jedem auswählen, so dass keine zwei Indizes übereinstimmen. Wir generieren also die Längenbereiche der Zeilen und behalten nur diese ohne Duplikate bei, was die folgenden Kombinationen ergibt (jede Kombination ist eine Spalte anstelle einer Zeile, um Platz zu sparen):
Anschließend indiziert das Programm jedes Element der Kombination in den Eingabelisten und gibt Folgendes zurück:
quelle
JavaScript (ES6),
74 bis71 ByteVielen Dank an @tsh für die Identifizierung von 2 unnötigen Bytes, mit denen ein Fehler
behoben wurde. 3 Bytes wurden dank @tsh gespeichert
Probieren Sie es online!
quelle
0
von Eingabe - Array,-1+(-1)
ist-2
und es ist richtige Antwort.f=([a,...r],k,i=1)=>a?Math.max(...a.map(c=>k&(i+=i)?-1/0:c+f(r,k|i))):0
Es ist seltsam,Math.max
speichert aber Bytes ...Jelly ,
13-12BytesProbieren Sie es online!
Alternative Version, 11 Bytes
Dabei wird die neu hinzugefügte Funktion verwendet
œ!
, die alle Permutationen einer bestimmten Länge generiert.Probieren Sie es online!
Wie es funktioniert
quelle
XLṗL
anstatt mitJ€Œp
.Haskell , 65 Bytes
Probieren Sie es online!
Erklärung & Ungolfed
Die Funktion erstellt
take i<>drop(i+1)
eine Liste und entfernt das Element an der Positioni
.Die Funktion
f
ruft jedes mögliche Elemente
an der Position abi
, entfernt die Elemente an der Positioni
von den verbleibenden Elementen und addierte
zum rekursiv berechneten Optimum:Und der Grundfall für die leere Liste ist nur
0
:quelle
Brachylog , 18 Bytes
Probieren Sie es online!
Erläuterung
quelle
Perl 6 ,
5049 BytesProbieren Sie es online!
Anständig kurz, trotz der langen
permutations
Anrufs. Dies ist ein anonymer Codeblock, der eine Liste von Listen aufnimmt und eine Zahl zurückgibt.Erläuterung:
quelle
K (oK) ,
40, 32, 28,19 Bytes-13 bytes dank ngn!
Probieren Sie es online!
Anfangslösung:
Probieren Sie es online!
Hinweis: Funktioniert nicht für den ersten Testfall [[1]]
Erläuterung:
{ }
- Funktion mit Argumentx
quelle
prm
kann direkt auf eine liste angewendet werden, um deren permutationen zu generieren=
, aber das Ergebnis war länger. Gibt esflatten
in OK?flatten
in welchem Sinne?(1 2 3; 4 5 6; 7 8 9) -> (1 2 3 4 5 6 7 8 9)
,/
oder wenn du willst, dass es in tiefere Strukturen geht:,//
Haskell , 65 Bytes
Probieren Sie es online!
71 Bytes
Probieren Sie es online!
Die
[x|x<-a,y<-a,x==y]==a
Überprüfungen, die die Elemente vona
unterscheiden. Dies verbraucht überraschend viele Zeichen, aber ich habe keinen kürzeren Weg gesehen.quelle
Pyth,
1512 BytesProbieren Sie es hier online aus .
Bearbeiten: 3 Bytes mit freundlicher Genehmigung von issacg gespeichert
quelle
.PUlhQl
kann durch ersetzt werden.plh
.V
ignoriert implizit alle zusätzlichen Einträge.05AB1E ,
1813 BytesIch habe das Gefühl , es ist zu lang, aber ich bin nicht sicher , wie vektorisiert Indizierung Byte-effizient in 05AB1E zu tun ..Und ich war in der Tat richtig , dass es zu lange war .. -5 Bytes dank @Emigna .Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
Beispiellauf:
[[1,4,2],[5,6,1]]
нgL
):[1,2,3]
œ
):[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
ε‚
):[[[[1,4,2],[5,6,1]],[1,2,3]],[[[1,4,2],[5,6,1]],[1,3,2]],[[[1,4,2],[5,6,1]],[2,1,3]],[[[1,4,2],[5,6,1]],[2,3,1]],[[[1,4,2],[5,6,1]],[3,1,2]],[[[1,4,2],[5,6,1]],[3,2,1]]]
ø
):[[[[1,4,2],1],[[5,6,1],2]],[[[1,4,2],1],[[5,6,1],3]],[[[1,4,2],2],[[5,6,1],1]],[[[1,4,2],2],[[5,6,1],3]],[[[1,4,2],3],[[5,6,1],1]],[[[1,4,2],3],[[5,6,1],2]]]
ε`è]
):[[4,1],[4,5],[2,6],[2,5],[1,6],[1,1]]
(Anmerkung: 05AB1E 0 indexiert (mit automatischer wraparound), so Indexieren3
in[5,6,1]
Ergebnisse in5
.)O
):[5,9,8,7,7,2]
à
):9
quelle
нgLœε‚øε
] OZ` für 13 .Haskell, 84 Bytes
Probieren Sie es online!
quelle
Ruby ,
747269 BytesProbieren Sie es online!
quelle
05AB1E , 7 Bytes
Port of @ ais523s Jelly CW-Antwort , also stelle sicher, dass du sie auch positiv bewertest!
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle