Open Source – OTFusion

Hola, esto va para todos los que quieran empezar proyectos en conjunto utilizando open source.

Les dejo el link de la organización OTFusion en GitHub, si quieren empezar un proyecto solo avisen, si quieren unirse avisen para comenzar un grupo de desarrolladores…

https://github.com/OTFusion

Esto es para aquellos que quieran aprender a programar en algun lenguaje especifico (creamos un proyecto y lo hacemos entre todos!), pueden ser proyectos de lo que sea, nos sirven a todos!.

Dedicado especialmente para los estudiantes de Ingeniería en Software del Instituto Tecnologico de Sonora, si quieren ser parte solo avísenme, ya tienen mis datos y demas estoy seguro.

Animense!

Problema 25 – Project Euler

Solucion al problema 25 de Project Euler, tarda 22 segundos mas o menos en mi computadora:

Linux slackware 2.6.37.6 #2 Sun Apr 10 01:09:12 CDT 2011 i686 Intel(R) Pentium(R) D CPU 2.66GHz GenuineIntel GNU/Linux

#! /bin/env python
def longfib(n):
	return len(str(fib(n)))

def fib(n):
	return fibi(1, 0, n)

def fibi(a,b, n):
	while n != 0:
		temp = a
		a   += b
		b    = temp
		n   -= 1
	return b

def main(n = 1000):
	cuenta = 0
	indice = 0
	while cuenta < n:
		cuenta = longfib(indice)
		indice += 1
	print indice-1

if __name__ == "__main__":
	main()

La solucion fue 4782 y ahora vamos a repazar un poco el problema:

Recursion?

No es buena idea utilizar la recursion en este problema por que haremos demasiados calculos inecesarios y esto hara que el tiempo (que en si ya es alto para ser 22 segundos) aumente

Fig. 1.5, Computacion de fib(5) - SICP

En la imagen anterior podemos ver como el calculo de fib(5) se calcula fib(3), 2 veces!!!

Hay que sentarse a pensar algunas veces… y eso que es un problema simple!

Problema 21 – Project Euler

Solucion al problema 21 de Project Euler, tarda 25 segundos mas o menos en mi computadora:

Linux slackware 2.6.37.6 #2 Sun Apr 10 01:09:12 CDT 2011 i686 Intel(R) Pentium(R) D CPU 2.66GHz GenuineIntel GNU/Linux

#! /bin/env python

def divisores(n):
	'''Obtener los divisores de un numero (en forma de lista)'''
	li = []
	for i in range(1, n):
		if n % i == 0: li.append(i)
	return li

def d(n):
	'''Sumar todos los elementos en una lista de divisores'''
	return sum(divisores(n))

def main():
	suma = 0
	for num1 in xrange(1, 10000):
		num2 = d(num1)
		if (d(num2) == num1):
			if (num1 != num2):
				suma += num1
	print suma

if __name__ == "__main__":
	main()

La solucion fue 31626 y si, saque los divisores de una manera extrania.

ProjectEuler 19 en Java

Resolviendo el problema 19, Dios santo olvidaba la sensacion de cuando resuelvo un problema de Project Euler, termino, mi solucion es lenta y grande y veo las demas y oh sorpresa!, las soluciones que los otros plantean son tan sencillas que te quieres volver loco…

Asi fue el caso con este problema… aunque mi solucion en Java no fue tan diferente a las demas planteadas en algunos lenguajes parecidos como CSharp (no lo hice en Python esta vez por que no he usado datetime ahi).

API API API API API API!…

Empece este problema utilizando Python, los datos que venian como anios biciestos, dias de los meses… pero despues, me dije a mi mismo… Porque diablos estoy empezando desde 0 si en el JDK puedo utilizar java.util.Date o GregorianCalendar?! (datetime en python pero no he usado mucho asi que decidi hacerlo en Java primero)

En fin… termine con esta solucion:

package org.otfusion.euler.problema19;

import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;
import java.util.Calendar;

public class Main {

