Introduction:
Inspiré de ces deux questions SO (sans doute de la même classe): imprimer les éléments dans le sous-tableau de la somme maximale sans éléments adjacents java et de la somme maximale des éléments non adjacents d'un tableau, à imprimer .
Défi:
Étant donné une liste d'entiers, sortez une sous-séquence composée d'éléments non adjacents qui ont la somme la plus élevée. Voici quelques exemples:
[1,2,3,-1,-3,2,5]
entraînerait[1,3,5]
(avec une somme de9
) aux indices de base 0[0,2,6]
.[4,5,4,3]
entraînerait soit[4,4]
(avec une somme de8
) aux indices de base 0[0,2]
ou[5,3]
(également avec une somme de8
) aux indices de base 0[1,3]
.[5,5,10,100,10,5]
se traduirait par[5,100,5]
(avec une somme de110
) aux indices basés sur 0[0,3,5]
ou[1,3,5]
.
Ce qui est le plus important dans ces exemples ci-dessus, les indices contenant les éléments sont au moins 2 séparés les uns des autres. Si nous regardons l'exemple [5,5,10,100,10,5]
plus en profondeur: nous avons la sous-séquence potentielle suivante contenant des éléments non adjacents; avec leurs indices en dessous; avec leurs sommes en dessous:
[[5],[10],[100],[10],[5],[5],[100,5],[10,5],[10,10],[5,5],[5,10],[5,100],[5,5],[5,10],[5,100],[5,10],[5,100,5],[5,100,5],[5,10,5],[5,10,10]] // non-adjacent subsequences
[[5],[ 4],[ 3],[ 2],[1],[0],[ 3,5],[ 2,5],[ 2, 4],[1,5],[1, 4],[1, 3],[0,5],[0, 4],[0, 3],[0, 2],[1, 3,5],[0, 3,5],[0, 2,5],[0, 2, 4]] // at these 0-based indices
[ 5, 10, 100, 10, 5, 5, 105, 15, 20, 10, 15, 105, 10, 15, 105, 15, 110, 110, 20, 25] // with these sums
^ ^ // and these two maximums
Puisque les sommes maximales sont 110
, nous sortons [5,100,5]
comme résultat.
Règles du défi:
- Vous êtes autorisé à générer des paires clé-valeur de la valeur index +. Ainsi, au lieu de
[5,100,5]
vous, vous pouvez générer[[0,5],[3,100],[5,5]]
ou[[1,5],[3,100],[5,5]]
comme résultat (ou[[1,5],[4,100],[6,5]]
/[[2,5],[4,100],[6,5]]
lorsque l'indexation basée sur 1 est utilisée au lieu de basée sur 0).- Si vous utilisez des paires clé-valeur, elles peuvent également être dans un ordre inverse ou aléatoire, car il est clair quelles valeurs sont signifiées en raison de l'index apparié.
- La sortie uniquement des index sans valeurs n'est pas autorisée. Il doit soit afficher les valeurs, soit les valeurs / indices sous forme de paires clé-valeur (ou deux listes séparées pour les `` clés '' et les `` valeurs '' de la même taille si les paires clé-valeur ne sont pas possibles dans la langue de votre choix).
- Vous êtes autorisé à sortir toutes les sous-séquences possibles avec la somme maximale au lieu d'une seule.
- Comme vous pouvez le voir dans les exemples, la liste d'entrée peut également contenir des valeurs négatives et dupliquées. Vous pouvez supposer que les entiers d'entrée sont dans la plage .
- La liste de sortie ne peut pas être vide et doit toujours contenir au moins un élément (si une liste ne contiendrait que des valeurs négatives, une liste contenant la valeur négative la plus basse unique serait alors sortie en résultat - voir les deux derniers cas de test).
- S'il existe une sortie possible mais pour plusieurs indices différents, il est autorisé de les sortir tous les deux, même s'ils peuvent sembler en double. (c.-à-d. l'exemple ci-dessus, peut sortir
[[5,100,5],[5,100,5]]
pour les deux combinaisons d'index possibles).
Cas de test:
Input: Possible outputs: At 0-based indices: With sum:
[1,2,3,-1,-3,2,5] [1,3,5] [0,2,6] 9
[4,5,4,3] [4,4]/[5,3] [0,2]/[1,3] 8
[5,5,10,100,10,5] [5,100,5] [0,3,5]/[1,3,5] 110
[10] [10] [0] 10
[1,1,1] [1,1] [0,2] 2
[-3,7,4,-2,4] [7,4] [1,4] 11
[1,7,4,-2] [7] [1] 7
[1,2,-3,-4,5,6,-7] [2,6] [1,5] 8
[800,-31,0,0,421,726] [800,726]/[800,0,726] [0,5]/[0,3,5]/[0,2,5] 1526
[-1,7,8,-5,40,40] [8,40] [2,4]/[2,5] 48
[-5,-18,-3,-1,-10] [-1] [3] -1
[0,-3,-41,0,-99,-2,0] [0]/[0,0]/[0,0,0] [0]/[3]/[6]/[0,3]/
[0,6],[3,6]/[0,3,6] 0
la source
[5,100,5]
deux fois pour votre troisième exemple.powerset
est un ensemble de sous-ensembles n'est-ce pas? mais il semble que vous retourniez un ensemble de sous-séquences? [4,5,4,3] entraînerait soit [4,4] où [4,4] n'est clairement pas un ensemble.Réponses:
Husk , 11 octets
Essayez-le en ligne!
Explication
la source
Haskell , 60 octets
Essayez-le en ligne!
La fonction d'assistance se
%
ramifie récursivement en choisissant si le premier élément doit être inclus et le deuxième supprimé, ou si le premier élément est ignoré. Il prend le maximum de tous les résultats, qui sont des tuples dont le premier élément est la somme, et dont le deuxième élément est la liste correspondante qui est extraite pour la sortie.Pour gérer la règle selon laquelle la liste vide est interdite même si elle aurait la plus petite astuce, nous faisons une astuce d'écriture
sum r<$r
plutôt quesum r
. Cela crée une liste dont tous les éléments sontsum r
et dont la longueur est celle der
. De cette façon, lorsque nous choisissons le maximum, nous priorisons n'importe quelle liste sur une liste vider
, mais sinon les comparaisons dépendent du premier élément qui estsum r
.la source
R ,
136125 octetsEssayez-le en ligne!
-6 octets grâce à digEmAll , qui d'ailleurs m'a également surpassé .
Renvoie la sous-séquence la plus courte sous la forme d'un
list
, rompant les liens lexicographiquement en premier par les indices.La force brute génère toutes les sous-séquences d'index, puis
Filter
s pour celles qui ne sont pas adjacentes, c'est-à-dire oùall(diff(x)>1)
. Sous-ensembles ensuite[
enl
utilisant ces indices, en sélectionnant[[
le premier où la somme est le max (which.max
).Je suis presque sûr que c'est la première réponse R que j'aie jamais écrite qui utilisetriste,Filter
!Filter
n'est pas golfique, pas étonnant que je ne l'ai jamais utilisé ...la source
05AB1E , 14 octets
1 octet enregistré grâce à Kevin Cruijssen
Essayez-le en ligne! ou comme suite de tests
Explication
la source
¤ª
enĆ
.Brachylog (v2), 14 octets
Essayez-le en ligne!
Soumission de fonction; entrée par la gauche, sortie par la droite, comme d'habitude. Très lent; une liste de cinq éléments est probablement le maximum pour les tests sur TIO.
Les résultats que nous obtenons des préfixes ne sont pas incorrects, mais ne sont pas non plus intéressants; tous les résultats possibles sont générés en prenant un suffixe (qui est peut-être la liste elle-même, mais ne peut pas être vide), mais "suffixe" est plus verbeux dans Brachylog que "préfixe ou suffixe", donc je suis allé avec la version qui est terser (et moins efficace mais toujours correct). L'idée de base est que pour chaque élément que nous voulons dans la liste de sortie, la partition en sous-listes contiguës doit placer cet élément et l'élément avant dans la même sous-liste (car l'élément est le deuxièmeélément de la sous-liste), donc deux éléments consécutifs ne peuvent pas apparaître dans le résultat. En revanche, il est assez clair que toute liste sans deux éléments consécutifs peut apparaître dans le résultat. Donc, une fois que nous avons toutes les listes de candidats possibles, nous pouvons simplement prendre la somme de toutes et voir laquelle est la plus grande.
la source
Gelée ,
1614 octetsEssayez-le en ligne!
Merci à @EriktheOutgolfer pour avoir économisé 2 octets!
la source
JavaScript (ES6),
138 132 130 130 129126 octetsGénère des paires clé-valeur.
Essayez-le en ligne!
Étape 1
Étape 2
la source
Haskell,
8180 octetsEssayez-le en ligne!
f
construit toutes les sous-séquences valides soit en sautant l'élément suivant (f(b:c)
), soit en l'utilisant et en sautant le suivant (map(a:)(f c)
) et en travaillant récursivement sur le reste. Pour le résultat, créez toutes les sous-séquences (f
), supprimez la sous-séquence vide (qui apparaît en premier dans la liste:)tail
, créez des paires(<sum>,<subsequence>)
(map((,)=<<sum)
), trouvez le maximum (les paires sont comparées dans l'ordre lexicographique) ->maximum
) et supprimez la somme (snd
).Edit: -1 octet grâce à @Lynn.
la source
map(:[])a
est un octet plus court que(pure<$>a)
^^J , 47 octets
Essayez-le en ligne!
-7 octets grâce à FrownyFrog
original
J , 54 octets
Essayez-le en ligne!
la source
T-SQL,
122119118 octetsL'entrée est une variable de table.
Cette requête sélectionne tous les éléments de la variable de table, en les combinant avec tous les éléments non adjacents avec des valeurs de position plus élevées et affiche le texte généré pour la somme la plus élevée de ces valeurs.
Essayez-le en ligne sans golf
la source
Wolfram Language (Mathematica) , 144 octets
Essayez-le en ligne!
la source
Pyth, 19 octets
Essayez-le en ligne ici ou vérifiez tous les cas de test en même temps ici .
la source
Gaia , 24 octets
Essayez-le en ligne!
Ugh,
E‡
fait des trucs bizarres ... selon la documentation, il devrait faire quelque chose comme "uni
ensemble de longueur donné de listesX
et unj
ensemble d'indices de longueurY
, returnX[i][Y[j]]
", mais renvoie à la place[X[i][Y[j]] X[i][Y[-j]]
où l'indexation négative représente le complément, donc nous devons faireev2%
pour extraire uniquement ceux que nous voulons.la source
]]
au lieu d'un?[[1] [2]]
sont imprimées,[[1]] [2]]]]
ce qui rend la lecture / débogage de la sortie de liste très difficile.re.sub(" ?$","]",result)
dans l'interpréteur qui devrait plutôt l'êtrere.sub(" +$","]",result)
mais mon python est super mauvais.R ,
108107 octetsEssayez-le en ligne!
-1 grâce à @Giuseppe
la source
Wolfram Language (Mathematica) ,
7063 octetsEssayez-le en ligne!
Recherche de haut niveau
,1
est requis pour ne pas renvoyer par inadvertance des ensembles invalides (sinon, par exemple, une entrée de{1,1,1}
entraînerait une sortie de{{1,1},{1,1},{1,1}}
)la source
Haskell ,
300168 octetsEssayez-le en ligne!
-132 octets grâce à tous les retours de @nimi :)
Original
Non golfé (original)
la source
f
:f x=zip[0..length x]x
, doncf
devientf=zip[0..]
.g
est justeg=map unzip
. La fonction à filtrer avec inj
esth.fst
(<- paires inversées!).j=filter(h.fst)
. Lefoldl1+
fromk
estsum
et avec une paire sans pointk=map((,)=<<sum.snd)
.sortBy(...)
peut être remplacé parsortOn fst
:l=snd.last.sortOn fst
. Enfin, comme vous n'utilisez toutes les fonctions qu'une seule fois, vous pouvez les intégrer en une seule expression sans point:z=snd.last.sortOn fst.map((,)=<<sum.snd).filter(h.fst).map unzip.subsequences.zip[0..]
Data.Function
.h
: nous recherchons des éléments non adjacents, c'est-à-dire que la différence des indices adjacents doit être>1
.zipWith(-)=<<tail
construit une telle liste de différences, mais échoue pour la liste vide, nous avons donc besoin d'un supplémenttail
sur lesubsequences
pour s'en débarrasser. À nouveau en ligne. Essayez-le en ligne!Fusain , 46 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
La variable
u
est prédéfinie avec une liste vide. Ceci est mis dans une liste qui est affectée àh
. Ces variables agissent comme des accumulateurs.u
contient les sous-listes qui incluent le dernier élément de l'entréeq
tandis queh
contient les sous-listes qui ne le font pas (et sont donc adaptées pour ajouter l'élément suivant de l'entrée).Faites une boucle sur les éléments de l'entrée.
Enregistrez la liste des sous-listes qui contiennent l'élément précédent.
Prenez toutes les sous-listes qui ne contiennent pas l'élément précédent, ajoutez l'élément actuel et enregistrez le résultat en tant que liste de sous-listes qui contiennent l'élément actuel. (Je ne l'utilise pas
Push
ici car j'ai besoin de cloner la liste.)Concatène les deux sous-listes précédentes dans la nouvelle liste de sous-listes qui ne contiennent pas l'élément actuel.
Concaténez les sous-listes une dernière fois et supprimez la liste vide d'origine (que Charcoal ne peut pas additionner de toute façon).
Calculez les sommes de toutes les sous-listes.
Trouvez un indice de la plus grande somme et sortez la sous-liste correspondante.
la source
Japt
-h
, 22 octetsEssayez-le
la source
Japt
-h
, 21 octetsAvez-vous déjà eu un de ces défis où vous oubliez complètement comment jouer au golf?!
Essayez-le
la source
Python 2 ,
637065 octetsEssayez-le en ligne!
5 octets de thx à ArBo
la source
[1, 7, 4, -2] [1, 4] 5 7
obtient la mauvaise réponse.