読者です 読者をやめる 読者になる 読者になる

OCamlで第10回JOI予選問題を解いてみた

最近OCamlはじめました。情オリ前なのに…(こんな暇な事をしている暇は無い、はずなのだけど…)
OCamlという物の雰囲気の参考にでもしていただければ幸いです。詳しい人からのツッコみお待ちしています。

問題1: 合計時間

let rec get_times n =
        if n > 0 then
                (Scanf.scanf "%d\n" (fun x -> x))::(get_times (n - 1))
        else
                []
in let total = List.fold_left (+) 0 (get_times 4)
in Printf.printf "%d\n%d\n" (total / 60) (total mod 60)

問題2: 指輪

let solve needle n =
        let rec get_rings n =
                if n > 0 then
                        (Scanf.scanf "%s\n" (fun s -> s))::(get_rings (n - 1))
                else []
        and f n s = 
                let t = s ^ s ^ s and compiled = Str.regexp_string needle
                in try (Str.search_forward compiled t 0; n + 1)
                with Not_found -> n
        in Printf.printf "%d\n" (List.fold_left f 0 (get_rings n))
in Scanf.scanf "%s\n%d\n" solve

問題3: タイル

let solve n k =
        let colour x y = 
                let x' = if x > n / 2 then n - x + 1 else x
                and y' = if y > n / 2 then n - y + 1 else y
                in ((min x' y') - 1) mod 3 + 1
        in for i = 1 to k do
                Printf.printf "%d\n" (Scanf.scanf "%d %d\n" colour)
        done
in Scanf.scanf "%d\n%d\n" solve

4, 6は実は未だによく分かってなくて、5は面倒そうなので書きたくないです…