27 Dec 2015, 06:22

プログラミングでフロー状態に入るための習慣について

プログラミングの勉強をしていると、 フロー状態に入っていい感じに集中できることがある。

どういうときに、そうなれるのか、最近の自分の習慣についてまとめてみた.

姿勢を正す

正しい姿勢で作業をすると、集中できる.

私は、BagJoy というものを常に持ち歩いている. カフェでも職場でも、これをしいて座ることで背筋を伸ばして作業している.

大変おすすめ.

テクノを聴く

テクノミュージックを聴くと、集中できる.

ミニマルな、単調なリズムの繰り返しによって、 脳がズンズンと深い集中状態に導かれる.

Jazz やクラシックも大好きでよく聴くのだけれども、 結局はやはりテクノミュージックが一番よい.

プログラミングという作業とテクノミュージックは相性がよいのかも.

Digitally Imported という無料でテクノを聴けるサイトで聴いている. チャンネルは、Tech House だ.

カフェインをとる

カフェインをとると脳が集中できる.レッドブルもよい. カフェインの錠剤も、多用している.


でも、カフェインの効力はせいぜい 1 時間だ. 継続的なフローをキープするためには、カフェインの手段に頼ってはいけない.

プチ瞑想する

プチ瞑想をすると、集中力が上がる.瞑想については、以下の記事に書いた.

呼吸に意識を集中して、心のなかでマントラを唱える(おーなんすばーはー) そうすると、雑念が消えて集中状態に入れる.

瞑想のトレーニングをすることは、フローに入るためのよい訓練方法だ. 日々、雑念を捨てる訓練をすることで、瞬間的に無の状態へいつでもなれる.

マウスを利用しない

マウスを利用せずに、キーボードだけで作業をしていると、 集中することができる.

極端なはなし、Emacs の中にこもっていると作業に集中することができる. ときには、ブラウザを利用したくなることもある. Emacs ライクに操作できる conkeror というマイナなブラウザを利用している.

また、タイル型ウィンドウマネージャーを利用することで、 ウィンドウ配置をキーボードだけで完結させることができる.

まとめ・睡眠

いろいろとまとめてみたが、一番よいのは十分な睡眠をとる事なきがしている. 睡眠を十分にとった後は、なぜか集中力が上がる.寝不足だと集中できない.

26 Dec 2015, 11:25

AOJ へ Emacs から投稿するスクリプトをみつけた

AOJ の問題を最近解いているのだが、 Emacs から投稿するスクリプトがないかなと探していたら、見つけた.

aoj-submit をうつと、web に投稿してくれる。これは便利だ..

ここからが Hack. できれば、ローカルでテストケースを実行したい.

そのためのスクリプトを見つけた.

たとえば、問題番号 1147 のテストをしたいとき、 以下を実行すると、テストケースをダウンロードしてきてローカルで実行してくれる.

oj.py --aoj -i 1147.py 1147

ソースを読むと、html をスクレイピングしてるようなトリッキーなことをしていた.

これを Emacs から叩けるように、メソッドを追加してみた.

(defcustom aoj-ojpy-path nil "Your oj.py path")

(defun aoj-test ()
  (interactive)
  (shell-command (concat aoj-ojpy-path " --aoj -i "
                         (file-name-nondirectory (buffer-file-name)) " " (aoj--problemNO))))

これで、Emacs からテスト実行 -> 提出ができるようになった.

25 Dec 2015, 08:20

Udacity で Machine Learning for Trading の講義をきいた

Udacity で Machine Learning for Trading のビデオを見てみた.

これは、coursera にある以下のコンテンツの Part2 になる.

講義内容

3つのパートに分かれている.

  1. Python の numpy, pandas, scipy の使い方
  2. ヘッジファンドについて
  3. 機械学習

1 つめは、python の numpy, pandas ライブラリを用いて 金融データをどうやって扱うかが説明される.

2 つめは、ヘッジファンドの仕組みについて. ここのパートは、coursera の講義内容と内容がかぶってていたので、 飛ばした.

3 つめは、機械学習をシステムトレードに適用する方法について 説明される. 具体的に説明されていたのは、以下のような内容.

  • 線形回帰
  • KKN 法
  • Q 学習(強化学習)

他にも、KKN 法を改良した bagging algorithms や、 Q 学習を改良しした、Dyna-Q 学習 algorithms について解説されていた. 一度ビデオをみただけでは理解できなかった.

