Skip to content

Instantly share code, notes, and snippets.

@debiru
Created February 15, 2024 07:47
Show Gist options
  • Save debiru/9d25c99aa26b53c5bf1ca1646bbc274c to your computer and use it in GitHub Desktop.
Save debiru/9d25c99aa26b53c5bf1ca1646bbc274c to your computer and use it in GitHub Desktop.
FizzBuzz-1 in Gleam
import gleam/io
import gleam/int
import gleam/float
import gleam/list
import gleam/set
import gleam/result
pub fn main() {
let list = generate_prime_list(100000)
// io.debug(list)
io.debug(list.length(list))
}
fn cond_val(cond: Bool, true_value: a, false_value: a) -> a {
case cond { True -> true_value False -> false_value }
}
/// range_step(3, 20, 4) -> [3, 7, 11, 15, 19]
fn range_step(first: Int, last: Int, step: Int) -> List(Int) {
let main = fn () {
let last_diff = last - last / step * step
let over_count = cond_val(first > last_diff, 1, 0) + int.max({ first - last_diff - 1 } / step, 0)
list.range(0, last / step - over_count)
|> list.map(fn (i) { i * step + first })
}
case first <= last {
True -> main()
False -> []
}
}
fn generate_prime_list(n: Int) -> List(Int) {
let main = fn () {
// [3, 5, 7, 9, 11, 13, 15, 17, 19, 21, ...] (odd numbers >= 3)
let root = int.square_root(n) |> result.unwrap(0.0) |> float.truncate
let ints = range_step(3, root, 2)
// [3, 5, 7, 9, 11, 13, 15, 17, 19, 21, ...] (prime number candidate)
let primes = range_step(3, n, 2) |> set.from_list
let primes = list.fold(ints, primes, fn (primes, i) {
let sub = fn () {
// if i == 5 -> [10, 15, 20, 25, 30, ...] (multiple of i) > i
let removed_ints = range_step(i * 2, n, i)
// sieve of eratosthenes
list.fold(removed_ints, primes, fn (primes, k) {
// remove the removed_ints from primes
set.delete(primes, k)
})
}
case set.contains(primes, i) {
True -> sub()
False -> primes
}
})
// [3, 5, 7, 11, 13, 17, 19, 23, 29, 31, ...] actual primes >= 3
let primes = set.to_list(primes) |> list.sort(int.compare)
// add 2 as primes
[2, ..primes]
}
case n {
n, if n < 2 -> []
_ -> main()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment