読者です 読者をやめる 読者になる 読者になる

(書きかけ)TopCoderの設定記録(Windows)

topcoder 競プロ一般

主に自分用。(書きかけなのに公開するなという話もある)
WindowsTopCoder環境を整える。

面倒な人へ

完成品が僕のgithub上にあげてあります。 topcoderアカウントの取得とjavaのインストールをした後、!TopCoder起動から立ち上げて、

  • Options->Editor->Common Class Pass
  • Options->Editor->Greed2のClass Pass
  • Options->Editor->Greed2のClass Pass
  • Options->Editor->Greed2のConfigure->Workspace

  • work/greed.confのexecute =の部分のパス

の計5か所のパスを指定しなおしてやれば使えるはずです。たぶん。

javaアプレットの用意

まずはjavaのインストールと、ContestAppletProd.jnlpjavaアプレットの本体)の入手をなんとかやります。(雑)
この時、こんな風にディレクトリを設置すると良いです。

絶対パス表記して、全角やスペースがないパス
└─ topcoder
     ├─ ContestAppletProd.jnlp
     └─ work
         ├─ Greed-2.0-RC-7.1.0.jar
         └─ 色々

その後、
javaの構成->セキュリティ->例外サイトリストの編集
から例外サイトにhttp://www.topcoder.comを追加。
ContestAppletProd.jnlpを開いて、下の画面が出れば成功。

f:id:eiya5498513:20170313170731p:plain

Greedを入れる

このままだと使いづらいので次は、Greedというプラグインを入れることを試みます。

参考:topcoderのSRMでGreedに乗り換え : 備忘録 - 裏紙

上のページに従えばプラグインを入れること自体は出来ました。(雑) ただし、Configureの部分は、/xxxx/yyyy/topcoder/SRMでなく、先ほど作ったworkフォルダへのパスにしておいてください。

Greedのカスタマイズ

ここからVS2017で使うために僕流の設定をしていきます。 目指すのは

です。

基本的に下のページに従っていきますが、これはLinux用みたいなので、一部変えていきます。
参考:TopCoder の強欲プラグイン、Greed を使う! - Qiita

Greed のカスタマイズ

greed.confを以下のようにします。解説は後。

greed.codeRoot = "${Contest.Name}"

greed.shared.templateDef.problem-desc {
  options {
    theme = darkgray
    gridArrays = true
  }
}
greed.language.cpp {
  longIntTypeName = int64_t
  templateDef {
    source.templateFile = template.cpp
    filetest.templateFile = tester.cpp
    script {
      overwrite = skip
      outputFile = "${Problem.Name}.script"
      templateFile = template.cpp
      afterFileGen {
        execute = "/CP_MAIN/topcoder/work/afterFileGen.bat"
        arguments = [ "${"Problem.Name"}", "${"Contest.Name"}" ]
      }
    }
  }
  templates = [ filetest, source, problem-desc, script ]
}

細かい解説は参考ページの方を見てください。

  • greed.codeRoot
    問題のhtmlやソースの出力フォルダです。デフォルトなので、書かなくても良いです。
  • greed.shared.templateDef.problem-desc
    出力する問題文のhtmlのデザイン設定です。
  • greed.language.cpp.longIntTypeName
    問題にlong longが出てきた場合のlong longの型名。(typedefは別に必要)
    LLにする人が多いと思う。
  • greed.language.cpp.templateDef.source.templateFile
    ソースコードのテンプレです。(後述)
  • greed.language.cpp.templateDef.filetest.templateFile
    テストコードのテンプレです。(後述)
  • greed.language.cpp.templateDef.script.overwrite
    skipを指定すると、問題を再度開いたときに、ソースを初期化しないようになります。
    backupを指定すると、今までのソースはバックアップされ、新しいソースが生成されます。
    skipでもhtmlを開きなおしたり、コンパイルする問題を変更したりする手間はどちらにせよかかるので、一長一短。
  • greed.language.cpp.templateDef.script.outputFile
    とりあえず問題名に依存する何かを書いておけば良いと思います。問題を既に開いたかのチェックに流用するので。
  • greed.language.cpp.templateDef.script.templateFile
    適当に存在するファイルを書いておけば良さそう。(理解していない)
  • greed.language.cpp.templateDef.script.afterFileGen.execute/arguments
    後で説明します。

ソースコードのテンプレ

こちらは実はいじらなくても良いのですが、一応僕のファイルを載せておきます。

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <queue>
#include <stack>
#include <array>
#include <deque>
#include <algorithm>
#include <utility>
#include <cstdint>
#include <functional>
#include <iomanip>
#include <numeric>
#include <sstream>

using std::string;
using std::vector;

${<if Problem.Description.Modulo}
  static constexpr int64_t MOD = ${Problem.Description.Modulo};
${<end}

struct ${ClassName} {
${<foreach Method.Params p}
  ${p.Type} ${p.Name};
${<end}
  ${Method.ReturnType} ${Method.Name}(${foreach Method.Params p , }${p.Type} ${p.Name}_${end}) {
    ${foreach Method.Params p , }${p.Name} = std::move(${p.Name}_)${end};
    return ${Method.ReturnType;zeroval};
  }
};

${CutBegin}
${<TestCode}
${CutEnd}

始めのincludeは片っ端から詰め込んだだけです。
using~ですが、using namespace std;で良いです。
僕は使いたくない派なのですが、Greedで生成されるテンプレで、stringやvectorが出てきてしまうのでこの二つはusingしています。
その次の良く分からないMODのようなものは、Greedが問題でMODが必要と認識してくれた場合に、有効になるようです。どうも完全ではないようですが。
あと、説明はしませんがこのテンプレでは、関数の引数をクラスのメンバ変数にmoveする式も埋め込んでいます。メモ化再帰やdfsを使うときなど、引数にとらずに参照できると便利なことも多いので。使えばわかると思います。

テストコードのテンプレ

こちらはいじらないと、VS2017でCE起こします。原因はstd::data::dataの競合です。using namespace std;許すまじ。
コンパイルできるようにカスタマイズすればなんでも良いんですが、面倒な人は僕のファイル(work/template.cpp)を使ってください。

afterFileGen

一通りファイルを生成した後の処理を書きます。外部プログラムの呼び出しなので、非常に自由度が高いです。

  • execute

<ここから書きかけ>

まずはVisual Studioのプロジェクトを適当な場所に作成します。 「ソリューションのディレクトリを作成」は外して「Win32コンソール」を「空のプロジェクト」で作成してください。 その後、

  • *.sln
  • *.vcxproj
  • *.vcxproj.filters

をworkにコピーします。 その後適当にSource.cppを作成し、プロジェクトに追加してください。