それから、この MOOC には提出課題はない. 課題の内容は公開されているのだが、提出が求められていない. Disscussion Board とかもないので、自力で解くのは断念して、課題はやらなかった.

感想

機械学習について、学べると思ったが、正直理解できなかった.

また、Computational Investing Part I に触発されて去年 FX のシステムトレードを したのて、これに機械学習のアイデアを取り入れて改良できればいいなと考えていた のだが、理解できていないので改良できない..

今後について

この講義だけで、機械学習をまなべると思っていたのは舐めていた.

本当に機械学習をシステムトレードに当てはめるためには、 本腰を入れて機械学習を学ばないといけないな. しかも、日本語のリソースで!(英語は理解できない)

機械学習を勉強するには、覚悟を決めて取り組まないと理解できない気がする. お試しで身につくようなものではない. 時間をかけるべきか、悩む.

とりあえず、深追いはせずにここで学習はやめようと思う.

20 Dec 2015, 08:16

プロコンをはじめたので今後の対策方法について考えた

ひまですることもないし、プログラミングにも興味がなくなってしまったので、 競技プログラミングの勉強をはじめた. プログラミングコンテストの対策についてまとめる.

以前、モチベーションについてはまとめた.

プロコンの動機について

プロコン参加の理由は、以下の通りだ.

  • 素早くコーディングする技術を身につけることができる.
  • プログラミングの基礎体力を身につけることができる.
  • TOEIC のように点数があるので自分の成長を実感できる.
  • 転職活動に利用できる.
  • プロダクトのクソコードから離れて自分の美学を貫いたコードがかける.

それから、Python でプログラミングをしている. 理由は、美しくコードがかけるからだ. C++という選択肢は捨てがたいが、C++よりも Python のほうがシンプルにかける. しかし、Python でプロコンをするのはまだ少数派のため、解答例を見つけるのが難しい,

TopCoder を中心に学習を進めていくつもりだ. 最終目標は TopCoder でイエローコーダになること。 そのためには、まず Div1 に上がること.

プロコンの対策について

プロコンの対策について、 こうすればよいというネット上のリソースをいろいろと検索したものの、よいものが見つからない. TOEIC などはみつかるのに。以下、検索結果を列挙.

現在、以下の本をもっている. 以下、簡単に所感を述べる.

  • 最強最速アルゴリズマー養成講座.(チーター本)

TopCoder の過去問を中心に演習問題が並んでいる.TopCoder 専用問題集.

  • プログラミングコンテストチャレンジブック.(蟻本)

北京オンラインジャッジの過去問を中心に演習問題が並んでいる. 解答例が C++なので、Python で読むには苦痛が伴うところが難点. プロコンで必要なアルゴリズムが網羅されている. 有名な対策本.

  • プログラミングコンテスト攻略のためのアルゴリズムとデータ構造.(ALDS)

アルゴリズムの基礎が、会津オンラインジャンジを利用して学習できる. タイトルに反して、どちらかというと基礎がための要素が強く、 プロコン向けではない気がしている.

Web 上のリソースには以下がある.

最強最速アルゴリズマー養成講座

実践・最強最速のアルゴリズム勉強会:

TopCoder のページにある対策記事(英語)

Python の対策には以下がよい.

効率のよい学習方法は、典型問題の暗記だと思っている. 受験数学をどうすれば解けるようになるか、考えてみると、典型問題を暗記することが 効率がよかったという、高校生のときの体験がある. 数学は暗記だ. 解法パターンを暗記してしまおう.

今後の学習計画について

どう進めればよいものか、なやんでいる. 心にもやもやしているものを書き出してみる.

  • 蟻本 蟻本を読むのが王道な気がするが、Python で取り組むには解答例に乏しい.
  • AOJ 会津オンラインジャッジは素晴らしいシステムだ。Python による解答例も見つかるので、 自分のコードと比較することで勉強にもなる. しかし、解答に対する解説がない問題は、学習の投資に対する効果が薄い.
  • TopCoder 過去問 TopCoder には、Editorial という過去問に対する解説がある. http://apps.topcoder.com/wiki/display/tc/Algorithm+Problem+Set+Analysis

    しかし、英語なので、困る. 日本語でないと、 理解するのに時間がかかるのだ.余計な労力をつかいたくない.

  • プログラミングコンテスト参加 TopCoder, Codeforce, AtCoder…たくさんのコンテストがある。 コンテストに参加すると、モチベーションが高まるのでよいが、 自分のペースで学習することができない点がデメリット. また、体系的に学習できない.