	private static Calendar mCalendar;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		/*
		 * You are given the following information, but you may prefer to do some research for yourself.
		 *
		 * 1 Jan 1900 was a Monday.
		 * Thirty days has September,
		 * April, June and November.
		 * All the rest have thirty-one,
		 * Saving February alone,
		 * Which has twenty-eight, rain or shine.
		 * And on leap years, twenty-nine.
		 * A leap year occurs on any year evenly divisible by 4, but not on a century unless it is divisible by 400.
		 *
		 * How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)?
		 */
		SimpleDateFormat sdf = new SimpleDateFormat("EEE");
		int year = 1901;
		mCalendar = new GregorianCalendar(year, Calendar.JANUARY, 1);
		int months[] = {Calendar.JANUARY,Calendar.FEBRUARY,Calendar.MARCH,Calendar.APRIL,Calendar.MAY,Calendar.JUNE,
						Calendar.JULY,Calendar.AUGUST,Calendar.SEPTEMBER, Calendar.OCTOBER,Calendar.NOVEMBER,Calendar.DECEMBER};

		int total = 0;
		while (year < 2001) {
			for (int i = 0; i < months.length; i++) {
				mCalendar.set(year, months[i], 1);
				String str = sdf.format(mCalendar.getTime());
				if (str.equalsIgnoreCase("sun")) {
					total++;
				}
			}
			year++;
		}
		System.out.println(total);
	}

}

Por si quieren saber la solucion es 171, sean o no tramposos lo ivan a correr, asi que mejor la escribo de una vez. Igual no se trata de completar los problemas, si no llegar a la solucion por ti mismo.

Luego hare la solucion en Python.

wordpress-cl – GitHub

wordpress-cl, es mi proyecto actual… esta escrito en Python y es solo por esta semana (y hoy es jueves!).

Seguire avanzando todo lo que pueda lo que sobra esta semana, y luego cambiare de proyecto, no se que me ponga a programar… pero sera en estas vacaciones, 1 proyecto por semana pues no tengo mucho que hacer!

No queda de otra mas que desarrollar ideas!

El programa hara lo que hacen muchos otros, de peor manera y talvez ni siquiera sirva bien pero pues… son hacks por diversion.

El link al repositorio en GitHub:

python-wordpress-cl – GitHub

Tambien quise probar las paginas de GitHub, asi que le cree una al proyecto… es la default pero se ve bonito!

Saludos!
Jose Miguel

Primer post ‘oficial’

Hola, ahora el script solamente le pasamos 2 parametros:

python press "titulo" archivo

El script lee el archivo linea por linea mandandolo a una cadena de texto y esa es toda la magia del script, no me tomo mas de 2 dias hacerlo… gracias a las librerias de hoy en dia nomas ocupamos escribir muy pocas lineas de codigo.

Y pues para acabar, el script en cuestion:

'''
wordpress-cl.py
Main script for the wordpress-cl program

Using python_wordpress_xmlrpc library:

https://github.com/maxcutler/python-wordpress-xmlrpc

'''
#import wordpresslib
from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import NewPost
import sys

ERROR_MSG_BAD_USE = "That's not the way you should use this program"
_FILE = "config.wp"

# Oh boy...
_url      = ""
_username = ""
_pwd      = ""

#
def main():
    if sys.argv[1:] == []:
        exit()
    else:
        execute()

def execute():
    config     = readConfig()
    # TODO try except this ??
    _url       = config["url"]
    _username  = config["username"]
    _pwd       = config["password"]
    config     = {}
    title      = sys.argv[1]
    wp         = Client(_url, _username, _pwd)
    # Call new post
    post       = preparePost(title)
    wp.call(NewPost(post, True))

def preparePost(title):
    post = WordPressPost()
    post.title = title
    try:
        file_name = sys.argv[2]
    except Exception:
        exit()
    post.description = readPost(file_name)
    return post

def readPost(file_name):
    try:
        fopen = open(file_name, 'r')
	return fopen.read().replace("\n","")
    except Exception:
        exit()

def readConfig():
    fopen = open(_FILE, 'r')
    fopen.seek(0)
    line = fopen.readline()
    hashmap = {}
    while line != '':
        if line[0] == "#" or line[0] == "\n":
            # Comments = #
            line = fopen.readline()
            continue
        listaLine = line.split()
        # Remove the '='
        listaLine.pop(1)
        hashmap[listaLine[0]] = listaLine[1]
        line = fopen.readline()
    return hashmap

def exit():
    print ERROR_MSG_BAD_USE

if __name__ == '__main__':
    main()

Si ven este post con miles de notaciones html es por que no he probado si funciona pasar un string con codigo en html y lo convierte el archivo, se sabra en los proximos 2 segundos ja ja ja!