нубский вопрос о чтении целочисленных / строковых входов в OCaml - PullRequest
0 голосов
/ 16 апреля 2019

Я пытался решить проблему с программированием в Hackerank, и мне было интересно, как читать строку целых чисел, разделенных пробелом, используя OCaml. Я знаю, если входные целые числа разделены символом новой строки, тогда мы могли бы сделать

let recread_lines () =
    try line = read_line ()
    in line:: read_lines()
with End_of_file->[]

, а затем преобразовать список в список int, используя

let ()= 
let input = read_lines () 
in List.map int_of_string input.

Я также знаю, что мы можем прочитать первое целое число из строки целых чисел, выполнив:

let n1 =Scanf.scanf " %d" (fun x -> x)

Из C я знаю, что метод scanf сканирует строку в поисках структуры, определенной в параметре, а затем сохраняет отсканированные значения в переменных. Я не вижу использования (fun x-> x) в конце метода scanf в OCaml.

Я не знаю, как читать строку целых чисел, поэтому, если вы укажете мне правильное направление, я смогу решить эти проблемы!

1 Ответ

0 голосов
/ 16 апреля 2019

Вот функция для чтения строки разделенных пробелом целых чисел из stdin:

let read_ints () =
    let line = read_line () in
    let ints = Str.split (Str.regexp "  *") line in
    List.map int_of_string ints

Эта функция вызовет End_of_file, если на входе больше нет строк.

Вы можете адаптировать регулярное выражение, если на самом деле есть табуляции, смешанные с пробелами (скажем).

(FWIW За многие годы я обнаружил, что семейство функций scanf склонно вести себя плохо при неожиданном вводе. Это не проблема, в частности, для OCaml, она одинакова для всех языков, которые имеют scanf. Так что я не использовал scanf уже несколько десятилетий.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...