hogecoder

tsutaj 競技プログラミングの記録

Online Judge Template Generator で std::endl を使わないようにする

このツール使ってる人なら既にやってるひと多そうだけど一応

概要

Online Judge Template Generator で普通にテンプレートを出力させると std::endl を利用したものが出力されるが、こどふぉ等で出力 TLE になる可能性があるのでできれば使用を避けたい。

printf を使用するようなオプションもあるが _get_base_type_format_specifier の実装を見ると、string 型に対応していないことが分かる。真面目にテンプレを書けば対処はできるがちょっとめんどくさい。

以上を踏まえてちょっと妥協した感じの対処法を書きます。

TL; DR

  • std::endl ではなく const char newl = '\n'; を使う
  • 出力方法を自分で定義したテンプレートを使うようにする

ちなみに newl という命名は beet さんのテンプレをリスペクトしています。

テンプレ

テンプレの冒頭にこれを書くと std::endl ではなく newl が出るようになる。(私は using namespace std; する人なので、それ用の設定も混じっていますが、適宜変えてください)

<%!
    import onlinejudge_template.generator.cplusplus as cplusplus
    import onlinejudge_template.generator.about as about
    from typing import List
    def newl_output(exprs: List[str], *, newline: bool) -> List[str]:
        items = ["cout"]
        for i, (expr, _) in enumerate(exprs):
            if i: items.append("' '")
            items.append(expr)
        if newline:
            items.append("newl")
        return [" << ".join(items) + ";"]
%>\
<%
    data['config']['printer'] = newl_output
    data['config']['using_namespace_std'] = True
%>\

get_base_type_format_specifier に準ずるものを自分で書けば、scanf, printf に対応させることも可能だと思います。やりたい人はやるとよいです。