challenges

my solutions to various "programming challenge" problems
git clone https://wehaveforgeathome.hates.computer/challenges.git
Log | Files | Refs | LICENSE

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:
MREADME.md | 4++++
Aprojecteuler/001/001.io | 23+++++++++++++++++++++++
Aprojecteuler/001/001.pez | 15+++++++++++++++
Aprojecteuler/001/001.pl | 24++++++++++++++++++++++++
Aprojecteuler/001/001.rexx | 17+++++++++++++++++
Aprojecteuler/002/002.io | 17+++++++++++++++++
Aprojecteuler/002/002.pl | 19+++++++++++++++++++
Aprojecteuler/002/002.rexx | 17+++++++++++++++++
Aprojecteuler/003/003.io | 13+++++++++++++
Aprojecteuler/003/003.php | 13+++++++++++++
Aprojecteuler/003/003.pl | 20++++++++++++++++++++
Aprojecteuler/004/004.php | 29+++++++++++++++++++++++++++++
Aprojecteuler/005/005.pez | 43+++++++++++++++++++++++++++++++++++++++++++
Aprojecteuler/005/005.php | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
Aprojecteuler/006/006.php | 11+++++++++++
Aprojecteuler/007/007.pl | 29+++++++++++++++++++++++++++++
Aprojecteuler/008/008.php | 23+++++++++++++++++++++++
Aprojecteuler/009/009.pez | 26++++++++++++++++++++++++++
Aprojecteuler/009/009.php | 15+++++++++++++++
Aprojecteuler/010/010.pl | 24++++++++++++++++++++++++
Aprojecteuler/011/011.pl | 105+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aprojecteuler/012/012.io | 29+++++++++++++++++++++++++++++
Aprojecteuler/013/013.io | 13+++++++++++++
Aprojecteuler/013/sample.txt | 100+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aprojecteuler/014/014.pl | 24++++++++++++++++++++++++
Aprojecteuler/015/015.pl | 15+++++++++++++++
Aprojecteuler/016/016.pl | 12++++++++++++
Aprojecteuler/017/017.ik | 11+++++++++++
Aprojecteuler/017/017.io | 11+++++++++++
Aprojecteuler/019/019.pez | 80+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aprojecteuler/020/020.pl | 16++++++++++++++++
Aprojecteuler/021/021.pez | 42++++++++++++++++++++++++++++++++++++++++++
Aprojecteuler/025/025.pl | 22++++++++++++++++++++++
Aprojecteuler/028/028.io | 16++++++++++++++++
Aprojecteuler/038/038.pl | 36++++++++++++++++++++++++++++++++++++
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; +}