37 lines
1.3 KiB
Elm
37 lines
1.3 KiB
Elm
module GenderFriends exposing (altBlumBlumShub, nextBlumBlumShub, BoringGender(..), PolyGender, getBoringGender, getPolygenderWithLength, renderBoringGender, renderPolygender)
|
|
|
|
m1 = 3042724273 -- Product of two 16 bit primes equivalent to 3 (mod 4)
|
|
m2 = 1922092321 -- A different product of two 16 bit primes equivalent to 3 (mod 4)
|
|
nextBlumBlumShub prev = modBy m1 (prev * prev)
|
|
altBlumBlumShub prev = modBy m2 (prev * prev)
|
|
|
|
type BoringGender = Girl | Boy
|
|
type alias PolyGender = List BoringGender
|
|
|
|
getBoringGender : Int -> (BoringGender, Int)
|
|
getBoringGender seed =
|
|
let
|
|
bitFromSeed = modBy 2 seed == 1
|
|
nextSeed = nextBlumBlumShub seed
|
|
in
|
|
(if bitFromSeed then Girl else Boy, nextSeed)
|
|
|
|
getPolygenderWithLength : Int -> Int -> (PolyGender, Int)
|
|
getPolygenderWithLength n seed = case n of
|
|
0 -> ([], seed)
|
|
_ ->
|
|
let
|
|
(recursiveCase, newSeed) = getPolygenderWithLength (n - 1) seed
|
|
(boringGender, finalSeed) = getBoringGender newSeed
|
|
in
|
|
(boringGender :: recursiveCase, finalSeed)
|
|
|
|
renderBoringGender : BoringGender -> String
|
|
renderBoringGender gender = case gender of
|
|
Boy -> "boy"
|
|
Girl -> "girl"
|
|
|
|
renderPolygender : PolyGender -> String
|
|
renderPolygender polygender = case polygender of
|
|
[] -> "friends"
|
|
head :: tail -> (renderBoringGender head) ++ (renderPolygender tail) |