domingo, 16 de octubre de 2016

Euler #8, #9 y #10

https://projecteuler.net/problem=8

Sencillo problema, lo más fácil es tratar el número tan largo que proponen como un string e ir tomando "porciones" de 13 caracteres y sumándolas, guardándonos la mayor suma. Implementación en Python.

   1 
2 number = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"
3
4 biggest = ""
5 product = 0
6 length = 13
7
8 count = 0
9 portion = number[count:count+length]
10 while len(portion) == length:
11 temp = 1
12 for d in portion:
13 temp *= int(d)
14 if temp > product:
15 product = temp
16 biggest = portion
17 count += 1
18 portion = number[count:count+length]
19
20 print ("Biggest: " + biggest + ", product: " + str(product))
21







https://projecteuler.net/problem=9

Implementación en JavaScript
   1 var SUM = 1000
2 for (var a = 1; a < SUM; a++) {
3 for (var b = a + 1; b < SUM; b++) {
4 c2 = a*a + b*b;
5 c = Math.sqrt(c2)
6 if (Math.round(c) == c) { // Pythagorean triplet
7 if (a + b +c == SUM) {
8 console.log("Triplet: ", a, b, c, "Product: ", a*b*c);
9 process.exit(0);
10 }
11 }
12 }
13 }
14






https://projecteuler.net/problem=10

Utilizamos la función sum de Python para efectuar la suma de todos los números. El problema principal es tener una función generadora de números primos. La que se propone es una sencilla criba de Eratóstenes.
   1 import math
2
3 def isPrime(n):
4 if n == 2:
5 return True
6 if n < 2 or n % 2 == 0:
7 return False;
8 max = int(math.sqrt(n));
9 for i in range(3, max+1, 2):
10 if n % i == 0:
11 return False
12 return True
13
14
15 def primeGenerator(n):
16 """Generates prime numbers < n"""
17 primes = [2]
18 if n > 2:
19 candidates = [c for c in range(3, n, 2)]
20 for test in range(3, int(math.sqrt(n))+1, 2):
21 for c in candidates:
22 if c > test and c % test == 0:
23 candidates.remove(c)
24 primes += candidates
25 return primes
26
27 if __name__ == '__main__':
28 primes = primeGenerator(2000000)
29 print sum(primes)
30


 

martes, 11 de octubre de 2016

Euler #5, #6 y #7

https://projecteuler.net/problem=5
   1 #!/usr/bin/env python3
2
3 divisors = range(1, 20);
4 test = divisors[-1]
5 control = True
6 while control:
7 divisible = True
8 for d in divisors:
9 if test % d != 0:
10 divisible = False
11 break
12
13 if divisible:
14 control = False
15 else:
16 test += 1
17
18 print (test)
19





https://projecteuler.net/problem=6

JavaScript:
   1 
2 var sum = 0;
3 var squares = 0;
4 for (var i = 0; i <= 100; i++) {
5 sum += i;
6 squares += i*i;
7 }
8 console.log(sum * sum - squares);
9





https://projecteuler.net/problem=7

PHP:
   1 <?php
2 // https://projecteuler.net/problem=7
3
4 function isPrime($num) {
5 if ($num == 2) return true;
6 if ($num < 2 || $num % 2 == 0) return false;
7 $max = (int) sqrt($num);
8 for ($i = 3; $i <= $max; $i +=2) {
9 if ($num % $i == 0) {
10 return false;
11 }
12 }
13 return true;
14 }
15
16 $counter = 0;
17 $num = 2;
18 $stop = false;
19 while (true) {
20 if (isPrime($num)) {
21 $counter++;
22 if ($counter == 10001) {
23 echo "$num\n";
24 break;
25 }
26 }
27 $num++;
28 }
29

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