Sometimes you write code you’re just not super happy with.
The Diamond Kata is a simple kata to take a single character parameter, and return a “diamond” shaped string. Examples:
diamond 'A';; val it : string = "A" diamond 'B';; val it : string = " A B B A " diamond 'C';; val it : string = " A B B C C B B A " etc;;
That’s how I describe this Kata I was working on. I’m just not super happy with it. It feels wordy, and a bit inelegant. Still, it does work (as long as you pass a character ‘greater’ than upper case A. I should probably enforce that sometime… but for now, here it is.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
open System | |
let diamond char = | |
let chars = [ 'A' .. char ] | |
let numberOfChars = List.length chars | |
let padCount i = numberOfChars – (i + 1) | |
let gridWidth = numberOfChars * 2 – 1 | |
let pad i = new string (' ', i) | |
let init = chars |> List.mapi (fun i c -> (string c), (padCount i)) | |
let all = init @ (List.tail (List.rev init)) | |
let makeLine (str,padCount) = | |
match gridWidth – (padCount * 2 + 1) with | |
| 0 -> pad padCount + str + pad padCount | |
| a -> pad padCount + str + pad (a – 1) + str + pad padCount | |
all |> List.map makeLine | |
|> List.reduce (fun x y -> sprintf "%s%s%s" x Environment.NewLine y) |