TechFULの中の人

TechFULスタッフ・エンジニアによる技術ブログ。IT関連のことやTechFULコーディングバトルの超難問の深掘り・解説などを紹介

TechFUL の得点システムを知る

こんにちは、普段はTCBやチャレンジ問題などの上級問題を主に作っている作問担当者の1人です。
今回は、TechFUL上で問題を解いたときに得られる「スコア」について、噛み砕いた説明をしていこうと思います。「スコア」は、毎月開催されるガチコンテストの TechFUL Coding Battle(TCB)での順位決めに使われたり、チャレンジ問題のランキング(週間/総合)にも使われていますので、これらに参加される方には知っておくとよい記事になると思います。

実は、スコアの決まり方はこちらに掲載されていますが、複雑であまり読む気にならない...とか、よく分からないとかで、いまいち詳細に理解されている方は少ないのではないでしょうか?

点数の付け方

(注記:この記事はリンク先の計算式に準拠して解説するものではなく、分かりやすさのため変形、解釈した説明となっています。また、スコアの計算には小数が現れる場合がありますが、この記事では小数点以下の処理については割愛させていただきます。)

満点

まずは、TechFULの問題で満点、つまりその問題から得られる最高の点数を見ていきましょう。

ひとつの結論から述べると、各問題で得られる満点は(その問題の難易度)*22点です。例えば、難易度5の問題なら、最高で5*22=110点が得られるということになります。その満点を取るには、基本的には

  • (問題の難易度*3)分以内に (例えば、難易度5の問題なら15分以内に)
  • 1回の提出で
  • 10個全てのテストケースに正解する

ことが要求されます。満点を取るだけなら、以上のことを覚えておくだけで十分です。

詳細な解説

各問題の満点は(その問題の難易度)*22点ですが、その22という値は以下の比率で割り振られています。
実際の得点と区別するために、この22という値を「22ポイント」と呼ぶことにして、点数の比率を説明する際には「ポイント」という単位を使うことにします。

  1. テストケースごとの点 10ポイント
  2. 合格(全ケース正解)点 5ポイント
  3. 時間点 7ポイント
テストケースごとの点

各テストケースに正解すると1ポイントです。ひとつの問題にはテストケースが10個存在するので*1、合計で10ポイントとなっています。

合格点

全てのテストケースに正解すると、上の10ポイントに追加で5ポイントです。

時間点

問題を開いてから短い時間で正解すると、追加で最大7ポイントが与えられます。このポイントは(問題の難易度*3)分経過して以降*2一次関数的に徐々に減少していき、最終的に(問題の難易度*10)分でゼロになります。


以上から、いくつかのテストケースに正解するだけでもある程度の点は貰えることがわかりますが、一方で全てのテストケースに正解した場合のみに得られる点のウェイトがかなり大きいことがうかがえます。つまり、高得点を狙うには、全てのテストケースに正解することが重要だといえるでしょう。

さらに、以上をもとにした得点に、その問題への不正解のコード(全てのテストケースに正解しているわけではないコード)の提出回数に応じてペナルティがかかります。ペナルティは、1回不正解を提出するたびに最終的な得点が0.9倍になる...という形です。つまり、1度不正解すれば得点は90%、2度ならば81%...10度なら約35%という風に減っていきます。(毎回10%引かれて、10回でゼロになる...というような仕組みではありません。)

TCBで上位に入るために

この項では、TechFUL Coding Battle で少しでもより高い順位を取るために、気をつけていると役立つかもしれない立ち回りや事項について話していこうと思います。

最初に問題を全部開かない

たまに、コンテストに参加する際に最初にすべての問題を開いてしまう参加者がいるようですが、これは「時間点」の面で大損となってしまいますので注意しましょう。

最初の2問は急ぎ気味に

普段のTCBにおいて、最初の2問は難易度1となっています。したがって、この問題で時間点を含めた満点を取るためには、3分以内で正解する必要があります。この位置の問題でもたまに問題文が長かったり少し複雑な内容だったりする場合がありますので、少し急ぎ目に解かないと上級者でも3分をオーバーしてしまう場合があるでしょう。(ただし、ペナルティを出してしまうと目も当てられないので、最低限の慎重さは持って!)また、次の2問も難易度2となっており、満点のためには6分で正解する必要があるので、人によっては気をつけた方がいいかもしれません。

時間が経ち過ぎたら次を開いてもいい

時間点は問題の難易度*10分でゼロになってしまいます。ですが、これは裏を返せば、それだけの時間が経過してしまえば、その問題を一旦パスして次の問題を始めてしまってもよくなるということです。つまり、かならず前の問題を解き終えてしまわないと次の問題を開けてはいけないというわけではないということです。

完数をひっくり返す

最近のTCBでは、9,10問目の上級問題にかなり難易度の高い出題が多く、回によってはかなりの上級者でも10問目に苦戦するということも多々あります。これによって、参加者が後半の問題から得ている点数が、上位に至ってもかなり少なくなってしまう場合があります。そこを突いて、もし8or9問目までを素早くかつ正確に解く、そして10問目が分からなくとも一部のテストケースに正解することを狙ったコードを書くことができれば、全ての問題を正解している参加者より上位につけることもありえるでしょう。実際、過去のTCBでは、10問目を正解していない参加者が1位になった回も存在するようです。

おわりに

というわけで、今回は TechFUL の得点システムについて解説させていただきました。この記事を読むことが、どんなことに気をつけて TechFUL の問題を解くべきかを意識したり、より高い得点を取るためにどのように立ち回るかを考えながら TCB に参加できる一助となれば幸いです。最後までお読みいただきありがとうございました。

*1:まれにテストケースが10個存在しない問題が存在しています。その場合でも、テストケースごとの点の合計は10に相当するようになっています。

*2:実際には問題の難易度ではなく目標解答時間という値を使って計算されますが、基本的には目標解答時間は問題の難易度の値のみに基づいて設定されているので、このように説明しています。