2
The final part for data arithmetic compression is to find a number, which is among other 2 numbers, and which has the smallest number/decimal places!
Example: Number between 0.1234 and 0.1245. The answer is 0.124 Because it’s between the two numbers, and it has as few digits as possible.
Note: Open interval at both ends, that is, neither 0.1234 nor 0.1245 can be the answer.
Can anyone think of an efficient solution to this problem?
I tried to make a "hardcode" of life, however, there are many cases, and surely there is a more intelligent (and mathematical) way to perform such a procedure.
def getNumberLessDigits(menor,maior):
"""
Função retorna o menor valor com menos dígitos entre os dois números passados como parâmetro.
:param menor:
:param maior:
:return: smallest integer with minimum of digits between the two numbers.
"""
if menor > maior:
menor,maior = maior,menor
menor,maior = list(str(menor)),list(str(maior)) # Vamos trabalhar lista de chars (Não pode ser "str" porque iremos dar append...)
dif = abs(len(menor) - len(maior)) # Caso os dois números possuam tamanhos diferentes
menor = ['0' for _ in range(dif)] + menor # Completando com '0s', se necessário, no início do número
resultado = []
for i in range(len(menor)):
# Enquanto os dígitos forem iguais, vamos simplemente continuar pro pŕoximo dígito:
if menor[i] == maior[i]:
resultado.append( menor[i] )
continue
# Quando temos a diferença de apenas 1 é treta! kkkkkk
elif (int(maior[i]) - int(menor[i])) == 1:
aux = resultado
aux.append(maior[i])
if int(''.join(maior)) > int(''.join(aux)):
resultado = aux
break
else:
resultado.append( menor[i] )
# Quando o dígito do maior número é menor que o dígito do menor números, temos que somar 1 ao dígito anterior
elif (int(maior[i]) - int(menor[i])) < 0:
# TODO: Sempre que "maior" é 100% dá ruim
# TODO: 10 vs 09 dá ruim... pois o menor seria 091
# TODO: 160 vs 200 dá ruim também, pois, deveria ser 170 e não 200 (se for intervalo aberto).
resultado[i-1] = str(int(resultado[i-1]) + 1)
break
# Qualquer outro caso, basta somar 1 no dígito atual:
else:
resultado.append( str(int(menor[i])+1) )
break
resultado += ['0' for i in range(abs(len(resultado) - len(menor)))] # Completando com '0s' se necessário (até ficar do tamanho do menor)
resultado = int ( ''.join(resultado) ) # Transformando a lista de chars em um número inteiro
return resultado