Skip to content

Instantly share code, notes, and snippets.

@tokland
Created June 27, 2018 21:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tokland/1528bd1f7b93510c9dd4788e32150f88 to your computer and use it in GitHub Desktop.
Save tokland/1528bd1f7b93510c9dd4788e32150f88 to your computer and use it in GitHub Desktop.
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