Hylangで蟻本
Hylangで蟻本をやる
蟻本って何?
プロコンの勉強本としてお馴染みのプログラミングコンテストチャレンジブック(通称:蟻本)
プログラミングコンテストチャレンジブック [第2版] ?問題解決のアルゴリズム活用力とコーディングテクニックを鍛える?
- 作者: 秋葉拓哉,岩田陽一,北川宜稔
- 出版社/メーカー: マイナビ
- 発売日: 2012/01/28
- メディア: 単行本(ソフトカバー)
- 購入: 25人 クリック: 473回
- この商品を含むブログ (36件) を見る
概要
蟻本自体はC++で書いてあるので、C++のソースをHylangに移植する。
進捗&作業期間
完了
本を買ってから5〜6年ぐらい、Hylangで実装を初めてから足掛け3年ぐらい
Github
ここ : GitHub - dis-kaichi/programming-contest-challengebook
感想
クッソ疲れた(訴訟)。以下は愚痴
この本についてだが、基本的にソースが載っているのでソレを打ち込めば動くのだが、入力を一部変換して実装してあったりするところが有り、単純に打ち込めば終わりというわけでも無かった。グラフとか最後の方とかで、前の方のページで実装済みを前提でコードが書いてあったり、本に載っていない短縮記法(for文とか)がいきなり出てきたりしたことがあったので、そこら辺はちゃんとリンクとか注意書きとか書いて欲しかった。
物量がかなりあるので、頭から全部実装するとかは余りオススメしない。(時間のかかりぐあいが半端ない)何が書いてあるのか抑えておいて、後から必要に応じて実装してみるのがいいと思う。勉強にはなるので、時間があるときにちょこちょこやる感じがいいかな?
今回、C++からHylangの移植を行ったが、言語間の仕様の差を埋めるのが結構大変だった。
特にHylangの仕様が固まっていないので、2〜3年の間に書き方がガラリと変わった事が大きかった気がする。昔は引数の展開(*list, **dict)みたいなやつが書けなかったので、applyを使って無理やり書いてたし、letが途中削除になったので、修正したり(今は復活)、defが削除になったので、setvに書きなおしたり、強制敵にreturnができなかったり(今はできる)などなど。
この本に手を出した経緯については、プロコンに興味があったので、本を買ってC++で勉強したのが、5〜6年前。それで途中で飽きて放置、完全に積読本となっていたのを掘り出したのが3年ぐらい前、その時ちょうどPython上で動くLispの方言(Hylang)を見つけたばっかりだったので、勉強がてら実装してみようと始めたのが苦行の始まり。完了するのに3年も掛かった上、今年のGWはコレで潰れた(憤怒)。当時はLispの書き方もよくわからんかったのが、今ではかなり書けるように…(Hylang限定)。大分成長したなぁ。
取り敢えず、githubのアドレスは晒しておくので、Hylangを勉強していて、蟻本にも興味がある人の一助になればいいなぁと思う。(そんな奴いるのか?)
以上、終わり
Hylangで最大ヒープ
概要
Pythonの組み込みライブラリにはheapqなる、ヒープ木を実現するためのモジュールがあるのだが、最小ヒープしか対応していないので、小細工して最大ヒープをできる様にしてみた。
※ ただし言語はHylang
最大ヒープって何?
ヒープ木でルートの値が最大値のもの。
詳しくは、http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_9_B&lang=jpを参照
実装
比較演算子のオーバーライドでどうにかしてみた。
;; ---------------------------------------- ;; Max Heap : ルートが最大値 ;; ---------------------------------------- (import [heapq [heappush heappop]]) (defclass ReverseOrder [] [] (defn --init-- [self x] (setv (. self _x) x)) (defn --lt-- [self other] (> (. self _x) (. other _x))) (defn --le-- [self other] (>= (. self _x) (. other _x))) (defn --gt-- [self other] (< (. self _x) (. other _x))) (defn --ge-- [self other] (<= (. self _x) (. other _x))) (defn --str-- [self] (-> (. self _x) str))) (defn heap-push [que x] (heappush que (ReverseOrder x))) (defn heap-pop [que] (. (heappop que) _x)) ;;; テスト (def xs []) (heap-push xs 2) (heap-push xs 3) (heap-push xs 1) (print (heap-pop xs)) ;; 3
おまけ
流石にHylangの需要がなさすぎるので、Python Versionも公開しておく。
from heapq import heappush, heappop class ReverseOrder: def __init__(self, x): self._x = x return None def __lt__(self, other): return (self._x > other._x) def __le__(self, other): return (self._x >= other._x) def __gt__(self, other): return (self._x < other._x) def __ge__(self, other): return (self._x <= other._x) def __str__(self): return str(self._x) def heap_push(que, x): return heappush(que, ReverseOrder(x)) def heap_pop(que): return heappop(que)._x ## テスト xs = [] heap_push(xs, 2) heap_push(xs, 3) heap_push(xs, 1) print (heap_pop(xs)) # 3
「12歳が書いた量子力学の教科書」の適当まとめ
概要
後で見返して、こんな感じだったなーと思い返す用のまとめ。
本
- 作者: 近藤龍一
- 出版社/メーカー: ベレ出版
- 発売日: 2017/07/01
- メディア: 単行本
- この商品を含むブログを見る
適当まとめ(見返し用)
- 量子力学とは何か
- 万物の根源
- 歴史的な流れ(古代〜)
- 単位系の話
- 前期量子論
数学的定式化
内在的矛盾と解釈問題
量子力学の先へ
近未来応用への道
感想
Pythonで代数学をやる
ライブラリ
ライブラリ | Version | 説明 |
---|---|---|
Sympy | 1.1.1 | 代数計算 |
NetworkX | 2.0 | グラフ理論 |
概要
PythonでMaximaやMathematicaのような代数計算ができるライブラリであるSympyとグラフ理論用のライブラリであるNetworkXを使ってみたかった。
そのうちmatplotlibと連携してグラフとか出力してみたい。
導入
- pipでインストールできる
はじめに
- Sympyは公式のチュートリアルをやってみると何ができるのかなんとなくわかる
実践
- 数検の過去問を説いてみる
Tips
- 絶対値を含む方程式を解く
- https://gist.github.com/onionmk2/d424e83f4fda6eaf07f22312ad2dd5b4
- symbolsの定義時にreal=Trueをつける
- 絶対値はabs()で良い
- 解の範囲
- symbolsでの定義次に、positive=Trueをつけると、solve時に正整数の範囲で算出してくれる
- 連立方程式
- solveにリストで渡せば良い
- 変数もリストで渡す
- N進法
参考
- Sympy
- NetworkX
TODO
- NetworkXを触っていないので後日なんか作る
Tidalに入門したかった
概要
- プログラミングで音を奏でられる&LiveCodingができるということで、Tidalをインストールしようとしたがダメだったのでメモしておく
環境
Softwares | Version |
---|---|
Basix(OS) | 3.0 |
Stack | 1.3.2 |
SuperCollider | 3.6.2 |
インストール
- Tidal自体はHaskellらしいのでStackを使ってインストールする
- Tidalの元ネタというか内部的にSuperColliderという言語を利用しているので、それもインストール
ダメだった点
- SuperDirtという音楽セット?をインストールしようとして、Quarkが無い旨のエラーが出て失敗する
- (*) include("SuperDirt")をSuperColliderIDE上で打ち込むと失敗する
- 2017/11/19日現在、Linuxにおいて、SuperColliderのバージョンは3.6までしか提供していない
- https://launchpad.net/~supercollider/+archive/ubuntu/ppa]
- 2014年以降止まっているのか?
- Quark関連のbugfixがされているのが,3.7以降
- 上記の理由により、apt-get上でのインストールはダメくさい
まとめ
- これ以上はめんどくさいので、とりあえず保留
- 後日再挑戦する
Kivy備忘
Kivy使い方メモ
概要
環境
App | Version |
---|---|
Python | 3.5.2 |
hylang | 0.13.0 |
Install
- 参照先と同様にインストールを行う
- http://kuroneko0208.hatenablog.com/entry/2014/02/04/210343
- (注意) githubからkivyをDLすること
作成メモ
デフォルトで読み込まれるkvファイル
- Appを継承したクラスの名称でデフォルトの名前が決まる
- クラス名からApp部分を取り除いた部分を小文字にしてファイル名にする
- MainApp -> main.kv
- https://pyky.github.io/kivy-doc-ja/guide/lang.html
Properties
- Observer patternに該当する
- kvファイルとのやり取りとか、メモリ管理とか色々やってくれるらしい
- on_
で値変更時のイベントが飛んでくるようになるらしい
KV File
- 基本的に木構造な感じで作成していく
<LoginScreen>: # Class Name GridLayout: # Layout to the parent rows: # Property of a layout
(defclass Main [App] ;; build()の戻り値がメインのルートになる (defn build [self] (setv (. self root) (apply Button {:text "BTN"})) ;; Buttonがルートになる (. self root)))
参考プログラム
Pong Game Tutorial
- https://kivy.org/docs/tutorials/pong.html
- とりあえず作ってみたが、サイズを変えたりするとNoneで落ちたりする
- 動作が安定しないのが謎
Kivyでテトリス
- https://github.com/mmueller/tetrivy
- PC上での操作性はもっと改良する必要がある気がする
- マネして作ってみてイベント操作性とか改良してみると結構勉強になる
Tips
キーボード入力のやり方 (Windowクラス利用)
- 上記のPongGameでやった方法を利用する
- https://stackoverflow.com/questions/17280341/how-do-you-check-for-keyboard-events-with-kivy
- https://github.com/kivy/kivy/blob/master/examples/widgets/keyboardlistener.py
キーボード入力のやり方 (FocusBehaviorクラス利用)
- mixin方式で、継承するクラスに追加する
- keyboard_on_key_down()でキー押下時のイベントが取得できる
- メンバ変数のfocusがTrueにならないとイベントが取得できないので注意
- focusがあたって無いとイベントが飛んでこないので、単純にキーイベントを取るだけだと使いづらい
- https://kivy.org/docs/api-kivy.uix.behaviors.html?highlight=behavior#module-kivy.uix.behaviors
Errors
"__no_builder"的なやつ
- https://www.cocept.io/blog/development/kivy-unexpected-keyboard-no-builder/
- superの呼び出し時にkwargsを渡さないと発生するらしい
履歴
Date | Notice |
---|---|
2017/11/12 | 初回作成 |
LxPupインストール
概要
家のゴミPC(EeePC初期型:容量4GB)にPuppyLinuxのLXDE版をインストールした際の話
インストール
なぜLxPupなのか?
容量的に通常のLinuxだと明らかに足らない。軽いと思っていたBasixですら4GBが必要で、上記PCの表記上は容量が足りている様に見えるが、システム領域があるので実質4GB未満しか使えない。
PuppyLinuxは200MB未満でインストール可能なので、上記PCでも余裕でインストール可能。(LxPupは300MBぐらい)
派生のLxPupにした理由は、PuppyLinuxのデスクトップがゴチャゴチャしているのと、アイコンのデザインが好きに慣れないから。
ダウンロード
ダウンロードはリンクより可能。今回は16.08.2のisoを落とした。
設定
- メニュー → セットアップ → Puppyユニバーサルインストーラを選択
- SDカード領域を選択する
- 領域を適当に初期化する。(bootの設定を入れる様にする)
- インストール時にファイルの指定を迫られるので以下のファイルを指定
- /initrd/mnt/tmpfs/puppy_lxxenial_XX.XX.sfs
- 以下の4ファイルをUSBからコピーしてインストール先に突っ込む(今回は/mnt/sda1)
- initrd.gz
- vmlinuz
- puppy_lxpup_XX.XX.sfs
- zdrv_lxpup_XX.XX.sfs
- メニュー → システム → Grub4Dosブートローダの設定を起動する
- 上記ファイルを入れておくと場所(/mnt/sda1)を認識してくれる筈
- lang_pack_ja-2.1.sfsをリンクから落としてタブルクリックでインストール
- 再起動
アプリケーション等
その他
- ユーザ領域をどのぐらいのサイズにするか?
- 2Gにすると起動が遅くなったので、1Gぐらいがいいのか?
- PETgetマネージャでインストールできないものが結構ある(vimがダメだった)
- 本体の電源で切ると、次回起動時に立ち上がらない事がある(EeePC側の問題か?)
- 起動が不安定
まとめ
良い子のみんなはマネしないで、もっといい中古のPCを買おう。