l = [3,1,9,2,1,0,3,7,4,6]
t = 0
while t!=(t:=''.join(map(str,l)).strip('0').count('0')+t):
l=[x and x-1 for x in l]
print(t)
plus soft
l = [3,1,9,2,1,0,3,7,4,6]
tot = 0
while len(l)>=3:
while len(l)>=2 and l[0]<=l[1] : l.pop(0)
while len(l)>=2 and l[-1]<=l[-2]: l.pop()
tot += l.count(0)
l = [x and x-1 for x in l]
print(tot)
EDIT : aucun des deux ne fonctionne, par ex avec [10, 0, 10]
- Edité par thelinekioubeur il y a 14 minutes
effectivement j'ai oublié ces cas là:
l = [10,0,10]
tot = 0
while True:
while len(l)>=2 and l[0]<=l[1] : l.pop(0)
while len(l)>=2 and l[-1]<=l[-2]: l.pop()
if len(l)<3: break
tot += l.count(0)
l = [x and x-1 for x in l]
print(tot)
# 10
l = [10,0,10]
t = 0
while t!=(t:=''.join(x>0 and'.'or' 'for x in l).strip().count(' ')+t):
l=[x-1 for x in l]
print(t)
# Hauteurs des murs
hm = [3, 1, 9, 2, 1, 0, 3, 7, 4, 6]
# Détermination des bornes d'intervalle(s)
indice_intervalle = []
for i in range(0, len(hm)):
if i == 0 or i == (len(hm)-1):
indice_intervalle.append(i)
elif hm[i-1] < hm[i] > hm[i+1]:
indice_intervalle.append(i)
# Calcul du volume d'eau
vol = 0
for i in range(len(indice_intervalle) - 1):
intervalle = [hm[_] for _ in range(indice_intervalle[i], indice_intervalle[i + 1] + 1)]
lim_sup = min(intervalle[0], intervalle[len(intervalle) - 1])
for j in range(1, len(intervalle) - 1):
vol += lim_sup - intervalle[j]
# Synthèse
print(f"Les hauteurs de mur sont : {' | '.join(str(h) for h in hm)}")
print(f"Le volume d'eau pouvant être contenu entre ces murs est de {vol}.")
# Hauteurs des murs
hm = [3, 1, 9, 2, 1, 0, 3, 7, 4, 6]
# Détermination des bornes d'intervalle(s)
indice_intervalle = []
for i in range(0, len(hm)):
if i == 0 or i == (len(hm)-1):
indice_intervalle.append(i)
elif hm[i-1] < hm[i] > hm[i+1]:
indice_intervalle.append(i)
# Calcul du volume d'eau
vol = 0
for i in range(len(indice_intervalle) - 1):
intervalle = [hm[_] for _ in range(indice_intervalle[i], indice_intervalle[i + 1] + 1)]
lim_sup = min(intervalle[0], intervalle[len(intervalle) - 1])
for j in range(1, len(intervalle) - 1):
vol += lim_sup - intervalle[j]
# Synthèse
print(f"Les hauteurs de mur sont : {' | '.join(str(h) for h in hm)}")
print(f"Le volume d'eau pouvant être contenu entre ces murs est de {vol}.")
- Edité par PB68 4 octobre 2021 à 17:46:06
Pour la liste hm=[5, 0, 8, 7, 5], ton code donne 3 alors qu'il me semble que la réponse est 5.
# Hauteurs des murs
hm = [3, 1, 9, 2, 1, 0, 3, 7, 4, 6]
# Détermination des bornes d'intervalle(s)
indice_intervalle = []
for i in range(0, len(hm)):
if i == 0 or i == (len(hm)-1):
indice_intervalle.append(i)
elif hm[i-1] < hm[i] > hm[i+1]:
indice_intervalle.append(i)
# Calcul du volume d'eau
vol = 0
for i in range(len(indice_intervalle) - 1):
intervalle = [hm[_] for _ in range(indice_intervalle[i], indice_intervalle[i + 1] + 1)]
lim_sup = min(intervalle[0], intervalle[len(intervalle) - 1])
for j in range(1, len(intervalle) - 1):
vol += lim_sup - intervalle[j]
# Synthèse
print(f"Les hauteurs de mur sont : {' | '.join(str(h) for h in hm)}")
print(f"Le volume d'eau pouvant être contenu entre ces murs est de {vol}.")
- Edité par PB68 4 octobre 2021 à 17:46:06
Pour la liste hm=[5, 0, 8, 7, 5], ton code donne 3 alors qu'il me semble que la réponse est 5.
Ah ben oui, normal. J'ai pas fait de test par rapport aux valeurs d'extremité de la liste. C'est résolu.
# Hauteurs des murs
hm = [3, 1, 9, 2, 1, 0, 3, 7, 4, 6]
# Détermination des bornes d'intervalle(s)
indice_intervalle = []
for i in range(0, len(hm)):
if i == 0 or i == (len(hm)-1):
indice_intervalle.append(i)
elif hm[i-1] < hm[i] > hm[i+1]:
indice_intervalle.append(i)
# Calcul du volume d'eau
vol = 0
for i in range(len(indice_intervalle) - 1):
intervalle = [hm[_] for _ in range(indice_intervalle[i], indice_intervalle[i + 1] + 1)]
lim_sup = min(intervalle[0], intervalle[len(intervalle) - 1])
for j in range(1, len(intervalle) - 1):
if (lim_sup - intervalle[j]) >= 0:
vol += lim_sup - intervalle[j]
# Synthèse
print(f"Les hauteurs de mur sont : {' | '.join(str(h) for h in hm)}")
print(f"Le volume d'eau pouvant être contenu entre ces murs est de {vol}.")
J'ai compris la mécanique du code permettant d'arriver au résultat mais est-ce que quelqu'un aurait un lien qui explique la syntaxe de :
" ." [bool(x)] for x in l # Dans la ligne t += ......
En vous remerciant d'avance.
Pas besoin de lien spécifique pour ça, c'est juste que " ." est une chaîne de deux caractères et que bool(x) qui vaut False ou True s'évalue en un int 0 ou 1 (bool est une classe qui dérive de int) donc en un entier de range(2) et 2 est la longueur de la chaîne. Il était possible d'utiliser une expression conditionnelle pour cela.
Sinon, tu avais vu mon objection à ton code ?
EDIT. Peut-être que c'est la chaîne littérale qui te gêne. Le code équivaut à :
s=" ."
i=bool(x)
s[i]
- Edité par PascalOrtiz 15 octobre 2021 à 16:14:34
J'ai compris la mécanique du code permettant d'arriver au résultat mais est-ce que quelqu'un aurait un lien qui explique la syntaxe de :
" ." [bool(x)] for x in l # Dans la ligne t += ......
En vous remerciant d'avance.
Pas besoin de lien spécifique pour ça, c'est juste que " ." est une chaîne de deux caractères et que bool(x) qui vaut False ou True s'évalue en un int 0 ou 1 (bool est une classe qui dérive de int) donc en un entier de range(2) et 2 est la longueur de la chaîne. Il était possible d'utiliser une expression conditionnelle pour cela.
Sinon, tu avais vu mon objection à ton code ?
EDIT. Peut-être que c'est la chaîne littérale qui te gêne. Le code équivaut à :
s=" ."
i=bool(x)
s[i]
- Edité par PascalOrtiz il y a 6 minutes
Ah oui, ok, je viens de comprendre. En fait, c'est le même principe que pour un tuple ou une liste sauf qu'ici c'est appliqué à une chaîne de caractère. Donc, on prend le 1er caractère si x = 0 et le 2ème lorsque x est différent de 0.
Oui, j'avais vu ta remarque par rapport à la liste que tu proposais.
Alors j'ai continué dans mon idée d'analyse de la variation des hauteurs de murs en recherchant les points hauts et bas, suppression des maxis adjacents et une analyse plus particulière pour les extrémités. Je pense être arrivé à un fonctionnement correct après m'être fait un bon paquet d'essais.
Pour la curiosité, j'en suis arrivé à l'usine à gaz ci-dessous (j'ai pas cherché à simplifier, y'a sans doute l'une ou l'autre partie avec laquelle il doit être possible de faire une fonction spécifique) :
# Configuration de murs
hm = [3, 1, 9, 2, 1, 0, 3, 7, 4, 6]
hm_initiales = hm.copy()
# Suppression de maxis adjacents éventuels
idx_max_hm = [idx for idx in range(len(hm)) if hm[idx] == max(hm)]
if len(idx_max_hm) >= 2:
for i in range(len(idx_max_hm) - 1):
if idx_max_hm[i + 1] - idx_max_hm[i] == 1:
hm.remove(hm[idx_max_hm[i]])
# Détermination des bornes d'intervalle(s) / Recherche de "pointe" haute ou basse
indice_intervalle = []
if len(hm) > 3:
for i in range(1, len(hm) - 1):
if hm[i - 1] < hm[i] > hm[i + 1]:
indice_intervalle.append((i, "haut"))
elif hm[i - 1] > hm[i] < hm[i + 1]:
indice_intervalle.append((i, "bas"))
elif len(hm) == 3:
for i in range(1, len(hm) - 1):
if hm[i - 1] > hm[i] < hm[i + 1]:
indice_intervalle.append((i, "bas"))
# Détermination des bornes d'intervalle(s) / Traitement des intervalles d'extrémité / Extrémité gauche
intervalle = hm[0:indice_intervalle[0][0] + 1]
if indice_intervalle[0][1] == "haut" and indice_intervalle[0][0] >= 2:
test = False
for i in range(1, len(intervalle) - 1):
if intervalle[i] < intervalle[0] and intervalle[i] < intervalle[len(intervalle) - 1]:
test = True
else:
test = False
if test == True:
indice_intervalle.insert(0, (0, "haut"))
elif indice_intervalle[0][1] == "bas":
if len(intervalle) <= 2:
indice_intervalle.insert(0, (0, "haut"))
else:
test = False
for i in range(1, len(intervalle) - 1):
if intervalle[i] < intervalle[0] and intervalle[i] > intervalle[len(intervalle) - 1]:
test = True
else:
test = False
if test == True:
indice_intervalle.insert(0, (0, "haut"))
# Détermination des bornes d'intervalle(s) / Traitement des intervalles d'extrémité / Extrémité droite
intervalle = hm[indice_intervalle[len(indice_intervalle) - 1][0]:len(hm)]
if indice_intervalle[len(indice_intervalle) - 1][1] == "haut" and indice_intervalle[len(indice_intervalle) - 1][0] < (len(hm) - 2):
test = False
for i in range(1, len(intervalle) - 1):
if intervalle[i] < intervalle[0] and intervalle[i] < intervalle[len(intervalle) - 1]:
test=True
else:
test=False
if test == True:
indice_intervalle.insert(len(indice_intervalle), (len(hm) - 1, "haut"))
elif indice_intervalle[len(indice_intervalle) - 1][1] == "bas":
if len(intervalle) <= 2:
indice_intervalle.insert(len(indice_intervalle), (len(hm) - 1, "haut"))
else:
test = False
for i in range(1, len(intervalle) - 1):
if intervalle[i] > intervalle[0] and intervalle[i] < intervalle[len(intervalle) - 1]:
test = True
else:
test = False
if test == True:
indice_intervalle.insert(len(indice_intervalle), (len(hm) - 1, "haut"))
# Optimisation des intervalles
zones = []
i = 0
while i < len(indice_intervalle) - 1:
n = 1
if indice_intervalle[i][1] == "haut":
while indice_intervalle[i + n][1] != "haut":
n += 1
zones.append([indice_intervalle[i][0], indice_intervalle[i + n][0]])
i = i + n
for zone in zones:
for i in [zone[0] + 1, zone[1] - 1]:
if hm[i] < max(hm[zone[0]], hm[zone[1]]) and hm[i] > min(hm[zone[0]], hm[zone[1]]):
max_zone = hm[i]
if zone[0] < zone[1]:
zone[1] = i
else:
zone[0] = i
# Calcul du volume d'eau
vol = 0
for zone in zones:
lim_sup = min(hm[zone[0]], hm[zone[1]])
for i in range(zone[0] + 1, zone[1]):
vol += lim_sup - hm[i]
# Synthèse
print(f"Avec les hauteurs de mur ({', '.join(str(h) for h in hm_initiales)}), le volume d'eau pouvant être contenu est de {vol}.")
C'est bizarre, j'ai testé le 1er algo du site trapping water rain, et ça n'est pas mieux, ou alors je ne suis pas bien réveillé :-)
# -*- coding:Utf-8 -*-
import copy
walls = [2,5,6,1,9,8,2,2,5,5,2,3,6]
volume = 0
config_i, config = 0, {}
c = copy.copy(walls)
for k in range(max(walls)):
config[config_i] = ' '
if(c[0] > 0): config[config_i] = 'o '
for j in range(1, len(c)):
if(c[j] > 0):
config[config_i] += 'o '
else:
config[config_i] += ' '
c[j] -= 1
c[0] -= 1
config_i += 1
print('Configuration des murs :')
for k in range(config_i-1,-1,-1): print(' ',config[k])
# algo initial : valeur pas toujours bonne
#while any(walls):
# volume += ''.join(x and'.'or' 'for x in walls).strip().count(' ')
# walls = [x and x-1 for x in walls]
#algo du site trapping water rain
#
#ans=0
#
#Iterate the array from left to right:
# left_max=0
# right_max=0
# Iterate from the current element to the beginning of array updating:
# left_max=max(left_max,height[j])
# Iterate from the current element to the end of array updating:
# right_max=max(right_max,height[j])
# ans += min(left_max,right_max)-height[i]
for i in range(len(walls)):
left_max, right_max = 0,0
for j in range(i, -1,-1):
left_max = max(left_max, walls[j])
for j in range(i, len(walls)):
right_max = max(right_max,walls[j])
volume += min(left_max,right_max)-walls[i]
print('\nVolume possible :',volume)
Avec 5 comme dernière valeur, ça donne bien 16, mais avec 6, ca donne 22 !
C'est bizarre, j'ai testé le 1er algo du site trapping water rain, et ça n'est pas mieux, ou alors je ne suis pas bien réveillé :-)
# -*- coding:Utf-8 -*-
import copy
walls = [2,5,6,1,9,8,2,2,5,5,2,3,6]
volume = 0
config_i, config = 0, {}
c = copy.copy(walls)
for k in range(max(walls)):
config[config_i] = ' '
if(c[0] > 0): config[config_i] = 'o '
for j in range(1, len(c)):
if(c[j] > 0):
config[config_i] += 'o '
else:
config[config_i] += ' '
c[j] -= 1
c[0] -= 1
config_i += 1
print('Configuration des murs :')
for k in range(config_i-1,-1,-1): print(' ',config[k])
# algo initial : valeur pas toujours bonne
#while any(walls):
# volume += ''.join(x and'.'or' 'for x in walls).strip().count(' ')
# walls = [x and x-1 for x in walls]
#algo du site trapping water rain
#
#ans=0
#
#Iterate the array from left to right:
# left_max=0
# right_max=0
# Iterate from the current element to the beginning of array updating:
# left_max=max(left_max,height[j])
# Iterate from the current element to the end of array updating:
# right_max=max(right_max,height[j])
# ans += min(left_max,right_max)-height[i]
for i in range(len(walls)):
left_max, right_max = 0,0
for j in range(i, -1,-1):
left_max = max(left_max, walls[j])
for j in range(i, len(walls)):
right_max = max(right_max,walls[j])
volume += min(left_max,right_max)-walls[i]
print('\nVolume possible :',volume)
Avec 5 comme dernière valeur, ça donne bien 16, mais avec 6, ca donne 22 !
C'est juste, il y a 6 murs qui seront chacun recouvert d'une case d'eau donc 16+6=22.
C'est bien ce que je disais: je ne suis pas bien réveillé !!!! :-) :-)
certaines fois, on fait des trucs pointus, et d'autres, on ne voit pas le nez au milieu de la figure ...
merci pb68 !
- Edité par Phil_1857 19 octobre 2021 à 17:34:24
Exercice python réservoir
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Python c'est bon, mangez-en.
Le Tout est souvent plus grand que la somme de ses parties.
Python c'est bon, mangez-en.
Python c'est bon, mangez-en.
Python c'est bon, mangez-en.
Python c'est bon, mangez-en.
PB68
Découverte Python Doc Tkinter Les chaînes de caractères
PB68
Découverte Python Doc Tkinter Les chaînes de caractères
PB68
Découverte Python Doc Tkinter Les chaînes de caractères
PB68
Découverte Python Doc Tkinter Les chaînes de caractères
PB68
PB68
PB68