キミならどう書く 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を使えばなんとかなるはずですが,めんどくさいので省略.