Conclusion

コツコツと続けられて、成果を振り返って確認できるものがよい. そうすると、とにかく無作為に数をこなすよりも、書籍による学習がよいと考えた. ここ数週間のメニューは以下の通りとする.

  • 蟻本を Python で解いで、基礎知識を身につける.
  • TopCoder の過去問を解いて、問題にとにかくなれる.(1日1題目標)
  • 可能な限りプロゴラミングコンテストに参加する。そして、復習する.

追記

<div class="outline-text-3" id="text-orgheadline5">
  <p>
    蟻本、挫折した.ムズかしい. もっと簡単なもので対策をしなければ. 難易度順に問題が並んでいるサイトをみつけた. ICPC-AOJ というサイト.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://ichyo.jp/aoj-icpc/">http://ichyo.jp/aoj-icpc/</a>
    </li>
  </ul>

  <p>
    AOJ による採点ができる & 難易度順に問題がならんでいる ということで、これを順に解いていくことにするよ..
  </p>

  <p>
    ACM-ICPC のサイトにおすすめ問題が載っている。これを解いていこう. おすすめ. サイトのリンクは POJ だけれども、AOJ で検索すると対応する問題が載っている.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.deqnotes.net/acmicpc/">http://www.deqnotes.net/acmicpc/</a>
    </li>
  </ul>
</div>

追記 2

<div class="outline-text-3" id="text-orgheadline6">
  <p>
    TopCoder の練習方法についてかかれた記事.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://www.quora.com/How-should-I-practice-so-that-I-will-be-at-a-level-where-I-can-approach-TopCoders-Div1-500-problems-with-confidence">How should I practice so that I will be at a level where I can approach TopCoder&#8217;s Div1-500 problems with confidence? &#8211; Quora</a>
    </li>
  </ul>

  <p>
    TopCoder のチュートリアルがいいらしい.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://www.topcoder.com/community/data-science/data-science-tutorials/">https://www.topcoder.com/community/data-science/data-science-tutorials/</a>
    </li>
  </ul>
</div>

追記 3

<div class="outline-text-3" id="text-orgheadline7">
  <p>
    twitter の対策方法まとめ
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://togetter.com/li/729445">http://togetter.com/li/729445</a>
    </li>
  </ul>
</div>

20 Dec 2015, 07:17

2015 年の過去記事振り返りと 2016 年の目標

今年も終わりなので、2015 年の振り返りと 2016 年の目標を立てる.

2015 年の振り返り

たいして成長を実感できない、一年となってしまった.

まず、2015 年の目標はどうだったかというと、以下の 2 つを目標にあげた.

  • 統計解析
  • 関数型言語

統計解析

<div class="outline-text-3" id="text-orgheadline2">
  <p>
    結論からいうと、身につかなかった. モチベーションも続かなかった. 今の仕事が組み込みソフトの開発なので、統計の知識なんて使う余地がない. そう思うと、途端にやる気が失せた.
  </p>

  <p>
    一応, MOOC で統計の講座を取った. R 言語をちょい頑張ったのだが、結局身につかず.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/3019">Coursera で Reproducible Research をうけた | Futurismo</a>
    </li>
    <li>
      <a href="http://futurismo.biz/archives/2968">統計解析の基礎を学ぶ! edX の Foundations of Data Analysis をうけた | Futurismo</a>
    </li>
    <li>
      <a href="http://futurismo.biz/archives/2961">Coursera で R 入門! Data Scientist の講座 2 つ | Futurismo</a>
    </li>
    <li>
      <a href="http://futurismo.biz/archives/3069">鮮やかにデータを可視化する! coursera で Exploratory Data Analysis を受けた | Futurismo</a>
    </li>
    <li>
      <a href="http://futurismo.biz/archives/3106">Gacco で 社会人のためのデータサイエンス入門をうけた | Futurismo</a>
    </li>
  </ul>
</div>

関数型言語

