lunes, 10 de octubre de 2016

Euler #4

https://projecteuler.net/problem=4

Python:
   1 #!/usr/bin/env python3
2
3 def isPalindromic(arg):
4 arg = str(arg)
5 cut = int(len(arg)/2)
6 (first, last) = (arg[:cut], arg[cut:][::-1])
7 if (len(last) == len(first) + 1):
8 last = last[:-1]
9 return first == last
10
11 biggest = 0
12 for x in range(100, 1000):
13 for y in range(100, 1000):
14 num = x * y
15 if isPalindromic(num) and num > biggest:
16 biggest = num
17
18 print (biggest)

Euler #3

Seguimos resolviendo problemas del proyecto Euler, vamos con el tercero.

https://projecteuler.net/problem=3

En Java.

Implementaremos el método más sencillo, división por tentativa.
   1 
2 public class EulerSqrtRev_3 {
3
4 public static boolean isPrime(long number) {
5 if (number == 2) return true;
6 if (number < 2 || number % 2 == 0) return false;
7 double max = Math.sqrt(number);
8 for (long i = 3; i <= max; i +=2) {
9 if (number % i == 0) {
10 return false;
11 }
12 }
13 return true;
14 }
15
16 public static void main(String args[]) {
17 final long number = 600851475143L;
18 long max = number/2;
19 for (long i = 2; i < max; i++) {
20 if (number % i == 0 && isPrime(i)) {
21 System.out.println(i);
22 }
23 }
24 }
25
26 }


 

domingo, 9 de octubre de 2016

Euler #1 y #2

Hay que mantenerse en forma...

https://projecteuler.net/problem=1

Python:
   1 #!/usr/bin/env python3
2
3 sum = 0
4 for n in range(1, 1000):
5 if n % 3 == 0 or n % 5 == 0:
6 sum += n
7
8 print (sum)
9




JavaScript:
   1 var sum = 0;
2 for (var i=1; i<1000; i++) {
3 if (i % 3 == 0 || i % 5 == 0) {
4 sum += i;
5 }
6 }
7 console.log(sum)
8





https://projecteuler.net/problem=2

PHP (iterativo):
   1 <?php
2
3 function fib($max) {
4 $ret = array(1, 2);
5 $x = 3;
6 while (true) {
7 $new = $ret[$x-2] + $ret[$x-3];
8 if ($new <= $max) {
9 $ret []= $new;
10 $x++;
11 } else {
12 break;
13 }
14 }
15 return $ret;
16 }
17
18
19 $sum = 0;
20 foreach (fib(4000000) as $n) {
21 if ($n % 2 == 0) {
22 $sum += $n;
23 }
24 }
25
26 echo "$sum\n";
27


 

viernes, 30 de septiembre de 2016

El (caótico) orden de los parámetros en PHP

¿En qué estaban pensando los desarrolladores del lenguaje PHP cuando lo empezaron a desarrollar?

Llevo más de 15 años programando en PHP y todavía tengo que hacer un esfuerzo consciente en recordar el orden de los parámetros en todas las funciones de búsqueda diversas y variadas, porque en unas lo que buscas va delante, y en otras el primer argumento es dónde lo buscas.
bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )

bool array_key_exists ( mixed $key , array $array )

mixed strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )

string strstr ( string $haystack , mixed $needle [, bool $before_needle = false ] )

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [,int $offset = 0 ]]] )

De locos. Obsérvese preg_match y compárese con strpos, por ejemplo. La cadena sobre la que se busca en cada función es un argumento diferente. Hay que memorizar cada caso por separado, porque no hay una regla aparente.

miércoles, 27 de julio de 2016

Cómo subir un archivo de correo MBOX a Gmail

Tengo correos guardados en local desde hace varios años. Siempre que cambio de equipo tengo cuidado en copiarlos, están en su copia de seguridad, etc.

Pero al cliente de correo (suelo utilizar Thunderbird) ya no le gusta tener que manejar ficheros tan voluminosos (tengo algunos mbox de varios gigas). He optado por subirlos a Gmail.

La primera opción ha sido mapear la cuenta de Gmail en Thunderbird y copiar los mensajes desde el archivo local a las "carpetas" de Gmail, todo desde la interfaz de Thunderbird. Imposible, a veces da "timeout", otras veces el mismo proceso Thunderbird se cuelga.

He encontado la siguiente utilidad, imap_upload.py, un script en Python que hace lo que su nombre indica, subir a un servidor IMAP un fichero local de correo en formato MBOX.

El uso es trivial:
imap_upload.py --gmail --box="CarpetaRemota" FicheroMboxLocal