キミならどう書く 2.0 - ROUND 2 - — Lightweight Language Ring
素直に.あってるか不安かも.
open ExtLib let g n = let rec g' a n = let g'' = g' (a+1) in match n with 1 -> a | n when n mod 2 = 0 -> g'' (n/2) | n -> g'' (3*n + 1) in g' 1 n let swap xs = let (a,b) = List.split xs in List.combine b a let h n = let gs = List.init n (fun x -> (x+1,g (x+1))) in let cmp a b = compare b a in snd (List.hd (List.sort ~cmp:cmp (swap gs)))
実行結果.
hawake:~$ rlwrap ocaml Objective Caml version 3.09.2 # #use "collazt.ml";; val g : int -> int = <fun> val swap : ('a * 'b) list -> ('b * 'a) list = <fun> val h : int -> int = <fun> # h 100;; - : int = 97 # h 10000;; - : int = 6171
h 100000とするとg 77671でintがオーバーフローしました.
Big_intを使えばなんとかなるはずですが,めんどくさいので省略.