let chars s =
let rec aux acc i =
if i < 0 then acc else aux (s.[i] :: acc) (i - 1) in
let f877 s =
let rec ccr acc col row = function
| [] -> acc
| c::cs when c = '\n' -> ccr ((c, col, row) :: acc) 0 (row + 1) cs
| c::cs -> ccr ((c, col, row) :: acc) (col + 1) row cs in
let with_pos cs
= List.rev
(ccr
[] 0 0 cs
) in let isspace c =
c = ' ' || c = '\x0c' || c = '\n' || c = '\r' || c = '\t' || c = '\x0b' in
let disp (c, col, row) =
if not (isspace c
) then Printf.printf
"[%c, %d, %d]\n" c col row
in List.iter disp
(with_pos
(chars s
)) let () = f877 "a b c\n\nd"
bGV0IGNoYXJzIHMgPQogIGxldCByZWMgYXV4IGFjYyBpID0KICAgIGlmIGkgPCAwIHRoZW4gYWNjIGVsc2UgYXV4IChzLltpXSA6OiBhY2MpIChpIC0gMSkgaW4KICBhdXggW10gKFN0cmluZy5sZW5ndGggcyAtIDEpCmxldCBmODc3IHMgPQogIGxldCByZWMgY2NyIGFjYyBjb2wgcm93ID0gZnVuY3Rpb24KICAgIHwgW10gLT4gYWNjCiAgICB8IGM6OmNzIHdoZW4gYyA9ICdcbicgLT4gY2NyICgoYywgY29sLCByb3cpIDo6IGFjYykgMCAocm93ICsgMSkgY3MKICAgIHwgYzo6Y3MgLT4gY2NyICgoYywgY29sLCByb3cpIDo6IGFjYykgKGNvbCArIDEpIHJvdyBjcyBpbgogIGxldCB3aXRoX3BvcyBjcyA9IExpc3QucmV2IChjY3IgW10gMCAwIGNzKSBpbgogIGxldCBpc3NwYWNlIGMgPQogIAljID0gJyAnIHx8IGMgPSAnXHgwYycgfHwgYyA9ICdcbicgfHwgYyA9ICdccicgfHwgYyA9ICdcdCcgfHwgYyA9ICdceDBiJyBpbgogIGxldCBkaXNwIChjLCBjb2wsIHJvdykgPQogICAgaWYgbm90IChpc3NwYWNlIGMpIHRoZW4gUHJpbnRmLnByaW50ZiAiWyVjLCAlZCwgJWRdXG4iIGMgY29sIHJvdyBpbgogIExpc3QuaXRlciBkaXNwICh3aXRoX3BvcyAoY2hhcnMgcykpCmxldCAoKSA9IGY4NzcgImEgYiBjXG5cbmQiCg==
[a, 0, 0]
[b, 2, 0]
[c, 4, 0]
[d, 0, 2]