<div class="outline-text-3" id="text-orgheadline3">
  <p>
    関数型言語も中途半端な頑張りに終わってしまった. SICP を読んでいたのだが、結局難しくて、途中で挫折してしまった.
  </p>

  <p>
    それから、Scala, Haskell, CommonLisp, Clojure と関数型言語を つまみぐいしたけれども、結局どれも中途半端。残るものはない.
  </p>

  <p>
    しかし、いろいろな言語に触れることで、 関数型言語の初歩はなんとなくわかったような気がする.
  </p>
</div>

その他小さい話題について

<div class="outline-text-3" id="text-orgheadline7">
</div>

<div id="outline-container-orgheadline4" class="outline-4">
  <h4 id="orgheadline4">
    MOOC について
  </h4>

  <div class="outline-text-4" id="text-orgheadline4">
    <p>
      今年の前半まで、MOOC を頑張っていた.
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://futurismo.biz/archives/3032">システム制御は奥が深い! 井戸の中の蛙な自分.coursera で Cloud Computing Cocepts をうけた | Futurismo</a>
      </li>
      <li>
        <a href="http://futurismo.biz/archives/3109">仕事に関わる知識を MOOC で! Coursera で Cloud Computing Concepts Part2 を受けた | Futurismo</a>
      </li>
      <li>
        <a href="http://futurismo.biz/archives/3950">ハードウェアの仕組みを学ぶ!coursera で From Nand To Tetris Part1 を受けた | Futurismo</a>
      </li>
      <li>
        <a href="http://futurismo.biz/archives/3975">リアクティブプログラミングの世界観を垣間見!coursera で Principles of Reactive Programming を受けた | Futurismo</a>
      </li>
    </ul>

    <p>
      しかし、ある日突然、MOOC に対して興味を失ってしまう&#x2026;
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://futurismo.biz/archives/4140">MOOC をはじめてから 2 年たち、そろそろ飽きてきた | Futurismo</a>
      </li>
    </ul>
  </div>
</div>

<div id="outline-container-orgheadline5" class="outline-4">
  <h4 id="orgheadline5">
    楽しかった FX
  </h4>

  <div class="outline-text-4" id="text-orgheadline5">
    <p>
      今年一番楽しかったのは、FX システムトレードのプログラムを Python で書いたことだ.
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://futurismo.biz/archives/4455">FX シストレプログラム AWS でサーバ借りてデビュー | Futurismo</a>
      </li>
      <li>
        <a href="http://futurismo.biz/archives/4392">夏休みの自由研究 は OANDA API を利用して FX システムトレード | Futurismo</a>
      </li>
    </ul>

    <p>
      儲からなかったけれども、作り上げる喜びを感じた.
    </p>
  </div>
</div>

<div id="outline-container-orgheadline6" class="outline-4">
  <h4 id="orgheadline6">
    Emacs にあきる
  </h4>

  <div class="outline-text-4" id="text-orgheadline6">
    <p>
      2015 年の前半は、Emacs が好きだった。なにか Elisp で作品を書きたいと思っていた. だが、結局アイデアが浮かばずに、なにも作れなかった.
    </p>

    <p>
      そして、Emacs 自体にも飽きてしまった. 普段の開発では Eclipse をつかってるからね.
    </p>
  </div>
</div>

そして迷走する

<div class="outline-text-3" id="text-orgheadline8">
  <p>
    2015 年の下期、とにかく自分がなにをすればいいか分からなくなってしまった. 詳しい経緯は、以下の記事にまとめた.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/3944">自分はプログラミングが好きなのだろうか? | Futurismo</a>
    </li>
    <li>
      <a href="http://futurismo.biz/archives/5439">プログラミングに興味がなくなってしまった | Futurismo</a>
    </li>
  </ul>

  <p>
    いったい、自分はなにをすればいいのかわからない. こんな状態で、来年度の目標をどう立てればいいのやら&#x2026;.
  </p>
</div>

2016 年の目標

前にも書いた通り、今はプログラミングに対するモチベーションが下がっている.

目標はないよりもあったほうがよい.暫定の目標だ.

熱中できるようなおもしろいなにかが見つかったら、そっちに注力することにする.

TOEIC

<div class="outline-text-3" id="text-orgheadline10">
  <p>
    プログラミングに飽きてしまったが、その空いた時間を利用して TOEIC の勉強をしている.
  </p>

  <p>
    とにもかくにも、英語ができないと MOOC もできないし、洋書も読めない.
  </p>

  <p>
    英語力を向上させる一年としたい. 目指せ、860 点!!
  </p>
</div>

プロコン

