
Rizando la Locura
Rizando el Rizo
En clases de pensamiento algoritmico, nos colocan a resolver el siguiente problema:
desarrolle un programa que solicite un numero, y posteriormente determine de cuantas cifras es dicho numero
Se discutió el problema en clase y se llego a la conclusion que debiamos comparar dicho numero con potencias de 10, es decir, comparar con 10, 100, 1000, y asi sucevimente, entonces se me ocurre resolver el problema de la siguiente forma:
n = int(input("ingese un numero "))
for i in range(1,n+1):
test = 10**i
if (n < test) and (n >= test/10):
print(f'El numero {n}, es numero de {i} cifras')
break
la respuesta esta bien, pues cumple solicitado, ademas, quedaba implicito el uso obligatorio del bucle for pues era de eso trataba la clase, ahora por otro lado, ¿de cuantas maneras puedo abordar dicho problema?
Con logaritmos:
Primeramente probemos con logaritmos, no creo que este haciendo trampas, me gusta mucho este acercamiento por lo simple y conciso de la solución, ademas, no rrecurro a cadenas ni a ningun recurso intermedio u avanzado de programación.
from math import log, trunc
n = int(input("ingese un numero "))
a = trunc(log(n,10))
print(f'El numero {n}, es numero de {a + 1} cifras')
Itertools al auxilio
Es hora de ponerle sazon al asunto, tenia animos de trabajar con takewhile y dropwhile
from itertools import takewhile
test2 = lambda x: n >= x
n = int(input("digite un numero "))
y = list(takewhile(test2, (10**i for i in range(n))))
print(f'takewhile: El numero {n}, es numero de {len(y)} cifras')
print()
List Coprehension
Los List conprehensions tienen su toque de magia, sonestructuras optimizadas, por lo que son bestialmente rapidas
n = int(input("digite un numero "))
test1 = lambda x: (n >= x//10) and (x > n)
test2 = lambda x: n >= x
# espero que el digito ingresado no sea mayor a 6 cifras
li1 = [10**i for i in range (6) if test1(10**i)]
li2 = [10**i for i in range (6) if test2(10**i)]
print(f'list comprehension: El numero {n}, es numero de {li1} cifras')
print(f'list comprehension: El numero {n}, es numero de {len(li2)} cifras')
print()
Lazy List
test1 = lambda x: (n >= x//10) and (x > n)
lazy_li = (i for i in range (n) if test1(10**i))
print(f'lazy list: El numero {n}, es numero de {next(lazy_li)} cifras')
Itertools
me quedo varias dudas y curiosidades por resolver, asi que ¿porque no generar una lista de infinitos numeros?
from itertools import starmap, count, repeat, takewhile
n = int(input('digite un numero '))
data = zip(repeat(10), count(0))
y = starmap(lambda x, y: x**y, data)
test = lambda x: n >= x
li = [i for i in takewhile(test, y)]
print(f'list comprehension: {li}')
print()
print(f'takewhile: El numero {n}, es numero de {len(li)} cifras')
pendiente
- map, filter
concluciones
no dejes que castren tu imaginación