Somme de matrice sans chevauchement
Étant donné k tableaux de longueur n , affichez la somme maximale possible en utilisant un élément de chaque tableau de sorte qu'il n'y ait pas deux éléments du même index. Il est garanti que k <= n.
Contribution
Une liste non vide de tableaux non vides d'entiers.
Sortie
Un entier qui représente la somme maximale.
Exemples
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
la source
la source
Réponses:
Gelée ,
106 octetsEssayez-le en ligne!
(4 octets enregistrés par @Dennis, qui a souligné que Jelly avait une "somme de la diagonale principale" intégrée. Je ne m'attendais pas à ce qu'elle en ait une; la solution précédente implémentait l'opération sans utiliser la fonction intégrée. L'opération en question,
Æṭ
, est défini comme "trace", mais la trace n'est définie que pour les matrices carrées; Jelly implémente également une généralisation aux matrices rectangulaires.)L'amélioration par rapport aux autres réponses provient principalement d'un algorithme plus simple (donc terser pour exprimer); ce programme a été écrit à l'origine dans Brachylog v2 (
{\p\iᶠ∋₎ᵐ+}ᶠot
), mais Jelly a quelques prédéfinis pour des parties du programme qui doivent être précisées dans Brachylog, donc cela est sorti plus court.Explication
Il doit être clair que pour toute solution au problème, nous pouvons permuter les colonnes de la matrice d'origine pour mettre cette solution sur la diagonale principale. Donc, cette solution inverse simplement cela, en trouvant toutes les diagonales principales possibles de permutations.
Notez que l'opération "permuter les colonnes" se fait comme "transposer, permuter les lignes" sans prendre la peine de transposer en arrière; le reste de l'algorithme se trouve être symétrique par rapport à la diagonale principale, nous n'avons donc pas besoin d'annuler la transposition et pouvons donc enregistrer un octet.
la source
ZŒ!ÆṭṀ
enregistre quatre octets. Essayez-le en ligne!ZŒ!ŒD§ṀḢ
avant de me souvenir queÆṭ
c'était une chose.J , 28 octets
Essayez-le en ligne!
Ici, l'appel récursif est effectué par
$:
lequel représente la plus grande fonction anonyme qui le contient. On a de la chance en J d'avoir la primitivex u\. y
, qui s'appliqueu
aux "outfixes" successifs dey
obtenus en supprimant les infixes successifs de longueurx
des items eny
; ici, nous voulons surpresser les colonnes successives pour obtenir des "mineurs", donc nous transposons|:
les lignes inférieures (ou queue}.
) dey
, puis récursions sur la transposition de leurs outfixes.la source
Python 3 ,
94 90 89 8480 octets-4 octets grâce à xnor (en utilisant des ensembles au lieu de listes)!
Essayez-le en ligne!
la source
y
un ensemble de raccourcir le chèque d'adhésion: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
astuce est vraiment intelligente :) Merci beaucoup!Husk ,
12 119 octetsEssayez-le en ligne!
Merci à BMO d' avoir proposé un port de réponse à ais523 et une sauvegarde de 2 octets, que j'ai réussi à améliorer davantage, et à mon tour, BMO a réduit de 2 octets de plus.
Solution précédente (14 octets)
Essayez-le en ligne!
Je n'ai pas pu créer de suite de tests car cette réponse utilise explicitement la première commande d'argument de ligne de commande. Mais Husk n'utilise pas du tout STDIN, j'ai donc inclus tous les cas de test là-bas, vous pouvez donc simplement copier-coller dans le champ d'argument pour le vérifier. Notez également que les tableaux dans Husk peuvent ne pas contenir d'espaces entre les éléments lors de leur entrée.
Comment ça marche?
Répartition du code
Exemple
Il faut choisir exactement un indice dans chacun de sorte qu'il n'y ait pas deux indices correspondant. Ainsi, nous générons les plages de longueur des lignes et ne gardons que celles sans doublons, ce qui donne les combinaisons suivantes (chaque combinaison est une colonne au lieu d'une ligne pour économiser de l'espace):
Ensuite, le programme indexe dans les listes d'entrée avec chaque élément de la combinaison, retournant:
la source
JavaScript (ES6),
7471 octetsMerci à @tsh d'avoir identifié 2 octets inutiles qui ont été utilisés pour corriger un bug.
Sauvegardé 3 octets grâce à @tsh
Essayez-le en ligne!
la source
0
partir du tableau d'entrée,-1+(-1)
c'est-2
et c'est la bonne réponse.f=([a,...r],k,i=1)=>a?Math.max(...a.map(c=>k&(i+=i)?-1/0:c+f(r,k|i))):0
C'est étrange, maisMath.max
économise des octets ...Gelée ,
1312 octetsEssayez-le en ligne!
Version alternative, 11 octets
Celui-ci utilise le module
œ!
intégré nouvellement ajouté , qui génère toutes les permutations d'une longueur donnée.Essayez-le en ligne!
Comment ça marche
la source
XLṗL
au lieu deJ€Œp
.Haskell , 65 octets
Essayez-le en ligne!
Explication et non golfé
La fonction
take i<>drop(i+1)
prend une liste et supprime l'élément en positioni
.La fonction
f
obtient chaque élément possiblee
en positioni
, supprime les éléments en positioni
des éléments restants et ajoutee
à l'optimum calculé récursivement:Et le cas de base pour la liste vide est juste
0
:la source
Brachylog , 18 octets
Essayez-le en ligne!
Explication
la source
Perl 6 ,
5049 octetsEssayez-le en ligne!
Décemment court, malgré le long
permutations
appel. Il s'agit d'un bloc de code anonyme qui prend une liste de listes et renvoie un nombre.Explication:
la source
K (oK) ,
40, 32, 28,19 octets-13 octets grâce à ngn!
Essayez-le en ligne!
Solution initiale:
Essayez-le en ligne!
Remarque: ne fonctionne pas pour le premier cas de test [[1]]
Explication:
{ }
- fonction avec argumentx
la source
prm
peut être appliqué directement à une liste pour générer ses permutations=
, mais le résultat était plus long. Y a-t-ilflatten
en OK?flatten
dans quel sens?(1 2 3; 4 5 6; 7 8 9) -> (1 2 3 4 5 6 7 8 9)
,/
ou si vous voulez qu'il aille dans des structures plus profondes:,//
Haskell , 65 octets
Essayez-le en ligne!
71 octets
Essayez-le en ligne!
Les
[x|x<-a,y<-a,x==y]==a
contrôles dont les élémentsa
sont distincts. Cela utilise un nombre surprenant de caractères, mais je n'ai pas vu un moyen plus court.la source
Pyth,
1512 octetsEssayez-le en ligne ici .
Edit: enregistré 3 octets avec l'aimable autorisation de issacg
la source
.PUlhQl
peut être remplacé par.plh
.V
ignore implicitement toutes les entrées supplémentaires.05AB1E ,
1813 octetsJ'ai l'impression que c'est trop long, mais je ne sais pas comment faire une indexation vectorisée de manière efficace dans 05AB1E ..Et j'avais en effet raison que c'était trop long .. -5 octets grâce à @Emigna .Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
Exemple d'exécution:
[[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]]
(REMARQUE: 05AB1E est indexé 0 (avec habillage automatique), donc l'indexation3
en[5,6,1]
résulte en5
.)O
):[5,9,8,7,7,2]
à
):9
la source
нgLœε‚øε
è] OZ` pour 13 .Haskell, 84 octets
Essayez-le en ligne!
la source
Rubis ,
747269 octetsEssayez-le en ligne!
la source
05AB1E , 7 octets
Réponse de Jelly CW du port de @ ais523 , alors assurez-vous de voter également!
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source