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は面倒そうなので書きたくないです…