Posts

Showing posts from January, 2011

Project Euler - Problem 48

Description

The series, 1^1 + 2^2 + 3^3 + ... + 10^10 = 10405071317.
Find the last ten digits of the series, 1^1 + 2^2 + 3^3 + ... + 1000^1000

Solution

let powerBySelf num = bigint (float num)**(num)

let LastTenDigitisOfSumOfPowerBySelf =
    let sum = [1..1000] |> List.map (fun x -> powerBySelf x) |> List.sum
    let stringOfSum = sum.ToString()
    stringOfSum.Substring(stringOfSum.Length-10)

Project Euler - Problem 30

Description

Surprisingly there are only three numbers that can be written as the sum of fourth powers of their digits:

1634 = 1^4 + 6^4 + 3^4 + 4^48208 = 8^4 + 2^4 + 0^4 + 8^49474 = 9^4 + 4^4 + 7^4 + 4^4As 1 = 1^4 is not a sum it is not included.
The sum of these numbers is 1634 + 8208 + 9474 = 19316.  Find the sum of all the numbers that can be written as the sum of fifth powers of their digits.

Solution

let isNarcissistic num power =
    let numAsString = num.ToString()
    let arr = [for i=0 to (numAsString.Length - 1) do
                    yield (float(numAsString.Chars(i).ToString()))**power]
    if num = int(List.sum arr) then
        true
    else
        false

let GetAllNarcissistic =
    [2..999999]
    |> List.filter ( fun x -> isNarcissistic x 5.0 = true)
    |> List.sum

Project Euler - Problem 29

Description

Consider all integer combinations of a^b for 2 <= a <= 5 and 2 <= b <= 5:

2^2=4, 2^3=8, 2^4=16, 2^5=323^2=9, 3^3=27, 3^4=81, 3^5=2434^2=16, 4^3=64, 4^4=256, 4^5=10245^2=25, 5^3=125, 5^4=625, 5^5=3125
If they are then placed in numerical order, with any repeats removed, we get the following sequence of 15 distinct terms:

4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125

How many distinct terms are in the sequence generated by a^b for 2 <= a <= 100 and 2 <= b <= 100?

Solution

let rec powerFx num power endPower arr =
    if power > endPower then
        arr
    else
        let newResult = num**power
        let newArr = List.append arr [newResult]
        powerFx num (power+1.0) endPower newArr

let rec appendPowerFx num endNum power endPower arr =
    if num > endNum then
        arr
    else
        let newResult = powerFx num power endPower []
        let newArr = List.append arr newResult
        appendPowerFx (num+1.0) endNum pow…

Project Euler - Problem 26

Description

A unit fraction contains 1 in the numerator. The decimal representation of the unit fractions with denominators 2 to 10 are given:

1/2 = 0.51/3 = 0.(3)1/4 = 0.251/5 = 0.21/6 = 0.1(6)1/7 = 0.(142857)1/8 = 0.1251/9 = 0.(1)1/10 = 0.1
Where 0.1(6) means 0.166666..., and has a 1-digit recurring cycle. It can be seen that 1/7 has a 6-digit recurring cycle.

Find the value of d < 1000 for which 1/d contains the longest recurring cycle in its decimal fraction part.

Solution

let rec remainders (num:int) (rem:int) (arr:list) =
    let filteredList = arr |> List.filter (fun x -> x = num)
    if filteredList.Length > 1 || num = 0 then
        arr.Length - 1
    elif (num*10) < rem then
        remainders (num*10) rem arr
    else
        let newRem = (num*10) % rem
        let newArr = List.append arr [newRem]
        remainders newRem rem newArr

let testRemainders =
    let results = [1..999] |> List.map (fun x -> remainders 1 x [])
    let max = List.max results
  …

Project Euler - Problem 19

Description

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)?

Solution

Although this solves the problem in a fairly straightforward way, it is not in the spirit of the problem, which I assume requires logic using match to calculate the number of days.  I simply used the built-in DateTime library of .NET

let rec IterateDays (startDate:System.DateTime) (endDate:System.DateTime) counter =
    if startDate > endDate then
        counter
    else
        if (startDate.DayOfWeek.ToString() = "Sunday" && startDate.Day = 1) then

Project Euler - Problem 11

Description

In the 20×20 grid below, four numbers along a diagonal line have been marked in red...grid repeated below in codeThe product of these numbers is 26 × 63 × 78 × 14 = 1788696.What is the greatest product of four adjacent numbers in any direction (up, down, left, right, or diagonally) in the 20×20 grid?
Solution

Like everyone else's solution, this on is basically a brute force algorithm, but I tried to keep it idiomatic, so no immutable value, and uses the yield keyword

let matrix =
    [[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;…