Help us understand the problem. What is going on with this article?

第13回オフラインリアルタイムどう書くの参考問題をF#で

More than 5 years have passed since last update.

問題は「増やす減らす二倍する」

ダイクストラ法もどき。副作用を使った書き方を勉強したので2時間以上かかった。
(追記)どうせmutableなら.NETのコレクションを使うことにする。

doukaku13pre.fs
open System.Collections.Generic

let tree = List<_>([[0]])
let set = new HashSet<int>()

let rec find i x =
  let current =
    if i < tree.Count then
      tree.[i]
    else
      let next =
        tree.[tree.Count - 1]
        |> List.collect (fun x -> [x+1; x-1; x*2])
        |> List.filter (fun x -> (x >= 0) && set.Add(x))
      tree.Add(next)
      next
  if List.exists ((=) x) current then i else find (i+1) x

let solve s = (string)(find 0 ((int)s))

(* for test *)

type TestResult = Success | Failure

let test target expected =
  let actual = solve target
  printfn "%A" (if expected = actual then Success else Failure)

[<EntryPoint>]
let main args =
  test "59" "9"
  test "10" "5"
  test "11" "6"
  test "12" "5"
  test "13" "6"
  test "14" "6"
  test "15" "6"
  test "16" "5"
  test "17" "6"
  test "18" "6"
  test "27" "8"
  test "28" "7"
  test "29" "8"
  test "30" "7"
  test "31" "7"
  test "32" "6"
  test "33" "7"
  test "34" "7"
  test "35" "8"
  test "41" "8"
  test "71" "9"
  test "1023" "12"
  test "1024" "11"
  test "1025" "12"
  test "1707" "17"
  test "683" "15"
  test "123" "10"
  test "187" "11"
  test "237" "12"
  test "5267" "18"
  test "6737" "18"
  test "14796" "20"
  test "18998" "20"
  test "23820" "20"
  test "30380" "21"
  test "31119" "21"
  test "33301" "20"
  test "33967" "21"
  test "35443" "22"
  test "35641" "22"
  test "43695" "23"
  test "44395" "23"
  test "44666" "22"
  test "987" "14"
  test "1021" "13"
  test "1019" "13"
  test "1015" "13"
  test "1007" "13"
  test "1011" "14"
  test "1003" "14"
  test "983" "14"
  test "999" "14"
  test "2731" "18"
  test "6827" "20"
  test "10923" "21"
  test "27307" "23"
  test "43691" "24"
  test "109227" "26"
  test "174763" "27"
  0
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away