Improve Haskell code for a few problems

This commit is contained in:
daniele 2024-11-20 19:38:40 +01:00
parent 4f9bfc608c
commit 51bde9da48
Signed by: fuxino
GPG Key ID: 981A2B2A3BBF5514
9 changed files with 10 additions and 16 deletions

@ -14,19 +14,16 @@ isPrime 1 = False
isPrime 2 = True
isPrime 3 = True
isPrime n =
odd n && n `mod` 3 /= 0 && null [ x | x <- candidates, n `mod` x == 0 || n `mod` (x+2) == 0 ]
n > 0 && odd n && n `mod` 3 /= 0 && null [ x | x <- candidates, n `mod` x == 0 || n `mod` (x+2) == 0 ]
where candidates = [5,11..limit]
limit = floor(sqrt(fromIntegral n)) + 1
digitSum :: (Integral a, Show a) => a -> Int
digitSum n = sum $ map digitToInt $ show n
sumProperDivisors :: (Integral a) => a -> a
sumProperDivisors n = sum [ if x /= y then x + y else x | x <- [2..floor $ sqrt $ fromIntegral n], let y = n `div` x, n `mod` x == 0 ] + 1
countDivisors :: (Integral a) => a -> Int
countDivisors n = length $ nub $ concat [ [x, n `div` x] | x <- [1..limit], n `mod` x == 0 ]
where limit = floor $ sqrt $ fromIntegral n
@ -35,4 +32,3 @@ isPandigital :: Integer -> Bool
isPandigital n = n_length == length (nub n_char) && '0' `notElem` n_char && digitToInt (maximum n_char) == n_length
where n_char = show n
n_length = length n_char

@ -23,7 +23,7 @@
--
-- Find the thirteen adjacent digits in the 1000-digit number that have the greatest product. What is the value of this product?
import Data.Char
import Data.Char (digitToInt)
nDigitProduct :: Int -> String -> Int
nDigitProduct n s

@ -18,7 +18,6 @@
-- What is the value of the first triangle number to have over five hundred divisors?
import Data.List (nub)
import ProjectEuler (countDivisors)
triangNumbers :: [Int]

@ -11,7 +11,7 @@
--
-- How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)?
import Data.Time.Calendar
import Data.Time.Calendar (Day, DayOfWeek(Sunday), dayOfWeek, fromGregorian)
countSundaysFirst :: Day -> Day -> Int
countSundaysFirst start end = let days = [start .. end]

@ -9,7 +9,7 @@
-- as the sum of two abundant numbers is less than this limit.
--
-- Find the sum of all the positive integers which cannot be written as the sum of two abundant numbers.
import Data.List
import Data.List ((\\))
import qualified Data.Set as Set
import ProjectEuler (sumProperDivisors)

@ -5,7 +5,7 @@
--
-- What is the millionth lexicographic permutation of the digits 0, 1, 2, 3, 4, 5, 6, 7, 8 and 9?
import Data.List
import Data.List (sort, permutations)
main = do
let result = sort (permutations "0123456789") !! 999999

@ -10,7 +10,7 @@
-- 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 ab for 2 ≤ a ≤ 100 and 2 ≤ b ≤ 100?
import Data.List
import Data.List (nub)
powerCombinations :: (Integral a) => a -> [a]
powerCombinations n = nub [ x^y | x <- [2..n], y <- [2..n] ]

@ -1,7 +1,7 @@
-- It can be seen that the number, 125874, and its double, 251748, contain exactly the same digits, but in a different order.
--
-- Find the smallest positive integer, x, such that 2x, 3x, 4x, 5x, and 6x, contain the same digits.
import Data.List
import Data.List (sort)
smallestPermutedMultiples :: Integer
smallestPermutedMultiples = head [ x | x <- [1..], sort (show x) == sort (show (2 * x)), sort (show x) == sort (show (3 * x)), sort (show x) == sort (show (4 * x)), sort (show x) == sort (show (5 * x)), sort (show x) == sort (show (6 * x)) ]

@ -44,10 +44,9 @@
--
-- How many hands does Player 1 win?
import Data.List
import Data.Function
import Data.Maybe
import System.IO
import Data.List (sort, sortBy, groupBy, minimumBy, maximumBy)
import Data.Function (on)
import Data.Maybe (fromJust)
data Value = Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen | King | Ace
deriving (Eq, Ord, Show, Bounded, Enum)