Este blog ha sido creado con la intención de compartirte mi conocimiento en programación, en especial en los lenguajes python, perl y bash. Para que cada lector experimentado tenga la libertad de aportar algo constructivo y así poder conocer más.
El conocimiento vale más que las piedras preciosas, atesorémoslo.
script es el archivo que contiene este codigo y que guardamos en la carpeta bin
directorio es el directorio que contiene las imágenes que vamos a redimensionar
y 800x600 es el nuevo tamaño que vamos a asignar
Nota: este script no es recursivo, por lo tanto no toma las imágenes de los subdirectorios del directorio dado
#!/bin/bash
E_BADPARAMS=99
E_BADDIRECTORY=100
if [[ -z "$1" || -z "$2" ]]
then
echo "Usage example: scriptname /home/user/Pictures -resize 800x600"
exit $E_BADPARAMS
else
dir=$1
if [[ -d "$dir" || -d ./"$dir" ]]
then
size=$2
if [[ $dir =~ .*[^/]$ ]]
then
dir=$dir/
fi
for file in "$dir"*.{jpg,JPG,png,PNG}
do
if [ -f "$file" ]
then
echo "Convirtiendo $file ..."
convert "$file" -resize $size "$file".tmp
mv "$file".tmp "$file"
if [ -t "$file".tmp ]
then
rm "$file".tmp
fi
fi
done
else
echo "Bad directory."
exit $E_BADDIRECTORY
fi
fi
He encontrado 2 buenos algoritmos para convertir un numero decimal a binario a través de estas funciones que reciben el numero entero en base 10 a convertir y devuelven una cadena de caractéres con los dígitos del mismo número ya convertido a base 2.
Python versión 2.7
def binario1(n):
"""este primer algoritmo utiliza la formula n = 2k + b"""if n == 0or n == 1: returnstr(n)
k = n / 2
E = binario1(k)
b = n % 2returnstr(E) + str(b)def binario2(n):
"""y este va recorriendo 1 bit hacia la derecha en cada iteracion"""if n == 0: returnstr(n)
b = ''
while n > 0:
b = str(n % 2) + b
n >>= 1#de esta forma el numero se va dividiendo entre 2 para llegar a 0#y terminar el bucle#tambien podria ser de esta forma#n /= 2 return b
Siéntente libre de comentar que te parecieron y si conoces algún otro te invito a publicarlo, gracias
En este post tenemos dos funciones en python para obtener la n-ésima permutación lexicográfica de un conjunto de elementos.
from functools importreducedef factorial(n):
"""calcula el factorial de un numero"""#si n es mayor a uno realiza el calculoif n > 1: returnreduce(lambda x, y: x * y, range(1, n + 1))#si no simplemente regresa 1else: return1def n_permutacion(n, lista):
"""obtiene la n-esima permutacion lexicografica de los elementos de una lista"""#creamos una funcion lambda para ir removiendo#los elementos que ya fijamos, por lo tanto los demas van cambiando
remover = lambda lista, aremover: [i for i in lista if i != aremover]#cuando ya no hay elementos en la lista significa que los elementos#ya quedaron ordenados y terminamos, regresando [] (vacio)ifnot lista:
return[]#obtenemos div (divisor) y mod (modulo de n (numero de permutacion)#entre la longitud de la lista - 1)
div, mod = divmod(n, factorial(len(lista)-1))#el primer elemento es igual al elemento que hay#en la posicion div de la lista
elemento = lista[div]#concatenamos el elemento actual con todos lo demas elementos#que nos valla regresando esta funcion, hasta que regrese []#notese que el modulo va disminuyendo y se va pasando como parametroreturn[elemento]+n_permutacion(mod, remover(lista, elemento))
Bueno como ya es de saberse en cada uno de los post donde exponga algún código de python sera de la versión 3.1 ó >, entonces no cabe la necesidad de estar mencionando la versión del lenguaje en el título del post.
Les presento un par de algoritmos muy parecidos ya que los dos usan la llamada criba de Eratóstenes para "cribar" los números primos de una sequencia de números. Ambos usan una sequencia 1..2000000.
La criba de Eratóstenes
Nota:
Si conoces algún algoritmo más eficiente tienes la libertad de comentarlo, gracias
#inicializamos el tamano de la sequencia de numeros
n = 2000000#se usa un conjunto porque es mas eficiente#(no hay numeros repetidos)
noprimos = set()#iteramos desde 2 hasta la raiz cuadrada de n#y desde lo que lleva i, hasta n / i#esto nos permite obtener todos los multiplos de i#y agregarlos a el conjunto noprimosfor i inrange(2, int(n ** .5) + 1):
if i notin noprimos:
for j inrange(i, int(n / i) + 1): noprimos.add(i * j)#por ultimo creamos una lista con todos los numeros#primos desde 2 hasta n
primos = [p for p inrange(2, n + 1)if p notin noprimos]
y aquí esta el otro que a mi parecer es más eficiente
#inicializamos la criba como una lista con n elementos True
criba = [True] * n
#iteramos desde 2 hasta la raiz cuadrada de n#y desde lo que lleva i, por i, hasta nfor i inrange(2, int(n ** .5) + 1):
for j inrange(i * i, n + 1, i):
#esto nos permite poner False en la posicion j - i de la criba#porque j es un multiplo de i y por lo tanto no es primo
criba[j - 1] = False
#por ultimo "cribamos" todos los numeros primos desde 2#hasta la longitud de la criba
primos = [p for p inrange(2, len(criba) + 1)if criba[p - 1])]
El día de hoy estuve buscando con un algoritmo para obtener una lista de factores primos de un número y me tope con esté que me pareció muy interesante
def factorizar(n):
#almacenamos los resultados#de la factorizacion en una lista
l = []
num1 = n
#mientras podamos dividir por 2#el dos es un factorwhile num1 % 2 == 0:
l.append(2)
num1 /= 2#ahora probamos con los impares#empezando por el 3
cuenta = 3
raiz = int(math.sqrt(num1))while cuenta <= raiz and num1 > 1:
if num1 % cuenta == 0:
l.append(cuenta)
num1 /= cuenta
else:
cuenta += 2if num1 > 1:
l.append(num1)return l
Ya tengo algún tiempo con este pequeño script el cual en pocas palabras lo que hace es actualizarme la lista de paquetes en ubuntu e instalarme opcionalmente nuevos paquetes así como eliminarme paquetes en desuso y tratar de corregirme aquellos con dependecias incumplidas.
#mas info en [man apt-get] o [apt-get --help] (mas breve)
Por último les recomiendo que cualquier script que hagan, lo guarden en un directorio que este incluido en el $PATH esto es en la variable de entorno para las rutas. Para que lo puedan ejecutar desde la terminal, p.e. yo nombre a mi script "update", entonces cada vez que lo quiero ejecutar voy a la terminal y escribo:
update
y me da la sig. salida:
user@host:~$ update
[sudo] password for user:
********** ACTUALIZANDO EL SISTEMA **********
1. ACTUALIZANDO LA LISTA DE PAQUETES...
2. ACTUALIZANDO...
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
0 actualizados, 0 se instalarán, 0 para eliminar y 0 no actualizados.
3. CHECANDO DEPENDENCIAS INCUMPLIDAS...
4. CORRIGIENDO DEPENDENCIAS INCUMPLIDAS...
********** ELIMINADO PAQUETES BASURA **********
5. DESINSTALANDO PAQUETES EN DESUSO...
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
0 actualizados, 0 se instalarán, 0 para eliminar y 0 no actualizados.
6. BORRANDO ARCHIVOS DESCARGADOS...
7. BORRANDO ARCHIVOS ANTIGUOS DESCARGADOS...
********** ^^ LISTO ^^ **********
Recomendación:
Ejecuta este comando hasta que en todas las secciones te aparezca
0 actualizados, 0 se instalarán, 0 para eliminar y 0 no actualizados.
Esto significa que ya no hay paquetes por actualizar, instalar, eliminar y actualizar, y que por lo tanto 0 paquetes se actualizaron.
Soy estudiante de Ingeniería en Software y además estudio por mi cuenta los lenguajes de programación: python, perl y bash (porque estos no me los enseñan en la escuela :()
Mi intención es compartir lo más relevante de python (en especial) que valla aprendiendo y aprender más en base a las sugerencias y críticas constructivas que puedan surjir.