Skip to content

Instantly share code, notes, and snippets.

@SchlenkR
Last active August 15, 2019 18:07
Show Gist options
  • Save SchlenkR/e7b5e876b1716d484507e6bce59adf4d to your computer and use it in GitHub Desktop.
Save SchlenkR/e7b5e876b1716d484507e6bce59adf4d to your computer and use it in GitHub Desktop.
cata
// Grenzen?
let toRoman arabic =
let repeatChar char num =
List.init num id
|> List.fold (fun curr _ -> sprintf "%s%s" char curr) ""
let zehnerUndHöher = arabic / 10
let einer = arabic % 10
let fünfer = einer / 5
let einer = einer % 5
let einerChars = repeatChar "I" einer
let fünferChar = repeatChar "V" fünfer
let zehnerUndHöherChars = repeatChar "X" zehnerUndHöher
zehnerUndHöherChars + fünferChar + einerChars
let examples = [
1, "I"
2, "II"
3, "III"
4, "IIII"
5, "V"
6, "VI"
7, "VII"
8, "VIII"
9, "VIIII"
10, "X"
11, "XI"
12, "XII"
13, "XIII"
14, "XIIII"
15, "XV"
16, "XVI"
17, "XVII"
18, "XVIII"
19, "XVIIII"
20, "XX"
21, "XXI"
22, "XXII"
23, "XXIII"
24, "XXIIII"
25, "XXV"
]
let actual = [1..25] |> List.map (fun x -> x, toRoman x)
actual = examples
// Grenzen?
let toRoman arabic =
let ( ** ) char num =
List.init num id
|> List.fold (fun curr _ -> sprintf "%s%s" char curr) ""
let zehnerUndHöher = arabic / 10
let einer = arabic % 10
let fünfer = einer / 5
let einer = einer % 5
"X" ** zehnerUndHöher + "V" ** fünfer + "I" ** einer
let examples = [
1, "I"
2, "II"
3, "III"
4, "IIII"
5, "V"
6, "VI"
7, "VII"
8, "VIII"
9, "VIIII"
10, "X"
11, "XI"
12, "XII"
13, "XIII"
14, "XIIII"
15, "XV"
16, "XVI"
17, "XVII"
18, "XVIII"
19, "XVIIII"
20, "XX"
21, "XXI"
22, "XXII"
23, "XXIII"
24, "XXIIII"
25, "XXV"
]
let actual = [1..25] |> List.map (fun x -> x, toRoman x)
actual = examples
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment