106 lines
2.6 KiB
Text
106 lines
2.6 KiB
Text
import Std.Data.Iterators
|
|
|
|
/- definitions -/
|
|
|
|
def sum₁ (xs : Array Nat) : Nat :=
|
|
xs.iter.fold (init := 0) (· + ·)
|
|
|
|
def sum₂ (xs : Array Nat) : Nat := Id.run do
|
|
let mut sum := 0
|
|
for x in xs do
|
|
sum := sum + x
|
|
return sum
|
|
|
|
def isolatedMap (xs : Array Nat) : Nat :=
|
|
xs.iter.map (· * 2) |>.fold (init := 0) (· + ·)
|
|
|
|
def isolatedFilterMap (xs : Array Nat) : Nat :=
|
|
xs.iter.filterMap (fun x => Option.guard (· % 2 = 0) (3 * x)) |>.fold (init := 0) (· + ·)
|
|
|
|
def isolatedTake (xs : Array Nat) (n : Nat) : Nat :=
|
|
xs.iter.take n |>.fold (init := 0) (· + ·)
|
|
|
|
def isolatedDrop (xs : Array Nat) (n : Nat) : Nat :=
|
|
xs.iter.drop n |>.fold (init := 0) (· + ·)
|
|
|
|
def isolatedTakeWhile (xs : Array Nat) : Nat :=
|
|
xs.iter.takeWhile (· < 100000) |>.fold (init := 0) (· + ·)
|
|
|
|
def isolatedDropWhile (xs : Array Nat) : Nat :=
|
|
xs.iter.dropWhile (· < 100000) |>.fold (init := 0) (· + ·)
|
|
|
|
def isolatedZip (xs : Array Nat) (ys : Array Nat) : Nat :=
|
|
xs.iter.zip ys.iter |>.fold (init := 0) (fun | acc, (a, b) => acc + a * b)
|
|
|
|
def isolatedSteppedRange (n : Nat) : Nat :=
|
|
(*...n).iter.stepSize 2 |>.fold (init := 0) (· + ·)
|
|
|
|
section Primes
|
|
|
|
def numDivisors (n : Nat) := (1...=n).iter
|
|
|>.filter (n % · = 0)
|
|
|>.size
|
|
|
|
def isPrime (n : Nat) := numDivisors n == 2
|
|
|
|
def primes (n : Nat) := (*...* : Std.PRange _ Nat).iter.take n
|
|
|>.filter isPrime
|
|
|>.toList
|
|
|
|
end Primes
|
|
|
|
def printEveryNth (xs : List Nat) (n : Nat) : IO Unit := do
|
|
for x in xs, i in (*...* : Std.PRange _ Nat) do
|
|
if i % n = 0 then
|
|
IO.println s!"xs[{i}] = {x}"
|
|
|
|
def printEveryNthSliceBased (xs : Array Nat) (n : Nat) : IO Unit := do
|
|
for x in xs[*...*], i in (*...* : Std.PRange _ Nat) do
|
|
if i % n = 0 then
|
|
IO.println s!"xs[{i}] = {x}"
|
|
|
|
def longChainOfCombinators (xs : Array Nat) : Nat :=
|
|
xs.iter.zip (2...* : Std.PRange _ Nat).iter
|
|
|>.filter (fun | (_, i) => i % 2 = 0)
|
|
|>.attachWith (fun _ => True) (fun _ _ => .intro)
|
|
|>.map (fun x => x.1.2)
|
|
|>.drop 1
|
|
|>.take 10000000
|
|
|>.takeWhile (fun x => x < 5000000)
|
|
|>.fold (init := 0) (· + ·)
|
|
|
|
/- evaluations -/
|
|
|
|
def xs : Array Nat := (*...100000).iter.toArray
|
|
|
|
def l : List Nat := (*...100000).iter.toList
|
|
|
|
#eval sum₁ xs
|
|
|
|
#eval sum₂ xs
|
|
|
|
#eval isolatedMap xs
|
|
|
|
#eval isolatedFilterMap xs
|
|
|
|
#eval isolatedTake xs 1000000
|
|
|
|
#eval isolatedDrop xs 100000
|
|
|
|
#eval isolatedTakeWhile xs
|
|
|
|
#eval isolatedDropWhile xs
|
|
|
|
#eval isolatedZip xs xs
|
|
|
|
#eval isolatedSteppedRange 1000000
|
|
|
|
#eval longChainOfCombinators xs
|
|
|
|
#eval (*...1000000).iter.fold (init := 0) (· + ·)
|
|
|
|
#eval primes 3000
|
|
|
|
#eval printEveryNth l 10000
|
|
|
|
#eval printEveryNthSliceBased xs 10000
|