<p>通过阅读Rickey和Sathish的答案,我想出了一个解决方案。它返回了正确的日期</p>
<p>仍然需要完成代码以自动化任何情况</p>
<p>我不确定是否可以在这里发布<a href="https://github.com/andreluisos/direito/blob/master/progregime.py" rel="nofollow noreferrer">GitHub</a>。这是代码</p>
<pre><code>import datetime, math
from dateutil.relativedelta import relativedelta
# Método dias para anos, meses e dias.
def days_to_ymd(days):
global days_to_ymd_result
years = days // 365
months = (days % 365) // 30
days = (days % 365) % 30
days_to_ymd_result = relativedelta(years=+years, months=+months, days=+days)
return days_to_ymd_result
# Método anos, meses e dias para dias.
def ymd_to_days(years, months, days):
global ymd_to_days_result
ymd_to_days_result = (years * 365) + (months * 30) + days
return ymd_to_days_result
# Método frações de dias.
def frac(days, frac):
global frac_result
frac_result = math.ceil(days * frac)
return frac_result
# Data base.
data_base = datetime.date(day=12, month=11, year=2014)
print("Data base: " + data_base.strftime("%d/%m/%Y"))
# Informações sobre as penas.
pena1 = relativedelta(years=+7, months=+4, days=+0)
pena1_totaldays = ymd_to_days(years=pena1.years, months=pena1.months, days=pena1.days)
pena2 = relativedelta(years=+4, months=+10, days=+20)
pena2_totaldays = ymd_to_days(years=pena2.years, months=pena2.months, days=pena2.days)
pena_total = pena1 + pena2
pena_total_days = ymd_to_days(years=pena_total.years, months=pena_total.months, days=pena_total.days)
print("Pena 1: " + str(pena1.years) + "a, " + str(pena1.months) + "m, " + str(pena1.days) + "d (" + str(pena1_totaldays) + " dias).")
print("Pena 2: " + str(pena2.years) + "a, " + str(pena2.months) + "m, " + str(pena2.days) + "d (" + str(pena2_totaldays) + " dias).")
print("Pena total: " + str(pena_total.years) + "a, " + str(pena_total.months) + "m, " + str(pena_total.days) + "d (" + str(pena_total_days) + " dias).")
# Frações de pena.
pena1_frac = frac(days=pena1_totaldays, frac=2/5)
pena2_frac = frac(days=pena2_totaldays, frac=1/6)
frac_total_days = pena1_frac + pena2_frac - 72
frac_total = days_to_ymd(frac_total_days)
print("2/5 de " + str(pena1.years) + "a, " + str(pena1.months) + "m, " + str(pena1.days) + "d (" + str(pena1_totaldays) + " dias): " + str(days_to_ymd(pena1_frac).years) + "a, " + str(days_to_ymd(pena1_frac).months) + "m, " + str(days_to_ymd(pena1_frac).days) + "d (" + str(pena1_frac) + " dias).")
print("1/6 de " + str(pena2.years) + "a, " + str(pena2.months) + "m, " + str(pena2.days) + "d (" + str(pena2_totaldays) + " dias): " + str(days_to_ymd(pena2_frac).years) + "a, " + str(days_to_ymd(pena2_frac).months) + "m, " + str(days_to_ymd(pena2_frac).days) + "d (" + str(pena2_frac) + " dias).")
print("Total a ser cumprido: " + str(frac_total.years) + "a, " + str(frac_total.months) + "m, " + str(frac_total.days) + "d (" + str(frac_total_days) + " dias).")
# Semiaberto.
data_semiaberto = data_base + (relativedelta(years=+frac_total.years, months=+frac_total.months, days=+(frac_total.days - 1))) # -1 = Inclui o dia do começo (art. 10, CP).
print("Data prevista para o regime semiaberto: " + str(data_semiaberto.strftime("%d/%m/%Y")))
# Pena restante.
pena1_restante_days = pena1_totaldays - pena1_frac
pena2_restante_days = pena2_totaldays - pena2_frac
pena_restante_total_days = pena1_restante_days + pena2_restante_days
pena1_restante = days_to_ymd(pena1_restante_days)
pena2_restante = days_to_ymd(pena2_restante_days)
pena_restante = days_to_ymd(pena_restante_total_days)
print("Pena 1 restante: " + str(pena1_restante.years) + "a, " + str(pena1_restante.months) + "m, " + str(pena1_restante.days) + "d (" + str(pena1_restante_days) + " dias).")
print("Pena 2 restante: " + str(pena2_restante.years) + "a, " + str(pena2_restante.months) + "m, " + str(pena2_restante.days) + "d (" + str(pena2_restante_days) + " dias).")
print("Pena total restante: " + str(pena_restante.years) + "a, " + str(pena_restante.months) + "m, " + str(pena_restante.days) + "d (" + str(pena_restante_total_days) + " dias).")
# Frações da pena.
pena1_frac = frac(days=pena1_restante_days, frac=2/5)
pena2_frac = frac(days=pena2_restante_days, frac=1/6)
frac_total_days = (pena1_frac + pena2_frac)
frac_total = days_to_ymd(frac_total_days)
print("2/5 de " + str(pena1_restante.years) + "a, " + str(pena1_restante.months) + "m, " + str(pena1_restante.days) + "d (" + str(pena1_restante_days) + " dias): " + str(days_to_ymd(pena1_frac).years) + "a, " + str(days_to_ymd(pena1_frac).months) + "m, " + str(days_to_ymd(pena1_frac).days) + "d (" + str(pena1_frac) + " dias).")
print("1/6 de " + str(pena2_restante.years) + "a, " + str(pena2_restante.months) + "m, " + str(pena2_restante.days) + "d (" + str(pena2_restante_days) + " dias): " + str(days_to_ymd(pena2_frac).years) + "a, " + str(days_to_ymd(pena2_frac).months) + "m, " + str(days_to_ymd(pena2_frac).days) + "d (" + str(pena2_frac) + " dias).")
print("Total a ser cumprido: " + str(frac_total.years) + "a, " + str(frac_total.months) + "m, " + str(frac_total.days) + "d (" + str(frac_total_days) + " dias).")
# Aberto.
data_aberto = data_semiaberto + (relativedelta(years=+frac_total.years, months=+frac_total.months, days=+(frac_total.days - 1))) # -1 = Inclui o dia do começo (art. 10, CP).
print("Data prevista para o regime aberto: " + str(data_aberto.strftime("%d/%m/%Y")))
</code></pre>