Skip to content

誤差ジャッジの不具合 #119

Description

@riantkb

誤差ジャッジに以下の不具合があるように思われます。

  • 想定出力が小数で提出の出力が整数の場合に WA と判定される
    • 例:想定出力が 2.0、提出の出力が 2 だった場合に WA となる
  • 想定解が小数で 0.0 の場合に WA と判定される

原因としては、以下の関数に不備があると思っています

func compareValue(answer string, solution string, accuracy float64) bool {
_, err := strconv.Atoi(solution)
if err == nil || err.(*strconv.NumError).Err == strconv.ErrRange {
return answer == solution
}
numberC, err := strconv.ParseFloat(solution, 64)
if err == nil {
numberA, err := strconv.ParseFloat(answer, 64)
return err == nil && math.Abs((numberC-numberA)/numberC) <= accuracy
}
return answer == solution
}

  • 提出解の出力が整数にパースできてしまう場合、文字列比較をしてしまうので、想定解が小数で提出解が整数の場合に WA と判定されているのだと思っています。
    • 想定出力と提出解の出力が共に整数にパースできるときのみ文字列比較、で基本的には問題なさそうなのですが、厳密には想定解が 1000000000、提出解が 1000000001 で誤差ジャッジをしたい時に困るかもしれないです(そんなことはなさそうですが)
  • math.Abs((numberC-numberA)/numberC) <= accuracy で提出解の出力が 0.0 の時に NaN が発生し常に false となるので、想定解が小数で 0.0 の場合に 0.0 と出力すると WA と判定されるのだと思っています。
    • そもそも相対誤差だと 0.0 が解のときに誤差許容を行うことができないので、絶対誤差もしくは相対誤差が x 以下、とすべきなのかもしれません

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions