結果

問題 No.334 門松ゲーム
ユーザー vain0vain0
提出日時 2016-01-16 15:29:00
言語 F#
(F# 4.0)
結果
AC  
実行時間 345 ms / 2,000 ms
コード長 1,197 bytes
コンパイル時間 7,817 ms
コンパイル使用メモリ 185,868 KB
実行使用メモリ 54,896 KB
最終ジャッジ日時 2024-09-19 19:59:45
合計ジャッジ時間 11,098 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 326 ms
36,156 KB
testcase_01 AC 66 ms
30,964 KB
testcase_02 AC 113 ms
45,944 KB
testcase_03 AC 323 ms
35,616 KB
testcase_04 AC 315 ms
35,756 KB
testcase_05 AC 324 ms
35,940 KB
testcase_06 AC 330 ms
40,212 KB
testcase_07 AC 95 ms
39,516 KB
testcase_08 AC 331 ms
38,892 KB
testcase_09 AC 86 ms
35,452 KB
testcase_10 AC 148 ms
54,896 KB
testcase_11 AC 345 ms
40,704 KB
testcase_12 AC 329 ms
36,904 KB
testcase_13 AC 330 ms
37,332 KB
testcase_14 AC 85 ms
34,932 KB
testcase_15 AC 335 ms
38,708 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
  復元対象のプロジェクトを決定しています...
  /home/judge/data/code/main.fsproj を復元しました (256 ms)。
MSBuild のバージョン 17.9.6+a4ecab324 (.NET)
  main -> /home/judge/data/code/bin/Release/net8.0/main.dll
  main -> /home/judge/data/code/bin/Release/net8.0/publish/

ソースコード

diff #

open System

let is_kadomatsu (x, y, z) =
    x <> y && y <> z
    && (x < y || y < z)
    && (x > y || y > z)

let erase_all_at is xs =
    [| for i in 0..(Array.length xs - 1) do
        if is |> Set.contains i |> not then yield xs.[i]
    |]

// 部分門松列の列挙
let enum_subkadomatsus (xs: _ []) =
    let n = xs.Length
    [ for i in 0..(n - 1) do
        for j in (i + 1)..(n - 1) do
          for k in (j + 1)..(n - 1) do
              if (xs.[i], xs.[j], xs.[k]) |> is_kadomatsu then
                let ys = xs |> erase_all_at (Set.ofList [i; j; k])
                yield ((i, j, k), ys)
    ]

// ある部分門松列を消して絶対に勝てるなら、それを返す
let rec fr_turn ks =
    enum_subkadomatsus ks
    |> List.tryFind (fun (i3, ks') ->
        en_turn ks'
        )

and en_turn ks =
    enum_subkadomatsus ks
    |> List.forall (fun ((x, y, z), ks') ->
        fr_turn ks' |> Option.isSome
        )

[<EntryPoint>]
let main _ =
  let _ = Console.ReadLine() |> int
  let ks = Console.ReadLine().Split(' ') |> Array.map int

  match fr_turn ks with
  | Some ((i, j, k), _) ->
      printfn "%d %d %d" i j k
  | None ->
      printfn "-1"

  //exit code
  0
0