<div class="outline-text-3" id="text-orgheadline11">
  <p>
    やることがなくなってしまったので、 とりあえずの目標. この目標は変えるかもしれない.
  </p>

  <p>
    TopCoder で Div1 にあがることが目標. 具体的な対策は以下に書いた.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/5552">プロコンをはじめたので今後の対策方法について考えた | Futurismo</a>
    </li>
  </ul>
</div>

Clojure

<div class="outline-text-3" id="text-orgheadline12">
  <p>
    関数型言語を引き続き勉強したい. そのための手段として Clojure を選ぶ.
  </p>

  <p>
    Scala をやったほうが仕事で生かすチャンスはありそうなものだが、 なぜかわからないが、Clojure に惹かれるのだ.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/4649">シンプルさが前に進む力となる Clojure | Futurismo</a>
    </li>
  </ul>

  <p>
    今、まともに利用できる言語は、C, Java, Ruby の 3 つくらい. これに、来年は Clojure を加えたい.
  </p>
</div>

19 Dec 2015, 04:57

TopCoder SRM 676 Div2 550 BoardEscapeDiv2(参加)

問題

アリスとボブは、r行およびc列のグリッドに分割された矩形ボードを持っています。 グリッドは、String []型sで記述されています。 Sの各文字は、一つのセルを表します。cellには4つのタイプがあります。

  • ‘E’は終了を表しています。任意の数の終了、おそらくゼロがあるかもしれません。
  • ‘T’は正方形は単一のトークンが含まれていることを意味します。最初はボード全体に正確に一つのトークンが存在することになります。
  • ‘#’は、障害物を表します。
  • ‘。’空のセルを表します。

アリスとボブはこのボード上のゲームをプレイします。 ゲームはintkによってパラメータ化されます。トークンは、最初にその上に数kを持っています。 プレイヤーはアリスから始まる、ターンを交互にかかります。プレイヤーのターンは、以下のステップで構成されています。

  • プレイヤーは、下、左、または右のトークン1平方を上に移動します。トークンは、ボードの端に行くことができない、それが障害物をcellに入力することはできません。
  • このトークンが出口にある場合、それはボードから消えます。
  • それ以外の場合は、トークンの数から1を引きます。トークンの数がゼロの場合、ボードから取り外します。

行動を起こすことができない最初のプレーヤーがゲームを失います。 (すでにボードを去ったとき、トークンにもこだわっているときに発生します。)

アリスとボブの両方を最適にプレイすると仮定すると、あなたはString[]型のを与えられ、intkは、ゲームの勝者を計算します。 当選者の名前を返します:「アリス」または「ボブ」のいずれか。戻り値は、大文字と小文字が区別されることに注意してください。

方針

プレイヤーが2人いて、お互いに最適な戦略を取ったとき勝つのはどちらか、 みたいな問題は、WL-Algorithmsというものを利用して解くらしい.

[sourcecode language=”cpp” title=”” ]
boolean isWinning(State pos){
State[] nextStates = { posから到達できる全ての次の状態 };
for(State s : nextStates){
if(!isWinning(s)) return true;
}
return false;
}
[/sourcecode]

  • 相手を必ず負けさせるような手が存在するなら現在の位置では勝ち決定。
  • そのような手がないないのであれば負け。

参考リンクをはっておく. あとで勉強しよう.

今回は、このアルゴリズムにメモ化再帰を適用した.

解答

[sourcecode language=”python” title=”” ]
MAXN = 200

vx = [1, -1, 0, 0]
vy = [0, 0, 1, -1]
memo = [[[-1 for i in range(MAXN)] for j in range(MAXN)] for k in range(MAXN)]

class BoardEscapeDiv2:
def isWinning(self, s, x, y, move):
n = len(s)
m = len(s[0])

if move == 0: return False
if s[x][y] == ‘E’: return False
if memo[x][y][move] != -1: return memo[x][y][move]

for i in range(4):
nx = x + vx[i]
ny = y + vy[i]
if nx < 0 or ny < 0 or nx >= n or ny >= m or s[nx][ny] == ‘#’:
continue
if not self.isWinning(s, nx, ny, move – 1):
memo[x][y][move] = True
return True

memo[x][y][move] = False
return False

def findWinner(self, s, k):
n = len(s)
m = len(s[0])

for i in range(n):
for j in range(m):
if s[i][j] == ‘T’:
x = i
y = j

