Discussion on: Daily Challenge #81 - Even or Odd

citizen428 profile image
Michael Kohl


module DailyChallenge

open System.Text.RegularExpressions

let tuple2Map f (x, y) = (f x, f y)

let (|Greater|Smaller|Equal|) (x, y) =
    if x > y then Greater
    elif x < y then Smaller
    else Equal

let evenOrOdd (nums : string) : string =
    nums.Split(' ')
    |> Array.partition (fun n -> Regex.Match(n, "[02468]$").Success)
    |> tuple2Map (Array.sumBy (int))
    |> function
    | Greater -> "Even is greater than Odd"
    | Smaller -> "Odd is greater than Even"
    | Equal -> "Even and Odd are the same"

Tried to have a bit of fun with this one:

  • Input strings are assumed to be of the form "1 2 3" etc.
  • To save a map call for converting the strings to numbers, I used regular expressions for the partitioning.
  • Implemented a little helper called tuple2Map for applying a function to both elements of a 2-tuple.
  • Used an active pattern for deciding which of the sums is greater.


module DailyChallengeTest

open FsUnit.Xunit
open Xunit
open DailyChallenge

let ``evens > odds``() =
    evenOrOdd "1 2" |> should equal "Even is greater than Odd"

let ``evens < odds``() =
    evenOrOdd "1 2 3" |> should equal "Odd is greater than Even"

let ``evens = odds``() =
    evenOrOdd "1 3 4" |> should equal "Even and Odd are the same"