Add solutions for problems 55-58.

This commit is contained in:
jdmcdona 2015-08-27 17:24:11 -05:00
parent 44f52663a9
commit 9378a772f4
4 changed files with 58 additions and 0 deletions

13
Problem055.hs Normal file
View File

@ -0,0 +1,13 @@
-- A number that never forms a palindrome through the reverse and add process is called a Lychrel number. Due to the theoretical
-- nature of these numbers, and for the purpose of this problem, we shall assume that a number is Lychrel until proven otherwise.
-- In addition you are given that for every number below ten-thousand, it will either (i) become a palindrome in less than fifty
-- iterations, or, (ii) no one, with all the computing power that exists, has managed so far to map it to a palindrome.
--
-- How many Lychrel numbers are there below ten-thousand?
import Euler
step n = n + fromDigits (reverse $ toDigits n :: [Word8])
palindrome n = let ds = toDigits n :: [Word8] in ds == reverse ds
lychrel n = not $ any palindrome $ take 50 $ iterate step (step n)
main = print $ length $ filter lychrel [1..10000]

3
Problem056.hs Normal file
View File

@ -0,0 +1,3 @@
-- Considering natural numbers of the form, ab, where a, b < 100, what is the maximum digital sum?
import Euler
main = print $ maximum $ [ sum (toDigits (a^b) :: [Integer]) | a <- [1..100], b <- [1..100] ]

14
Problem057.hs Normal file
View File

@ -0,0 +1,14 @@
-- It is possible to show that the square root of two can be expressed as an infinite continued fraction.
--
-- √ 2 = 1 + 1/(2 + 1/(2 + 1/(2 + ... ))) = 1.414213...
--
-- In the first one-thousand expansions, how many fractions contain a numerator with more digits than denominator?
import Euler
import Data.Ratio
nDigits 0 = 0
nDigits n = 1 + nDigits (n `div` 10)
iterations = iterate (\x -> 1+1/(1+x)) (3%2)
main = print $ length $ filter (\x -> nDigits (numerator x) > nDigits (denominator x)) $ take 1000 iterations

28
Problem058.hs Normal file
View File

@ -0,0 +1,28 @@
-- Starting with 1 and spiralling anticlockwise in the following way, a square spiral with side length 7 is formed.
--
-- 37 36 35 34 33 32 31
-- 38 17 16 15 14 13 30
-- 39 18 5 4 3 12 29
-- 40 19 6 1 2 11 28
-- 41 20 7 8 9 10 27
-- 42 21 22 23 24 25 26
-- 43 44 45 46 47 48 49
--
-- It is interesting to note that the odd squares lie along the bottom right diagonal, but what is more interesting is that 8 out
-- of the 13 numbers lying along both diagonals are prime; that is, a ratio of 8/13 ≈ 62%.
--
-- If one complete new layer is wrapped around the spiral above, a square spiral with side length 9 will be formed. If this process
-- is continued, what is the side length of the square spiral for which the ratio of primes along both diagonals first falls below
-- 10%?
module Main where
import Euler
isPrime n = n >= 2 && not (any (\p -> n `mod` p == 0) $ takeWhile ((<= n) . (^2)) primes)
-- diagonals of an m by m spiral; m = 2*n + 1.
allDiags = 1 : zipWith (+) allDiags (concat $ map (replicate 4) [2,4..])
allDiags' = map isPrime allDiags
diags' n = take (4*n+1) allDiags'
main = print $ head $ [ 2*n+1 | n <- [1..], (length (filter id (diags' n)) % (4*n+1)) < (1 % 10) ]