The final part for arithmetic data compression is to find a number, which is among 2 other numbers, and has the fewest digits / decimal places!
Example: Number between 0.1234 and 0.1245. The answer is 0.124 Because it is between the two numbers, and has the least number of possible digits.
Note: Interval open at both ends, ie neither 0.1234 nor 0.1245 may 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 there is certainly a smarter (and mathematical) way to do this.
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