ユーザーブロマガは2021年10月7日(予定)をもちましてサービスを終了します

  • AtCoder解答用テンプレートこうしてます

    2018-07-29 21:51

    下のコードは、"AtCoder Beginner Contest 103" のC問題のサンプルケースに対する解を求めるためのものです。

    from atcoder import output_format

    @output_format
    def c_modulo_summation():
      N = int(input())
      A = [int(i) for i in input().split()]
      return sum(A) - N

    if __name__ == '__main__':
      import io
      import os
      import pathlib
      import sys
      import textwrap
      os.chdir(pathlib.Path(__file__).parent.resolve())

      for INPUT in [
        """
        3
        3 4 6
        """,
        """
        5
        7 46 11 20 11
        """,
        """
        7
        994 518 941 851 647 2 581
        """
      ]:
        sys.stdin = io.StringIO(textwrap.dedent(INPUT).strip())
        print(c_modulo_summation())

    atcoder.py

    def output_format(func, cnt=1):
      def wrapper(*args, **kwargs):
        import time
        nonlocal cnt
        q_num = func.__name__[0].upper()
        start = time.perf_counter()
        ans = func(*args, **kwargs)
        elapse = round((time.perf_counter() - start) * 1000, 3)
        is_in_newline = ('', '↓“\n')[int(type(ans) is str and '\n' in ans)]
        if ans is not None:
          res = f'{q_num}-{cnt}({elapse:07.2f}ms): {is_in_newline}{ans}'
        else:
          res = f'{q_num}-{cnt} X'
        cnt += 1
        return res
      return wrapper

    以下の点が特徴です。

    1. 解答を関数の中に書いている
    2. 入力を別ファイルに書いておかず、解答と同一ファイルに書いている (文字列をテキストストリームに変換している)
    3. 標準入力から受け取る変数は先頭を大文字にしている

    こうしている理由は、個人的に次のような感覚を持っているからです。

    1. 「解が複数あるときはそのうち1つを出力すればよい」場合、解が1つ見つかればそれを即座に返り値にすればいい (解を出力して sys.exit() でも構わないが…)
    2. サンプルの内容を確認するためにいちいち他のファイルを開きたくない
    3. 「制約を満たしているかまだ確認していない」入力はそうだとわかるようにしておきたい (AtCoder の問題では気にする必要はないが)

    また、デコレータを使って次のようなこともしています。

    • 「関数を実行するのに要した時間はどれくらいか」を表示する (入力例に対してすらすごく時間がかかる書き方をしている場合があるため)
    • 「何番の入力例に対する出力なのか」も出力する (確認しやすい)
    • 「1行の出力は所要時間の表示と同じ行に表示するが、複数行に渡る出力は実行時間の表示の次の行から表示する」ようにしている (見やすい)
  • 広告
  • Visual Studio Code で"$"を打ち込むと"$$"で閉じてほしいとき

    2018-06-25 18:34

    VSCodeを使ってhtmlファイルを編集しているときに"$"を入力すると、"$$"と入力されたあと、2つの$の真ん中にキーが移動してほしい(カッコを入力したときと同じように)。

    なぜかというと、MathJaxを利用してLaTeXコマンドによって数式を記述しているのだけれど、インラインで数式を表示させたいときに"$$" or "\(\)" で数式を囲んでいるから。いちいちドルマーク2回打ち込んでその間に移動させるの面倒だし。

    というわけで、タイトルの内容を実現させるために調べた結果を書く。こうすればいいはず。

    1. */VSCode/resources/app/extentions/ (*はVSCodeをインストールした場所)の下にある"html"ディレクトリを ~/.vscode/extensions/ の下にコピー
    2. ~/.vscode/extensions/html/language-configuration.json を開き、"autoClosingPairs"に以下の内容を追加
      { "open": "$", "close": "$"}
    3. 文章を選択して"$"を入力したとき、選択した文章の前後に"$"を追加したい場合は、"surroundingPairs"に以下の内容を追加
      { "open": "$", "close": "$"}

    これで所望の結果が得られた。設定を.vscodeの方に移すことで、設定のエクスポートもやりやすくなると思う。

    別の文字で同じことをしたい場合も、上のやり方でできる。ただし、「"\("を入力すると"\)"で閉じる」ことは無理っぽい。1文字しか無理なのかな?


  • スプラトゥーンのメトリクス

    2018-01-20 20:27
    「このイカは立ち回りが上手い」ということをもっと分解して分析できないものか? と思う。K/Dやヌリ面積だけでは洗い出せない上手い人の上手さをなんとかして定量化したい。

    a) 公式に提示されている指標
    1. たおした(アシスト) and やられた
    この値をそのまま指標とすることはなく、なんらかの計算に使うことになる。

    2.ヌリ面積
    この値の大小と勝率とに相関は見られるだろう。それ以上はわかっていない。

    4月25日のアップデートより追加された指標
    (「最近」と「最近50マッチ」の2種類があるが、前者は集計する試合回数が違うのか?)
    3. 対戦全体に関わる指標
    3-1. 最も使っているブキ
    3-2. 最も倒されているブキ
    3-3. 勝率が最も高いルール
    3-4. 勝率が最も高いステージ
    3-5. 1回倒されてから再度倒されるまでに連続して相手を倒した回数
    3-6. 1分あたりナワバリマップを開いた回数

    3-7. 1分あたりナワバリマップを見ている時間 [秒]
    3-8. スペシャルが満タンの状態でやられた回数
    3-9. 「インク不足!」と表示された回数
    3-10. インクを放った量(インクタンク換算)
    3-11. 1分あたりセンプクしていた時間 [秒]
    3-12. 連続でセンプクしていた最長時間 [秒]
    3-13. 1分あたりサブウェポンを使用した回数
    3-14. 1試合でサブウェポンを使用した最大回数
    3-15. 落下数が最も多いステージ
    3-16. 落下数

    4. 各種ルールにおける指標
    4-1. ナワバリバトルのラスト30秒でたおした数の平均とやられた数の平均
    4-2. ガチエリア内でたおした数と倒された数
    4-3. (ガチヤグラに関する指標。未確認)
    4-4. ガチホコを持った回数、進めたカウント、自分でノックアウトした回数
    4-5. ガチアサリで1試合あたり平均アサリ取得数とガチアサリ作成数
    4-6. バイトに行った回数(総計)
    4-7. (各種敵をたおした数が出るらしい)
    4-8. 最も倒された敵
    4-9. 最も多く取ったときのイクラと金イクラの数
    4-10. 1試合あたり仲間を助けた数と仲間に助けられた数

    5. 各ブキごとの指標
    シューター:最も使用したシューター系ブキの名前と、1分間あたりの射撃数
    ローラー:最も使用したローラー系ブキの名前と、タテ振りとヨコ振りの比率 [%]
    チャージャー:最も使用したチャージャー系ブキの名前と、フルチャージのヒット率 [%]
    マニューバー:最も使用したマニューバー系ブキの名前と、1分あたりのスライド回数
    シェルター:最も使用したシェルター系ブキの名前と、(未確認)
    スピナー:最も使用したスピナー系ブキの名前と、(未確認)
    ブラスター:最も使用したブラスター系ブキの名前と、爆風を当てた回数に対する直撃率 [%]
    スロッシャー:最も使用したスロッシャー系ブキの名前と、高度に差がある相手へのヒット率 [%]
    ブラシ:最も使用したブラシ系ブキの名前と、(未確認)

    b) a) から求められる指標

    1. K/D
    定義 : たおした数 / やられた数
    現時点でわかっていることは、
    ・K/Dが1程度だと勝率がおおむね50%程度になる
    ・K/Dが1程度であっても、やられた数が多ければ勝率は低くなる(5回を超えるときつい)
    といったところか。ただし、K/Dの値は結果論であり、値を改善する方法については何も教えてくれない。(戦略を無効にするほど突撃して相手を倒せる人の真似はできないし、統計はそういうところを目指すわけではない)

    2. 攻撃不能時間 [秒]
    定義 : やられた数 x 復活に要する時間(復活時間短縮ギアによって変動、基本8.5秒)
     1試合あたりこの秒数だけ、攻撃が完全に不可能。また、前線に戻るまでの時間を考えると、この時間以上に攻撃に使えない時間は長い。180秒(ガチマッチでは基本300秒)のうちどれほど攻撃に使えなかったかを考えよう。
     ただし、「積極的に試合に参加していない」場合もこの指標は良化するので、信頼性は高くはない。(戦わなければやられることもない)

    c) 実際のプレイを見る必要がある指標
    ここで挙げる指標は、実際に試合を検査しなくてはいけないため、ぜんぜん検証ができていません。つまり、まだ言ってみただけ。だめじゃねえか
    1. 離脱度
    定義 : [自分以外の味方の位置から求めた重心の座標]と自分の座標の間の距離(の2乗)
    この値が大きいと、自分が他のプレイヤーから離れていることになる。
    「孤立しているプレイヤーはやられやすい」ということを定量化したい。

    2. 自陣ヌリ度
    定義 : まだ固まっていない
    「目標」(エリア、ヤグラ、ホコ、プレイヤー)の周辺が自分側のインクでどれくらい塗られているかを定量化したい。目標に向かって直線的にしか塗っていなければ、相手はそこだけ注目すればよいが、目標の周りを広く塗っていなければ、相手は的を絞りにくくなるからである。

    書きかけ