Created
June 27, 2018 21:48
-
-
Save tokland/1528bd1f7b93510c9dd4788e32150f88 to your computer and use it in GitHub Desktop.
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
module StringMap = Map.Make({ type t = string; let compare = compare; }); | |
let mapFromList = (pairs: list((string, 'a))): StringMap.t('a) => | |
List.fold_left((map, (k, v)) => StringMap.add(k, v, map), StringMap.empty, pairs); | |
let mapGet = (key: string, defaultValue: 'a, mapping: StringMap.t('a)): 'a => | |
switch (StringMap.find(key, mapping)) { | |
| exception Not_found => defaultValue | |
| value => value | |
}; | |
let rec range = (start: int, end_: int): list(int) => | |
start >= end_ ? [] : [start, ...range(start + 1, end_)]; | |
let charRange = (start: char, length: int): list(char) => | |
range(Char.code(start), Char.code(start) + length) |> List.map(Char.chr); | |
let cartesian = (xs: list('a), ys: list('b)): list(('a, 'b)) => | |
xs |> List.map(x => ys |> List.map(y => (x, y))) |> List.flatten; | |
let codeFromCoordinate = (codesContents: string, coordinate: string): string => { | |
let codes = codesContents | |
|> Js.String.trim | |
|> Js.String.split("\n") | |
|> Array.to_list | |
|> List.map(row => row |> Js.String.split(" ") |> Array.to_list); | |
let nRows = List.length(codes); | |
let nColumns = List.length(List.hd(codes)); | |
let coordinates = cartesian(charRange('A', nColumns), range(1, nRows + 1)) | |
|> List.map(((column, row)) => Char.escaped(column) ++ string_of_int(row)); | |
let mapping = codes |> List.flatten |> List.combine(coordinates) |> mapFromList; | |
let upperCoordinate = Js.String.toUpperCase(coordinate); | |
mapGet(upperCoordinate, "No code for coordinate " ++ upperCoordinate, mapping); | |
}; | |
let main = () => { | |
let codes = Node.Fs.readFileAsUtf8Sync("codes.txt"); | |
Js.log(codeFromCoordinate(codes, Sys.argv[2])); | |
}; | |
main(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment