Продолжаю свои упражнения на codingame, где тренируюсь в программировании на OCaml. В этот раз столкнулся с нехваткой нужных библиотек в составе компилятора на площадке.
Тут стоит сказать, что стандартная библиотека OCaml очень маленькая, и писать код, используя только её, никому в голову не приходит. Одна из популярных - переписанная Core программистами из jane street. Этим OCaml сильно отличается от питона, у которого стандартная библиотека просто огромна, а на codingame сверху установлен numpy.
В задаче про поиск температуры, ближайшей к нулю - Temperatures, нужно было взять строку из stdin и разделить её на числа. Вот только в стандартной библиотеке такого функционала нет. То, что там нет Core меня расстроило. Первой мыслью было отказаться от OCaml и либо перейти на Python3 либо вообще забросить codingame. Второй мыслью было, сделать необходимый функционал самому, задача не особо трудная.
Сделал.
Само собой, что такой код в реальный продакшн я бы не послал, хотя бы из-за того, что у меня списки конкатенируются, что каждый раз создаёт новые. И не факт, что функция хорошо будет работать на граничных случаях или корректно обработает два разделителя подряд. Однако мне она позволила решить задачу, а на игровой площадке мне пока большего не нужно.
let split delimiter str = let max = String.length str in let rec _split str i lst = if i < max then let ch = String.get str i in if ch = delimiter then (String.concat "" lst) :: (_split str (i + 1) []) else _split str (i + 1) (lst @ [String.make 1 ch]) else [String.concat "" lst] in _split str 0 [] ;;
Публикую только функцию, а не всё решение. Вроде по правилам решение публиковать нельзя.
P.S. После публикации посмотрел решения других людей и увидел использование Scanf.scanf
, чтобы получить список чисел.
let get_int () = Scanf.scanf " %d" (fun x -> x);; let rec get_ints = function | 0 -> [] | n -> get_int () :: get_ints (n - 1) ;; let () = get_ints 3 |> List.map string_of_int |> String.concat " " |> print_endline ;;
Это то, чего я не смог сделать сам, хотя пробовал несколько способов. Кстати, этот код сохраняет список в обратном порядке, что стоит помнить, если порядок имеет значение.
Жаль, что с каждым решённым заданием, список чужих решений всё короче (в этот раз - 9). Интересно, как много решений на Haskell?