python - strange tie

1

I'm almost finishing my application. In the final moments of the code I'm locking in a loop that I can not resolve.

# O programa pede para o usúario inserir uma data no formato dd/mm/aa,
# e efetua uma série de cálculos simples até chegar num número menor que 22
# e somente composto por unidades. Os cálculos são basicamente pegar o maior número,
# da data definida pelo usuário e somar seu algarismos, depois soma-se ao restante dos 
# números que compõe a data. Por exemplo: 
# data: 23/11/1956 => 23 + 11 + 21 = 55 ==>  5 + 11 +  21 = 37 ==> 5 + 11 + 3 = 19, 
# como 19 é uma dezena, fazemos 1 + 9 = 10  e novamente 1 + 0 = 1. Neste caso, os valores 
# retornados seriam: 19, 10, 01 e cada número é associado há uma sorte.  

#importa os módulos necessários

import datetime   

#declara variáveis globais

dataInput = ""
dataLi = []
somaAlg = 0

def validaData(dataInput):   #valida a data
    while True:
        try:
            dataInput = str(input("Insira sua data de nascimento no formato 'dd/mm/aaaa': "))
            date_formatted = datetime.datetime.strptime(dataInput, '%d/%m/%Y')
            break
        except ValueError:
            print("Error")
    dataLi = dataInput.split("/")  #transforma a string em uma lista, afim de efetuar os cálculos no futuro
    return dataLi                       

def calcula_arcano(revDataLi) : #função para somar o maior número da data, que nesta altura 
                                       # já é uma lista.

    somaAlg = 0
    adc = 0
    maior = max(revDataLi)

    while maior != 0 :
        adc =  maior % 10
        somaAlg = somaAlg + adc
        maior =  maior  // 10
    return somaAlg

def main():
    arcList = []
    dataLi = validaData(dataInput)
    revDataLi = list(reversed(dataLi))                      # coloca a lista em reverso 
    revDataLi = [int(data) for data in revDataLi]    


    total = sum(revDataLi)      # soma os numeros dá lista afim de checa-lo


# 22 é um número um tanto quanto ábitrário, tem a ver com "range" das sortes.
# este laço tem com objetivo "decompor" a lista até que o total seja 22 ou menos.

    while total >=22 :  
        somaAlg = calcula_arcano(revDataLi)
        revDataLi = [somaAlg if data == max(revDataLi) else data for data in revDataLi]
        total = sum(revDataLi)
    else:
        arcList.append(total)
        y = 0
        aux = total
        while total >= 10 and total < 22 :  #este laco tem como objetivo reduzir o total a unidades,
            aux=str(total)
            y = sum(int(i) for i in aux)
            total = y
        else:
            arcList.append(int(aux))  # para começar a compor a lista de retorno(arcList)
            arcList.append(total)
            print(arcList)
            print("O seu arcano pessoal é o ", arcList)  #final temporário, o desfecho do aplicativo
                                                               # vai ser associar os número encontrados com
                                                               # uma "sorte", conselho

main()

Things start to go wrong (I guess, because I use Atom to write and have not yet figured out how to debug effectively with Idle), in this loop here: while total >= 10 and total < 22 : on. I've been testing with 3 different dates:

  • 21/02/12 - > It works - > arcList: 8
  • 23/11/1956 - > It works - > arcList: 19, 10, 01
  • 31/12/2999 - > Does not Work - > arcList: 18, 18, 9 - should be - > 18, 9
  • What can be the problem? Taking advantage, if anyone has any tips on the code in general and more efficient ways of testing, I will be grateful.

        
    asked by anonymous 23.03.2018 / 16:45

    1 answer

    -1

    I created this function that strips the string bars to work with the date in string format containing only the numbers ("31/12/2999" -> "31122999"). Within the function there is a for which scans the string and sums each character of it. (3 + 1 + 1 + 2 + 2 + 9 + 9 + 9). If the value is less than or equal to 22, it returns the number found. If it does not, it transforms the number found in string ("35"), zeroes the variable that would be returned, and logs in again.

    def numero_arcano(data):
        cond = True
        data_string = data.replace("/", "") 
        arcano = 0
        while cond == True:
            for number in data_string:
                arcano += int(number)
            if(arcano <= 22):
                cond = False
            else:
                data_string = str(arcano)
                arcano = 0
        return arcano
    
        
    23.04.2018 / 23:05