python - strange loop

Asked

Viewed 98 times

1

I’m almost done with my application. In the final moments of the code I’m locking into a loop that I can’t 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 are starting to go wrong(I think, because I use Atom to write and I still haven’t figured out how to debug efficiently right with Idle), in this loop here: while total >= 10 and total < 22 : onwards. I have been testing with 3 different dates:

  1. 21/02/12 -> Works -> arcList: 8
  2. 23/11/1956 -> Works -> arcList: 19, 10, 01
  3. 31/12/2999 -> Doesn’t Work -> arcList: 18, 18, 9 - should be -> 18, 9

What could this problem be? Taking advantage, if anyone has any hints about the code in general and more efficient ways to test, I would be grateful.

  • Where do these dates come from?

  • It would be interesting to describe what the code should do in general. For example, what is the sense of summing the components of a date (sum(revDataLi))?

  • Marylsson, the ones from the test? I tried to choose particular cases, no big deal. @Anderson edited the code by adding comments

1 answer

-1

I created this function that removes the bars from the string to work with the date in string format that contains only the numbers ("31/12/2999" -> "31122999"). Inside the function is a for that 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 not, it turns the number found into string ("35"), Zera the variable that would be returned and enters the for 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
  • 2

    Don’t just put code in the answer. Explain what your code does and how it solves the question problem, so that both the questioner and future readers can follow your reasoning

  • Thanks for the suggestion.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.