tomabouの日記

勉強したことなどを書いていきます

ジェンガの必勝法

ジェンガは先手必勝か後手必勝なのかというのが控室で話題になった。

結果としては段数がmod3で1のときは後手必勝 そうでなければ先手必勝である。

ジェンガは、3本残っている段(ooo)、端を抜いた段(oox)、もう取れない段(oxo,xox)、最上段の本数で状態が定まるので、 もう取れない段を無視して( Z Z Z/3Z)の組で表現できる。その上でgrundy数を計算させれば良い。するとmod3で周期的になることが分かる。

実際のジェンガは18段であるので先手必勝なわけだ やったね

GitHub - tomabou/jenga

五月祭 工学博覧会

五月祭の工学部の企画で情報理論に関するちょっとした学生講演をした。

直前まで何もしなかったため、4日前に内容を決めて(既にタイトルは決まっていた)、2日前にスライドを作って発表してフィードバックを貰い、当日修正してどうにか間に合わせた。もっとギリギリにならないように出来たら良いが、なかなか難しいものである。

内容はアナログとデジタルの違いをフックに符号を導入して、誤り訂正符号やら通信路符号化定理を紹介して最先端の符号の話をした。発表自体は結構しっかり聞いてくれていた中高生の集団やら、質問してくれた男性も居て楽しかった。

発表スライドを作るのに手間取って萎えた経験が結構あるので、スライドを効率よく作れるようになりたいというのが最近の願いだが、今回のスライド作成はそこそこスムーズにできた。やはり、内容を決めた日にとりあえず無理矢理即興で仮発表をしたことが良かった。とりあえず喋ると喋ってる間に話したい話が纏まることを実感したので、今後も活用していきたい

情報の捉え方 - Google スライド

brainf*ckインタプリタ

はじめに

brainf*ckインタプリタは一瞬で作ることが出来るので、気晴らしに最適であると知られています[tomabou, 2019]

せっかく作ったのでブログに書いておきます

https://github.com/tomabou/brainf-ck/tree/master

HelloWorldしてFizzBuzz出来たのでちょっと満足しました。

ちょっとした感想

brainf*ckインタプリタでただ一つちょっと注意しないとイケナイところは、括弧の対応を取るところです。 括弧の対応を取るのは正規言語ではダメで、文脈自由文法が必要なので、スタックをどこかに用意する必要があります。

しかしC言語の場合、関数呼び出しをすると勝手にスタックを用意してくれるため、何も頭を使うところはありません。 FPGA上で実装したりbrainf*ck自身でbrainf*ck処理系を作ったりするときは、関数呼び出しという高級な機能がないのでスタックの実装についてちょっと考える必要があるかもしれませんね。

マイブーム

最近アコースティック・ギターにハマっている

今年の正月、神田神宮での初詣に並んでいるときに友人にそそのかされてamazonで購入したわけだ

よく見るコードは大体抑えられるようになったので、(augとか分数コードとかはすぐには抑えられないが)コード譜を見ながら右手をガチャガチャ16ビートもどきとかカッティングもどきとかしてるとそれっぽくなって楽しいわけである

ピアノで適当にコード抑えても全然それっぽく感じないが、ギターは経験が少ないので自分が簡単にそれっぽくなったと錯覚してくれるのでより楽しいわけである

そもそも一般的に新しく物事を初めて最初にぐっとできることが増えるフェーズは楽しい。この楽しさdrivenで物事をやるとすぐに飽きてしまう訳であるが、まあ想定内である

能力の特異性から飽きたら何も残らないゲームと違って、ギターができるというのはそこそこの一般性があると思うので飽きてもそんなに虚しくならないかなと思って始めたわけだ

大学のレポート

はじめに

大学のレポートを頑張って書くのに提出してそれで終わりではもったいないなぁと思います 昔書いて個人的に気に入ってるレポートを発掘したのでブログぐらいには貼っておこうかなという気分になりました 学部2年の数値解析学のレポートです。

num_ana_report.pdf - Google ドライブ

非常に懐かしい気持ちになりますね

ubuntu 18.04をインストールした直後に行うこと

忘れないようにしよう


python入れる

今のubuntuはsystem pythonでpipをaptで入れて、pipのバージョンをpipで上げると死ぬのでpyenv使っちゃいます

Building Python 3.6 from source on Ubuntu and Debian Linux | Solarian Programmer

sudo apt install build-essential
sudo apt install libssl-dev zlib1g-dev libncurses5-dev libncursesw5-dev libreadline-dev libsqlite3-dev 
sudo apt install libgdbm-dev libdb5.3-dev libbz2-dev libexpat1-dev liblzma-dev tk-dev

GitHub - pyenv/pyenv: Simple Python version management

vscode

Visual Studio Code - Code Editing. Redefined

alias code='code --disable-gpu $@'

プログラム言語 Rust

はじめに

最近「プログラム言語 Rust」という本を買いました。 Rustはオンラインに The Book と呼ばれる良いドキュメントがあり、それを読めば十分なのでは?という意見もあると思いますがカッコイイので買いました

感想

オライリーの方が自分には理解がしやすかったです(The Book眺めてよくわからんと思っていたことが本を読んだらかなり整理されました) 

オライリーのほうが話が整理されているんじゃないでしょうか

例えばオライリーでは「Rustは配列を指す長さ付きのFatPointerがありますよ」という話(これは一瞬で理解できる)を所有権の概念より先に出して、そのあと所有権の話をします。これがThe BookではWhat is ownership?という話から始まります。そしてその為にスライスを持ち出して、その後スライスの解説をするわけです。僕は前者の方が良いと思いますね

あとHaskellで見覚えのある機能が色々入っているので(Option型 パターンマッチ trait)Haskellは勉強してみるに限りますね