icyrock.com

HomeOld blogOld blog 2

PureScript solution to Project Euler problem 63

2023-01-03 11:32

Problem details at Project Euler problem 63 page.

Test

module Euler063Test (euler63suite) where

import Prelude

import Effect.Aff (Milliseconds(..), delay)
import Euler063 (euler63)
import Test.Unit (TestSuite, suite, test)
import Test.Unit.Assert as Assert

euler63suite :: TestSuite
euler63suite =
  suite "Euler 63" do
    test "Real" do
      delay (Milliseconds 0.0)
      Assert.equal 49 (euler63 30)

Solution

module Euler063 where

import Prelude

import Control.Alternative (guard)
import Data.Array (length, range)
import Data.Array.NonEmpty as NA
import Data.BigInt (digitsInBase, fromInt, pow)

euler63 :: Int -> Int
euler63 n = length do
  let r = fromInt <$> range 1 n
  b <- r
  e <- r
  let p = pow b e
      ds = (digitsInBase 10 p).value
      dc = NA.length ds
  guard $ fromInt dc == e
  pure p