commit 2def7eb3ffbbdcdafc549d40dd224d9e1b68b383
parent 9ce69e37197359aceb34f1ff4f10ded0ba76ea9f
Author: Ryan Wolf <rwolf@borderstylo.com>
Date: Mon, 18 Oct 2010 11:35:10 -0700
moved project euler stuff in here
Diffstat:
35 files changed, 966 insertions(+), 0 deletions(-)
diff --git a/README.md b/README.md
@@ -4,6 +4,10 @@ Completed:
* greplin
+In Progress:
+
+* project euler
+
TODO:
* thesixtyone
diff --git a/projecteuler/001/001.io b/projecteuler/001/001.io
@@ -0,0 +1,23 @@
+#!/usr/bin/io
+
+sum := 0
+
+i := 3
+while(i < 1000,
+ sum = sum + i
+ i = i + 3
+)
+
+j := 5
+while(j < 1000,
+ sum = sum + j
+ j = j + 5
+)
+
+k := 15
+while(k < 1000,
+ sum = sum - k
+ k = k + 15
+)
+
+sum println
diff --git a/projecteuler/001/001.pez b/projecteuler/001/001.pez
@@ -0,0 +1,15 @@
+#! /usr/bin/env pez
+
+: this_function_exists_solely_so_I_can_loop
+ 1000 3 do
+ i +
+ 3 +loop
+ 1000 5 do
+ i +
+ 5 +loop
+ 1000 15 do
+ i -
+ 15 +loop
+;
+
+0 this_function_exists_solely_so_I_can_loop . cr
diff --git a/projecteuler/001/001.pl b/projecteuler/001/001.pl
@@ -0,0 +1,24 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+my $threes = 0;
+for (my $i = 0; $i < 1000; $i += 3) {
+ $threes += $i;
+}
+
+my $fives = 0;
+for (my $i = 0; $i < 1000; $i += 5) {
+ $fives += $i;
+}
+
+# multiples of 15 will get counted twice
+my $fifteens = 0;
+for (my $i = 0; $i < 1000; $i += 15) {
+ $fifteens += $i;
+}
+
+my $sum += $threes + $fives - $fifteens;
+
+print "$sum\n";
diff --git a/projecteuler/001/001.rexx b/projecteuler/001/001.rexx
@@ -0,0 +1,17 @@
+#!/usr/bin/rexx
+
+sum = 0
+
+do i = 3 to 999 by 3
+ sum = sum + i
+end
+
+do i = 5 to 999 by 5
+ sum = sum + i
+end
+
+do i = 15 to 999 by 15
+ sum = sum - i
+end
+
+say sum
diff --git a/projecteuler/002/002.io b/projecteuler/002/002.io
@@ -0,0 +1,17 @@
+#!/usr/bin/io
+
+i := 1
+j := 2
+
+sum := 2
+
+while(j <= 4000000,
+ k := i + j
+ if(k % 2 == 0,
+ sum = sum + k
+ )
+ i = j
+ j = k
+)
+
+sum println
diff --git a/projecteuler/002/002.pl b/projecteuler/002/002.pl
@@ -0,0 +1,19 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+my $sum = 2;
+
+my $last = 1;
+my $cur = 2;
+while ($cur < 4000000) {
+ my $save_last = $last;
+ $last = $cur;
+ $cur = $cur + $save_last;
+ if ($cur % 2 == 0) {
+ $sum += $cur;
+ }
+}
+
+print "$sum\n";
diff --git a/projecteuler/002/002.rexx b/projecteuler/002/002.rexx
@@ -0,0 +1,17 @@
+#!/usr/bin/rexx
+
+i = 1
+j = 2
+
+sum = 2
+
+do while j <= 4000000
+ k = i + j
+ if \(k // 2) then
+ sum = sum + k
+
+ i = j
+ j = k
+end
+
+say sum
diff --git a/projecteuler/003/003.io b/projecteuler/003/003.io
@@ -0,0 +1,13 @@
+#!/usr/bin/io
+
+m := 600851475143
+n := 1
+
+while(n < m,
+ n = n + 2
+ if(m % n == 0,
+ m = m / n
+ )
+)
+
+n println
diff --git a/projecteuler/003/003.php b/projecteuler/003/003.php
@@ -0,0 +1,13 @@
+<?php
+
+$i = 600851475143;
+$j = 1;
+
+while ($i > $j) {
+ $j += 2;
+ if (fmod($i, $j) == 0) {
+ $i = $i / $j;
+ }
+}
+
+print "$j\n";
diff --git a/projecteuler/003/003.pl b/projecteuler/003/003.pl
@@ -0,0 +1,20 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+my $c = 600851475143;
+my $i = 3;
+my $l = int(sqrt($c));
+my $last = 3;
+
+while ($i < $l) {
+ if ($c % $i == 0) {
+ $last = $c / $i;
+ $c = $c / $i;
+ $l = int(sqrt($c));
+ }
+ $i += 2;
+}
+
+print "$last\n";
diff --git a/projecteuler/004/004.php b/projecteuler/004/004.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+Approach on 8/30/09: start with test if product is palindromic.
+*/
+
+function isPalidromic ($n) {
+ $string = strval($n);
+ return $string == strrev($string);
+}
+
+function findPalidromic ($i, $j, $biggest) {
+ $product = $i * $j;
+ if (isPalidromic($product)) {
+ if ($product > $biggest) {
+ return findPalidromic($i - 1, $i - 1, $product);
+ }
+ return findPalidromic($i - 1, $i - 1, $biggest);
+ }
+ if ($i == 100) {
+ return $biggest;
+ }
+ if ($product < $biggest) {
+ return findPalidromic($i - 1, $i - 1, $biggest);
+ }
+ return findPalidromic($i, $j - 1, $biggest);
+}
+
+print findPalidromic(999,999,0) . "\n";
diff --git a/projecteuler/005/005.pez b/projecteuler/005/005.pez
@@ -0,0 +1,43 @@
+#! /usr/bin/env pez
+# real 0m0.008s
+# user 0m0.004s
+# sys 0m0.008s
+
+# I find this naive impl to be hi-larious -- it's the def of primality!
+# no need to speed it up, since it's only used 18 times with n < 20
+: prime?
+ 1
+ begin
+ 1+ 2dup mod
+ 0= until
+ =
+;
+
+# the answer must be a multiple of the product of all the primes less than 20
+: productOfPrimes<20 ( -- product )
+ 1
+ 20 2 do
+ i dup prime? if * else drop then
+ loop
+;
+
+productOfPrimes<20 constant inc
+
+: evenly_divides_3_to_x ( number_to_try -- number_to_try x )
+ 2
+ begin
+ 1 +
+ 2dup mod
+ 0 <> until
+ 1 -
+;
+
+: find_first_to_divide_evenly_1_to_20 ( -- first )
+ 0
+ begin
+ inc +
+ evenly_divides_3_to_x
+ 20 >= until
+;
+
+find_first_to_divide_evenly_1_to_20 . cr
diff --git a/projecteuler/005/005.php b/projecteuler/005/005.php
@@ -0,0 +1,52 @@
+<?php
+
+/* 8/31/09 */
+
+$n = 20;
+
+function listOfIntsToN ($n) {
+ $ints = array();
+ for ($i = 1; $i <= $n; $i++) {
+ $ints[] = $i;
+ }
+ return $ints;
+}
+
+$ints = listofIntsToN($n);
+
+function isPrime($n) {
+ $sqrt = sqrt($n);
+ for ($i = 2; $i <= $sqrt; $i++) {
+ if ($n % $i == 0) {
+ return false;
+ }
+ }
+ return true;
+}
+
+function findSolnRecursive ($product, $multiple, $ints) {
+ if (count($ints) == 0) {
+ return $product;
+ }
+
+ $filteredInts = array();
+ foreach ($ints as $int) {
+ if ($product % $int != 0) {
+ $filteredInts[] = $int;
+ }
+ }
+
+ if (count($filteredInts) < count($ints)) {
+ return findSolnRecursive($product, $product, $filteredInts);
+ }
+
+ if (isPrime($ints[0])) {
+ $product *= array_shift($ints);
+ return findSolnRecursive($product, $product, $filteredInts);
+ }
+
+ $product += $multiple;
+ return findSolnRecursive($product, $multiple, $filteredInts);
+}
+
+print findSolnRecursive(1, 1, $ints) . "\n";
diff --git a/projecteuler/006/006.php b/projecteuler/006/006.php
@@ -0,0 +1,11 @@
+<?php
+
+$sum = 0;
+$sum_of_squares = 0;
+
+for ($i = 1; $i <= 100; $i++) {
+ $sum += $i;
+ $sum_of_squares += $i * $i;
+}
+
+print $sum * $sum - $sum_of_squares . "\n";
diff --git a/projecteuler/007/007.pl b/projecteuler/007/007.pl
@@ -0,0 +1,29 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+my $nth_prime = 10001;
+
+my $counter = 1;
+my $i = 3;
+my $last = 1;
+
+while ($counter < $nth_prime) {
+ if (is_prime_over_2($i)) {
+ $counter++;
+ $last = $i;
+ }
+ $i += 2;
+}
+
+print "$last\n";
+
+sub is_prime_over_2 {
+ my $n = shift;
+ my $mid = sqrt($n);
+ for (my $i = 3; $i <= $mid; $i += 2) {
+ return 0 if ($n % $i == 0);
+ }
+ return 1;
+}
diff --git a/projecteuler/008/008.php b/projecteuler/008/008.php
@@ -0,0 +1,23 @@
+<?php
+/*
+Approach on 8/30/09:
+keep track of first character, iterate along one number at a time
+*/
+
+$bigString = '7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450';
+$bigArray = str_split($bigString);
+$currentFive = array_map('intval', array_splice($bigArray, 0, 5));
+$tmpProduct = array_product($currentFive);
+$greatestProduct = $tmpProduct;
+
+while (count($bigArray) > 0) {
+ array_shift($currentFive);
+ $currentFive[] = intval(array_shift($bigArray));
+ $tmpProduct = array_product($currentFive);
+
+ if ($tmpProduct > $greatestProduct) {
+ $greatestProduct = $tmpProduct;
+ }
+}
+
+print "$greatestProduct\n";
diff --git a/projecteuler/009/009.pez b/projecteuler/009/009.pez
@@ -0,0 +1,26 @@
+#! /usr/bin/env pez
+# real 0m0.032s
+# user 0m0.032s
+# sys 0m0.004s
+
+: square dup * ;
+
+: pythagoreanTriplet? ( a b c -- a b c bool )
+ dup square 2 pick square 4 pick square + =
+;
+
+: findTriplet
+ 999 335 do
+ i 1000 over 1 + - 333 swap do
+ i 2dup + 1000 swap -
+ pythagoreanTriplet? if
+ * * . quit
+ else
+ drop drop
+ then
+ -1 +loop
+ drop
+ -1 +loop
+;
+
+findTriplet
diff --git a/projecteuler/009/009.php b/projecteuler/009/009.php
@@ -0,0 +1,15 @@
+<?php
+
+$a = 1;
+$b = 2;
+$c = 997;
+
+for ($a = 1; $a <= 332; $a++) {
+ $B = floor((1000 - $a) / 2) - 1;
+ for ($b = 2; $b <= $B; $b++) {
+ $c = 1000 - $b - $a;
+ if (($a * $a) + ($b * $b) == ($c * $c)) {
+ die($a * $b * $c . "\n");
+ }
+ }
+}
diff --git a/projecteuler/010/010.pl b/projecteuler/010/010.pl
@@ -0,0 +1,24 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+my $nth_prime = 2_000_000;
+my $sum = 2;
+
+for (my $i = 3; $i < $nth_prime; $i += 2) {
+ if (is_prime_over_2($i)) {
+ $sum += $i;
+ }
+}
+
+print "$sum\n";
+
+sub is_prime_over_2 {
+ my $n = shift;
+ my $mid = sqrt($n);
+ for (my $i = 3; $i <= $mid; $i += 2) {
+ return 0 if ($n % $i == 0);
+ }
+ return 1;
+}
diff --git a/projecteuler/011/011.pl b/projecteuler/011/011.pl
@@ -0,0 +1,105 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use List::Util qw(reduce);;
+
+my $input = <<'END';
+08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
+49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
+81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
+52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
+22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
+24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
+32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
+67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
+24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
+21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
+78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
+16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
+86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
+19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
+04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
+88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
+04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
+20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
+20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
+01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48
+END
+
+my @nums = map(int, split(/\s+/s, $input));
+my $board = [];
+for (my $i = 0; $i < 20; $i++) {
+ my $row = [];
+ for (my $j = 0; $j < 20; $j++) {
+ push(@{$row}, shift(@nums));
+ }
+ push(@{$board}, $row);
+}
+my $highest_product = 0;
+
+# horizontal "-"
+for (my $row = 0; $row < 20; $row++) {
+ for (my $col = 0; $col < 16; $col++) {
+ my @line = (
+ $board->[$row][$col],
+ $board->[$row][$col + 1],
+ $board->[$row][$col + 2],
+ $board->[$row][$col + 3]
+ );
+ my $product = reduce {$a * $b} @line;
+ if ($highest_product < $product) {
+ $highest_product = $product;
+ }
+ }
+}
+
+# vertical "|"
+for (my $row = 0; $row < 16; $row++) {
+ for (my $col = 0; $col < 20; $col++) {
+ my @line = (
+ $board->[$row][$col],
+ $board->[$row + 1][$col],
+ $board->[$row + 2][$col],
+ $board->[$row + 3][$col]
+ );
+ my $product = reduce {$a * $b} @line;
+ if ($highest_product < $product) {
+ $highest_product = $product;
+ }
+ }
+}
+
+# diagonal "\"
+for (my $row = 0; $row < 16; $row++) {
+ for (my $col = 0; $col < 16; $col++) {
+ my @line = (
+ $board->[$row][$col],
+ $board->[$row + 1][$col + 1],
+ $board->[$row + 2][$col + 2],
+ $board->[$row + 3][$col + 3]
+ );
+ my $product = reduce {$a * $b} @line;
+ if ($highest_product < $product) {
+ $highest_product = $product;
+ }
+ }
+}
+
+# diagonal "/"
+for (my $row = 3; $row < 20; $row++) {
+ for (my $col = 0; $col < 16; $col++) {
+ my @line = (
+ $board->[$row][$col],
+ $board->[$row - 1][$col + 1],
+ $board->[$row - 2][$col + 2],
+ $board->[$row - 3][$col + 3]
+ );
+ my $product = reduce {$a * $b} @line;
+ if ($highest_product < $product) {
+ $highest_product = $product;
+ }
+ }
+}
+
+print "$highest_product\n";
diff --git a/projecteuler/012/012.io b/projecteuler/012/012.io
@@ -0,0 +1,29 @@
+#!/usr/bin/io
+
+d := method(n,
+ d := 1
+ lower := 2
+ upper := n
+ while(lower <= upper,
+ if(upper % lower == 0,
+ a := 0
+ while(upper % lower == 0,
+ a = a + 1
+ upper = upper / lower
+ )
+ d = d * (a + 1) // thanks, Hardy
+ )
+ lower = lower + 1
+ )
+ d
+)
+
+target := 500
+n := 3
+T := 1 + 2 + 3
+while(d(T) <= target,
+ n = n + 1
+ T = T + n
+)
+
+T println
diff --git a/projecteuler/013/013.io b/projecteuler/013/013.io
@@ -0,0 +1,13 @@
+#!/usr/bin/io
+
+sum := 0
+
+f := File with("sample.txt")
+f openForReading
+f readLines foreach(v, line,
+ num := line asNumber
+ sum = sum + num
+)
+f close
+
+sum asString(10) exSlice(0,10) println
diff --git a/projecteuler/013/sample.txt b/projecteuler/013/sample.txt
@@ -0,0 +1,100 @@
+37107287533902102798797998220837590246510135740250
+46376937677490009712648124896970078050417018260538
+74324986199524741059474233309513058123726617309629
+91942213363574161572522430563301811072406154908250
+23067588207539346171171980310421047513778063246676
+89261670696623633820136378418383684178734361726757
+28112879812849979408065481931592621691275889832738
+44274228917432520321923589422876796487670272189318
+47451445736001306439091167216856844588711603153276
+70386486105843025439939619828917593665686757934951
+62176457141856560629502157223196586755079324193331
+64906352462741904929101432445813822663347944758178
+92575867718337217661963751590579239728245598838407
+58203565325359399008402633568948830189458628227828
+80181199384826282014278194139940567587151170094390
+35398664372827112653829987240784473053190104293586
+86515506006295864861532075273371959191420517255829
+71693888707715466499115593487603532921714970056938
+54370070576826684624621495650076471787294438377604
+53282654108756828443191190634694037855217779295145
+36123272525000296071075082563815656710885258350721
+45876576172410976447339110607218265236877223636045
+17423706905851860660448207621209813287860733969412
+81142660418086830619328460811191061556940512689692
+51934325451728388641918047049293215058642563049483
+62467221648435076201727918039944693004732956340691
+15732444386908125794514089057706229429197107928209
+55037687525678773091862540744969844508330393682126
+18336384825330154686196124348767681297534375946515
+80386287592878490201521685554828717201219257766954
+78182833757993103614740356856449095527097864797581
+16726320100436897842553539920931837441497806860984
+48403098129077791799088218795327364475675590848030
+87086987551392711854517078544161852424320693150332
+59959406895756536782107074926966537676326235447210
+69793950679652694742597709739166693763042633987085
+41052684708299085211399427365734116182760315001271
+65378607361501080857009149939512557028198746004375
+35829035317434717326932123578154982629742552737307
+94953759765105305946966067683156574377167401875275
+88902802571733229619176668713819931811048770190271
+25267680276078003013678680992525463401061632866526
+36270218540497705585629946580636237993140746255962
+24074486908231174977792365466257246923322810917141
+91430288197103288597806669760892938638285025333403
+34413065578016127815921815005561868836468420090470
+23053081172816430487623791969842487255036638784583
+11487696932154902810424020138335124462181441773470
+63783299490636259666498587618221225225512486764533
+67720186971698544312419572409913959008952310058822
+95548255300263520781532296796249481641953868218774
+76085327132285723110424803456124867697064507995236
+37774242535411291684276865538926205024910326572967
+23701913275725675285653248258265463092207058596522
+29798860272258331913126375147341994889534765745501
+18495701454879288984856827726077713721403798879715
+38298203783031473527721580348144513491373226651381
+34829543829199918180278916522431027392251122869539
+40957953066405232632538044100059654939159879593635
+29746152185502371307642255121183693803580388584903
+41698116222072977186158236678424689157993532961922
+62467957194401269043877107275048102390895523597457
+23189706772547915061505504953922979530901129967519
+86188088225875314529584099251203829009407770775672
+11306739708304724483816533873502340845647058077308
+82959174767140363198008187129011875491310547126581
+97623331044818386269515456334926366572897563400500
+42846280183517070527831839425882145521227251250327
+55121603546981200581762165212827652751691296897789
+32238195734329339946437501907836945765883352399886
+75506164965184775180738168837861091527357929701337
+62177842752192623401942399639168044983993173312731
+32924185707147349566916674687634660915035914677504
+99518671430235219628894890102423325116913619626622
+73267460800591547471830798392868535206946944540724
+76841822524674417161514036427982273348055556214818
+97142617910342598647204516893989422179826088076852
+87783646182799346313767754307809363333018982642090
+10848802521674670883215120185883543223812876952786
+71329612474782464538636993009049310363619763878039
+62184073572399794223406235393808339651327408011116
+66627891981488087797941876876144230030984490851411
+60661826293682836764744779239180335110989069790714
+85786944089552990653640447425576083659976645795096
+66024396409905389607120198219976047599490197230297
+64913982680032973156037120041377903785566085089252
+16730939319872750275468906903707539413042652315011
+94809377245048795150954100921645863754710598436791
+78639167021187492431995700641917969777599028300699
+15368713711936614952811305876380278410754449733078
+40789923115535562561142322423255033685442488917353
+44889911501440648020369068063960672322193204149535
+41503128880339536053299340368006977710650566631954
+81234880673210146739058568557934581403627822703280
+82616570773948327592232845941706525094512325230608
+22918802058777319719839450180888072429661980811197
+77158542502016545090413245809786882778948721859617
+72107838435069186155435662884062257473692284509516
+20849603980134001723930671666823555245252804609722
+53503534226472524250874054075591789781264330331690
diff --git a/projecteuler/014/014.pl b/projecteuler/014/014.pl
@@ -0,0 +1,24 @@
+#!/usr/bin/perl
+
+use strict;
+use Memoize;
+
+memoize('count_hailstones');
+
+my $highest_start = 13;
+my $highest_count = 10;
+for(my $i = 15; $i < 1_000_000; $i += 2) {
+ my $count = count_hailstones($i);
+ if ($count > $highest_count) {
+ $highest_start = $i;
+ $highest_count = $count;
+ }
+}
+print "$highest_start: $highest_count\n";
+
+sub count_hailstones {
+ my $n = shift;
+ return 1 if ($n == 1);
+ return 1 + count_hailstones($n / 2) if ($n % 2 ==0);
+ return 1 + count_hailstones((3* $n) + 1);
+}
diff --git a/projecteuler/015/015.pl b/projecteuler/015/015.pl
@@ -0,0 +1,15 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use Memoize;
+
+memoize('paths');
+
+print paths(20, 0, 0) . "\n";
+
+sub paths {
+ my ($size, $x, $y) = @_;
+ return 1 if ($x == $size || $y == $size);
+ return paths($size, $x + 1, $y) + paths($size, $x, $y + 1);
+}
diff --git a/projecteuler/016/016.pl b/projecteuler/016/016.pl
@@ -0,0 +1,12 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use bignum;
+use List::Util qw(sum);
+
+my $n = 2 ** 1000;
+my $string = "$n";
+my $sum = sum(map(int, split('', $string)));
+
+print "$sum\n";
diff --git a/projecteuler/017/017.ik b/projecteuler/017/017.ik
@@ -0,0 +1,11 @@
+#!/usr/bin/ioke
+
+[
+ [191, "one"],
+ [190, "two three four five six seven eight nine"],
+ [10, "ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen"],
+ [100, "twenty thirty forty fifty sixty seventy eighty ninety"],
+ [999 - 9 - 99, "and"],
+ [999 - 99 , "hundred"],
+ [1, "thousand"]
+] map(v, v last split(" ") map(length) sum * (v first)) sum println
diff --git a/projecteuler/017/017.io b/projecteuler/017/017.io
@@ -0,0 +1,11 @@
+#!/usr/bin/io
+
+list(
+ list(191, "one"),
+ list(190, "two three four five six seven eight nine"),
+ list(10, "ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen"),
+ list(100, "twenty thirty forty fifty sixty seventy eighty ninety"),
+ list(999 - 9 - 99, "and"),
+ list(999 - 99 , "hundred"),
+ list(1, "thousand")
+) map(v, v last split(" ") map(size) sum * (v first)) sum println
diff --git a/projecteuler/019/019.pez b/projecteuler/019/019.pez
@@ -0,0 +1,80 @@
+#! /usr/bin/env pez
+# real 0m0.008s
+# user 0m0.000s
+# sys 0m0.008s
+
+: incIfSunday ( sundays days -- sundays days )
+ 7 mod dup 0= if
+ swap 1+ swap
+ then
+;
+
+: advanceAYear ( year sundays days -- year sundays days )
+ # jan
+ incIfSunday
+ 31 +
+
+ # feb
+ incIfSunday
+ 28 +
+ # leap years are crazy
+ 2 pick 4 mod 0= if
+ 1+
+ 2 pick 100 mod 0= if
+ 2 pick 400 mod 0 <> if
+ 1-
+ then
+ then
+ then
+
+ # march
+ incIfSunday
+ 31 +
+
+ # april
+ incIfSunday
+ 30 +
+
+ # may
+ incIfSunday
+ 31 +
+
+ # june
+ incIfSunday
+ 30 +
+
+ # july
+ incIfSunday
+ 31 +
+
+ # aug
+ incIfSunday
+ 31 +
+
+ # sep
+ incIfSunday
+ 30 +
+
+ # oct
+ incIfSunday
+ 31 +
+
+ # nov
+ incIfSunday
+ 30 +
+
+ # dec
+ incIfSunday
+ 31 +
+;
+
+: loopThroughYears ( days -- sundays )
+ 0 swap
+ 2001 1901 do
+ i -rot advanceAYear rot drop
+ loop
+ drop
+;
+
+# jan 1, 1900 was a monday
+1900 0 1 advanceAYear -rot drop drop loopThroughYears . cr
diff --git a/projecteuler/020/020.pl b/projecteuler/020/020.pl
@@ -0,0 +1,16 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use bignum;
+use List::Util qw(sum);
+
+my $n = 100;
+my $n_factorial = 1;
+for (my $i = 1; $i <= $n; $i++) {
+ $n_factorial *= $i;
+}
+my $string = "$n_factorial";
+my $sum = sum(map(int, split('', $string)));
+
+print "$sum\n";
diff --git a/projecteuler/021/021.pez b/projecteuler/021/021.pez
@@ -0,0 +1,42 @@
+#! /usr/bin/env pez
+# real 0m4.047s
+# user 0m4.040s
+# sys 0m0.004s
+
+: d ( n -- sum of proper divisors )
+ dup 2 <= if
+ drop 1
+ else
+ 0 swap
+ dup 1 do
+ i
+ 2dup mod 0= if
+ rot + swap
+ else
+ drop
+ then
+ loop
+ drop
+ then
+;
+
+: addIfAmicable ( sum n -- 'sum )
+ dup d 2dup d = if
+ 2dup > if
+ + +
+ else
+ drop drop
+ then
+ else
+ drop drop
+ then
+;
+
+: evaluateSum ( -- sum )
+ 0
+ 10000 1 do
+ i addIfAmicable
+ loop
+;
+
+evaluateSum . cr
diff --git a/projecteuler/025/025.pl b/projecteuler/025/025.pl
@@ -0,0 +1,22 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use Memoize;
+use bigint;
+
+my $digits = 1000;
+
+memoize("fib");
+
+my $n = 3;
+while (length(fib($n)) < $digits) {
+ $n++;
+}
+
+print "$n\n";
+
+sub fib {
+ my $n = shift;
+ return 1 if ($n < 3);
+ return fib($n - 1) + fib($n - 2);
+}
diff --git a/projecteuler/028/028.io b/projecteuler/028/028.io
@@ -0,0 +1,16 @@
+#!/usr/bin/io
+
+nextFour := method(current, step,
+ list(1, 2, 3, 4) map(v, current + (step * v))
+)
+
+current := 1
+sum := current
+
+for(step, 2, 1000, 2,
+ theseFour := nextFour(current, step)
+ current = theseFour last
+ sum = sum + (theseFour sum)
+)
+
+sum println
diff --git a/projecteuler/038/038.pl b/projecteuler/038/038.pl
@@ -0,0 +1,36 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use List::Util qw(reduce);
+
+my $limit = 9999;
+my $biggest = 0;
+
+for (my $i = 1; $i <= $limit; $i++) {
+ my $j = 2;
+ my $p = 0;
+ while (length $p <= 9) {
+ $p = concatenated_product($i, $j);
+ if (length $p == 9 && is_pandigital($p) && $p > $biggest) {
+ $biggest = $p;
+ }
+ $j++;
+ }
+}
+
+print "$biggest\n";
+
+sub concatenated_product {
+ my ($n, $k) = @_;
+ return int reduce { $a . $b } map { $n * $_ } (1 .. $k);
+}
+
+sub is_pandigital {
+ my $n = shift;
+ my @digits = sort(map(int, split('', $n)));
+ for (my $i = 1; $i <= scalar @digits; $i++) {
+ return 0 if ($digits[$i - 1] != $i);
+ }
+ return 1;
+}