let visited = Hashtbl.create 200000 let rec walk x y = let addDigits number = let rec sumInner n soFar = match n with | x when x<10 -> soFar+x | x -> sumInner (n/10) (soFar + n mod 10) in sumInner number 0 in let rec innerWalk x y totalPoints = match Hashtbl.mem visited (x,y) with | true -> totalPoints | _ -> begin Printf.printf "%d,%d\n" x y ; Hashtbl.add visited (x,y) 1 ; let digitSum = (addDigits x) + (addDigits y) in match digitSum with | n when n>25 -> totalPoints | n -> List.fold_left (fun total (dx,dy) -> total + walk (x+dx) (y+dy)) (totalPoints+1) [(1,0);(-1,0);(0,1);(0,-1)] end in innerWalk x y 0 let _ = Printf.printf "Points: %d\n" (walk 1000 1000)