return “Alice” if self.isWinning(s, x, y, k) else “Bob”
[/sourcecode]

おわりに

本番では解けなかった. こういう問題をさらりととけないと Div1には上がれないのか… 道は遠いな.

18 Dec 2015, 17:52

TopCoder SRM 676 Div2 250 FarmvilleDiv2(参加)

問題

n個の植物がある. それぞれ time[i]秒成長するのにかかる.

cost[i]をbudgetのなかから支払うと、1秒成長を早めることができる.

time, cost, budgetが与えられる. 植物を育てることのできる時間の最小値をかえせ.

方針

costを昇順にソーティング. costの低い順に時間を計算

  • budgetがまだあるときは、total時間は加算しない.
  • budgetがないときは、time分 total時間を加算する.

解答

timeとcostをインデックスをそろえながらソーティングするよい方法が思い つかなかったので、自力でソーティングアルゴリズムを実装した。

なにかよい方法はないものか。他の人の解答をみて研究することにする.

[sourcecode language=”python” title=”” ]
class FarmvilleDiv2:
def insertion_sort(self, time, cost, N):
for i in range(1, N):
v1 = time[i]
v2 = cost[i]
j = i – 1
while j >= 0 and cost[j] > v2:
time[j + 1] = time[j]
cost[j + 1] = cost[j]
j -= 1
time[j + 1] = v1
cost[j + 1] = v2
return time, cost

def minTime(self, time, cost, budget):
time = list(time)
cost = list(cost)
time, cost = self.insertion_sort(time, cost, len(cost))

ret = 0

for t, c in zip(time, cost):
for i in range(t):
if budget – c >= 0:
budget -= c
else:
ret += 1

return ret
[/sourcecode]

18 Dec 2015, 10:31

TopCoder SRM 575 Div2 250 TheSwapsDivTwo (練習)

TopCoder

問題

int型配列が与えられる。 2個の数値の位置を入れ替える場合、得られるユニークな数列が何通りあるか.

方針

全通り swapしてみて、ユニークな数列の数を数える.

回答

[sourcecode language=”python” title=”” ]
class TheSwapsDivTwo:
def find(self, sequence):
s = set()
n = len(sequence)

for i in range(n – 1):
for j in range(i + 1, n):
l = list(sequence)
l[i], l[j] = l[j], l[i]
s.add(tuple(l))

return len(s)
[/sourcecode]

18 Dec 2015, 03:04

TopCoder SRM 672 Div2 500 SubstitutionCipher

問題

可換暗号の問題. 暗号化のために可換テーブルを利用する。

ところが、この可換テーブルがなくなってしまった。

a,b, y が与えられるので a -> b の変換を手がかりにして、 暗号化されたy から 復号化された文字列xを求めよ。

方針

可換テーブルを b->aの複合ルールから求めてそれを y に適用する.

文字が25文字のとき、全てのアルファベットの中で利用されていない 文字を調べてテーブルに追加する必要がある.

回答

[sourcecode language=”python” title=”” ]
allchar = list(“ABCDEFGHIJKLMNOPQRSTUVWXYZ”)
class SubstitutionCipher:
def notIn(self, s):
return “A”

def decode(self, a, b, y):
cipher = {}

for i in range(len(a)):
cipher[b[i]] = a[i]

if len(cipher) == 25:
remain_a = list(set(allchar) – set(a))[0]
remain_b = list(set(allchar) – set(b))[0]
cipher[remain_b] = remain_a

x = “”
for i in range(len(y)):
if y[i] not in cipher:
return “”
x += cipher[y[i]]

return x
[/sourcecode]

18 Dec 2015, 01:46

TopCoder SRM672 Div2 Easy SetPartialOrder

TopCoder

問題

Intの配列AとBが与えられる。

  • 等しいなら”EQUAL”、
  • AがBのサブセットなら”LESS”、
  • BがAのサブセットなら”GREATER”、
  • それ以外なら”INCOMPARABLE”と返す。

方針

setを使う. サブセットは < で比較するのを始めて知った. issubset というメソッドもあるらしい.

回答

[sourcecode language=”python” title=”” ]
class SetPartialOrder:
def compareSets(self, a, b):
a = set(a)
b = set(b)

if a == b:
return “EQUAL”
elif a < b: return "LESS" elif a > b:
return “GREATER”
else:
return “INCOMPARABLE”
[/sourcecode]