피타고라스의 창 >> 타자 타율이 0.334면, 타자는 최소 287타수가 필요하다는 사실의 증명.
재밌는 문제가 보여서 풀어보았다.
타자 타율이 0.334면, 타자는 최소 몇 타석이 필요한가? (TAOCP에 나온 문제라고 함)
a타수 b안타의 타율이 b/a이므로, 반올림 해서 0.334의 타율이 되려면, a와 b가 0.334 <= b/a < 0.3345를 만족해야 한다. 이를 만족하는 최소 자연수 a를 찾으면 된다.
아래는 Ocaml 코드.
-
let c1 = 1000.0 /. 334.0 in
-
let c2 = 10000.0 /. 3345.0 in
-
let rec range i j = if i > j then [] else i :: (range (i+1) j) in
-
let min_int_between i1 i2 =
-
let minv,maxv = min i1 i2, max i1 i2 in
-
match compare minv maxv with
-
-1 -> if maxv - minv > 1 then Some (minv+1) else None
-
| _ -> None
-
in
-
let hit a b = (float b) /. (|>float a) in
-
let blist = range 0 200 in
-
let aoptlist = List.map (fun b ->
-
let f1,f2 = c1 *. (|>float b), c2 *. (|>float b) in
-
let i1,i2 = (truncate (ceil f1)), (truncate f2) in
-
(b,min_int_between i1 i2)) blist
-
in
-
List.iter (fun (b,aopt) ->
-
match aopt with
-
None -> ()
-
| Some a -> Printf.printf "%d/%d %f\n" b a (hit a b)) aoptlist;;
아래는 결과.
96/287 0.334495
97/290 0.334483
98/293 0.334471
99/296 0.334459
100/299 0.334448
즉, 적어도 287타수는 해야 0.334의 타율을 얻을 수 있다. 저 블로그의 내용을 보면 연분수 전개라는 방법이 있다는데 뭔지는 모르겠다. 아예 이름이 생소한데, 학교에서 배운 적은 없는 것 같다..


연분수 전개 어떻게 하는 지는 모르겠지만, 간단한 연분수라면 아마도 수열비슷해서 미지수 놓고 푼 거 배운 것 같아..