1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| #!/usr/bin/env python3
# coding: utf-8
class cRelique:
__carac=("sante", "degat", "armure", "perforation", "critique")
def __init__(self, name="", sante=0, degat=0, armure=0, perforation=0, critique=0):
self.__values={
"name" : name,
}
self.__values.update(
zip(
cRelique.__carac,
(sante, degat, armure, perforation, critique),
)
)
# __init__()
# Pour pouvoir utiliser l'objet comme un dictionnaire
__getitem__=lambda self, k: self.__values[k]
# La liste des combinaisons d'objets
@staticmethod
def comb(n, reliques):
# Fonction récursive de génération
def generate_r(n, lst):
if n == 0: return ((),)
return (
(x,) + suffix
for (i, x) in enumerate(lst)
for suffix in generate_r(n-1, lst[i+1:])
)
# generate_r()
# Génération des reliques
return tuple(generate_r(n, reliques))
# comb()
# Les totaux des valeurs des combinaisons
@staticmethod
def totaux(reliques, comb, base=None):
tot={}
for c in comb:
tot[c]={}
for k in cRelique.__carac:
tot[c][k]=sum(x[k] for x in reliques if x in c)
if base: tot[c][k]+=base[k]
# for
return tot
# totaux()
# La même mais en plus fun
totaux2=staticmethod(
lambda reliques, comb, base=None: {
c : {
k : sum(x[k] for x in reliques if x in c) + base[k] if base else 0
for k in cRelique.__carac
} for c in comb
}
)
# Le tri des totaux
@staticmethod
def sort(tableau, k, reverse=False):
return sorted(tableau, key=lambda x:x[1][k], reverse=reverse)
# La même mais en utilisant une lambda
sort2=staticmethod(
lambda tableau, k, reverse=False: sorted(tableau, key=lambda x:x[1][k], reverse=reverse)
)
# class cRelique
Relique=(
cRelique("Relique1", 5, 6, 2, 7, 2),
cRelique("Relique2", 10, 9, 3, 1, 4),
cRelique("Relique3", 7, 17, 4, 6, 6),
cRelique("Relique4", 2, 12, 5, 8, 1),
)
Base=cRelique()
# Calcul des combinaisons possibes
combinaisons=cRelique.comb(2, Relique)
print("comb: ", tuple(tuple(r["name"] for r in c) for c in combinaisons))
# Les totaux des valeurs des combinaisons
totaux=cRelique.totaux(Relique, combinaisons, Base)
print("totaux")
for (k, v) in totaux.items():
print(tuple(x["name"] for x in k), v)
# Le tri des totaux
tri=cRelique.sort(totaux.items(), "armure", reverse=True)
print("tri")
for t in tri:
print(tuple(x["name"] for x in t[0]), t[1]) |
Partager