packages feed

pec-0.2.3: test_cases/euler/Euler12.pec

module Euler12

imports
  Prelude
  Data.Stack

where

main :: () -> I32
main () = do
  t = new (28 :: W32)
  for 8 (\_ -> my_factor @t <= 500) succ
    (\i -> t += i)
  assert (@t == 76576500)
  putW @t
  0

my_factor :: W32 -> W32 // BAL: w must be non-zero
my_factor w => do
  j = sqrtw w
  t = new 0
  for 1 (\i -> i < j) succ
    (\i -> when ((w % i) == 0) (t += 2))
  when ((w % j) == 0)
    (do
      inc t
      k = w / j
      when (k != j) (inc t)
    )
  @t

// main :: () -> I32
// main () = do
//   p = new (stack #500)
//   assert (factor 25 p)
//   put putW p
//   assert (factor 100 p)
//   put putW p
//   // assert (factor 2 p)
//   // put putW p
//   // assert (factor 3 p)
//   // put putW p
//   // assert (factor 4 p)
//   // put putW p
//   // assert (factor 100 p)
//   // put putW p
//   // assert (factor 110 p)
//   // put putW p
//   i = new (1 :: W32)
//   t = new (1 :: W32)
//   while (factor @t p)
//     (do
//       inc i
//       t += @i
//     )
//   putW @t
//   putS "\n"
//   0

// factor :: W32 -> Ptr (Stack #cnt W32) -> Bool // BAL: w must be non-zero
// factor w p => do
//   i = new 1
//   j = sqrtw w
//   b = new True
//   empty p
//   while ((@i < j) && @b)
//     (do
//       when ((w % @i) == 0)
//         (b <- (push @i p) && (push (w / @i) p))
//       inc i
//     )
//   when ((w % j) == 0)
//     (do
//       b <- push j p
//       k = w / j
//       when (k != j) (b <- push k p)
//     )
//   @b