ショートコーディング「世界を革命する力を」
ふとしたツイートからコードゴルフ大会が勃発
もくし
くしも
しもく
くもし
もしく
しくも
という6行(UTF-8を想定)を出力するCプログラムって最短何バイトまで縮められるだろうか
— naoya t (@naoya_t) 2013, 7月 2
続きを読む
MacBook Airの電源アダプタが断線すると読書が捗る
MacBook Air (13-inch, Mid 2011) のACアダプタ(45W) の根本が断線した。残りバッテリ47分なので新バッテリを得るまで暫く休業…
— naoya t (@naoya_t) 2013, 6月 29
でMacが使えなかったので、週末は「きつねさんでもわかるLLVM」とか「Real World OCaml」とか読んでました。
Oreilly & Associates Inc
売り上げランキング: 31,941
Real World OCamlはβ版(HTML、無料)のやつですけど。
電源アダプタは互換品をポチりました。
売り上げランキング: 529
graph-tool(のMacへのインストールに挫折してvagrantと戯れるの巻)
Pythonでグラフの最小カットを計算しようと思ったのだけれど、Wikipediaから拝借してきた最大フローを求めるFord-Fulkersonコードを元に書いたものでイマイチ速度が出なかった*1ので、速いと噂の
graph-tool
を試してみることにした。
brewで入れるとか、easy_installで入れるとか色々試したけれど自分のMac環境では依存関係のあちこち(Boost, CGAL, cairo, ...)で軒並み引っかかってビルドに失敗する。
Ubuntuだとapt-getで一発で入ったのに。
時間も気力も溶けて行くので、諦めてローカルにUbuntuのvirtualboxを立てて使うことにした。vagrant便利だし。
http://qiita.com/awakia/items/895b3d61311b19737237 あたりを見て
boxの選択は Ubuntu Quantal 64 (12.10) Vanilla (※389MB) にしてみる。
$ vagrant box add quantal64-vanilla https://dl.dropboxusercontent.com/u/165709740/boxes/quantal64-vanilla.box $ vagrant init quantal64-vanilla $ vagrant up
これで
$ vagrant ssh
ローカルのvirtualboxに入れる。
Pythonは2.7.3, 3.2.3が入っていた。
本家ダウンロードページにある指示どおりに /etc/apt/sources.list を編集し、apt-get update した後
vagrant@quantal64-vanilla:~$ sudo apt-get install python-graph-tool
など実行。graph-tool がさくっと入った。
Mac側のホームディレクトリでvagrantを立てたので、virtualbox側の /vagrant/ 以下にホームの内容が見える。個人的に使うにはとても便利。
Mac側でスクリプトを編集して
$ vim foo.py
中身はこんな感じ。ここの最初のプログラムから。
from graph_tool.all import * g = Graph() v1 = g.add_vertex() v2 = g.add_vertex() e = g.add_edge(v1, v2) graph_draw(g, vertex_text=g.vertex_index, vertex_font_size=18, output_size=(200, 200), output="two-nodes.pdf") print(v1.out_degree())
これをvirtualbox側で実行
vagrant@quantal64-vanilla:~$ python graph.py ** (graph.py:25309): WARNING **: Could not open X display
うーむ。
Xが開けないのはMac側に繋いでやればいいはずなので*2Mac側で
$ vim ~/.vagrant.d/boxes/quantal64-vanilla/virtualbox/Vagrantfile
Vagrant::Config.run do |config| # This Vagrantfile is auto-generated by `vagrant package` to contain # the MAC address of the box. Custom configuration should be placed in # the actual `Vagrantfile` in this box. config.vm.base_mac = ... config.ssh.forward_x11 = true ## ←この1行を追加 end ...
これでvagrantを立ち上げなおしたら行けるんじゃね
vagrant@quantal64-vanilla:~$ exit logout Connection to 127.0.0.1 closed. $ vagrant halt $ vagrant up $ vagrant ssh ... Last login: Wed Jun 26 07:11:08 2013 from 10.0.2.2 vagrant@quantal64-vanilla:~$ python graph.py 1
今度はうまく行った。
Mac側で
$ open two-nodes.pdf
すると
ちゃんと出来てた。
PRML §8.3.3 例:画像のノイズ除去
【次回復々習レーン(2013/7/21開催予定)の発表資料準備】
反復条件付きモード(ICM)での画像復元
- 左上から順番に走査しながら、反転するとエネルギーを減らせるピクセルを反転
- 走査前後のエネルギー差分がεを下回ったら(あるいは10回やったら)終了
MacBook Air (1.8 GHz Intel Core i7) でノイズ除去にかかった時間:
noise | iter | sec |
---|---|---|
5% | 5 | 0.850 |
10% | 6 | 1.037 |
15% | 6 | 1.029 |
20% | 8 | 1.374 |
25% | 10 | 1.705 |
30% | 8 | 1.373 |
320x180の画像をPythonで1秒前後で処理できています。
25%で走査数が多いのは気にしない(ノイズ生成パターンをいくつも作ったら吸収されると思う)
Pythonの辞書内包表記 (2.7〜)
3.1で入ったのは聞いてたけれど、今使ってる2.7でも使えるの知らなかった><
- 集合のリテラル文法 ({1,2,3} は mutable set になります)
- 辞書と集合の内包表記 ({i: i*2 for i in range(3)}).
コードテンプレート加筆 + TZTesterの文言変更
assert() を使おう
SRMがドジっ子アピールの場となっている現状を打破すべく
#define NDEBUG $BEGINCUTS #undef NDEBUG $ENDCUTS #include <cassert>
を追加。
全体だとこんな感じ→ https://gist.github.com/naoyat/5821991
これでローカルテストの時だけassert()が使える。こんな感じ。
typedef long long ll; ... bool f(ll x) { ... } ll lo = 1LL, hi = LONG_LONG_MAX; int z = 0; while (true) { // lo:x hi:o assert(lo < hi); assert(0 <= lo); assert(!f(lo)); assert(f(hi)); if (lo+1 == hi) { return hi; } ll mi = (lo + hi)/2; if (f(mi)) hi = mi; else lo = mi; assert(mi >= 0); }
TZTester文言変更:Expected/Received を Expected/Your answer に変えてみる
SRM583 Div2 Easy "SwappingDigits" より。わざと間違えてます。
Test Case #0...PASSED (0.024 msec) Test Case #1...PASSED (0.009 msec) Test Case #2...PASSED (0.006 msec) Test Case #3...FAILED (0.004 msec) Expected: "10234" Your answer: "01234" Test Case #4...FAILED (0.006 msec) Expected: "13218910471211292496" Your answer: "03218919471211292416" Test Case #5...FAILED (0.006 msec) Expected: "10720376171328422763213753122612211005355347513" Your answer: "01720376171328422763213753122612211005355347513"
これでテスト失敗時の視認率が上がるかも。
https://github.com/naoyat/TZTester
↑他にも魔改造が施されているので、ご利用は計画的に&自己責任で!