Hylangで蟻本

Hylangで蟻本をやる

蟻本って何?

 プロコンの勉強本としてお馴染みのプログラミングコンテストチャレンジブック(通称:蟻本)

プログラミングコンテストチャレンジブック [第2版] ?問題解決のアルゴリズム活用力とコーディングテクニックを鍛える?

プログラミングコンテストチャレンジブック [第2版] ?問題解決のアルゴリズム活用力とコーディングテクニックを鍛える?

概要

 蟻本自体は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歳が書いた量子力学の教科書」の適当まとめ

概要

 後で見返して、こんな感じだったなーと思い返す用のまとめ。

12歳の少年が書いた 量子力学の教科書

12歳の少年が書いた 量子力学の教科書

適当まとめ(見返し用)

  1. 量子力学とは何か
  2. 万物の根源
    • 歴史的な流れ(古代〜)
    • 単位系の話
  3. 前期量子論
    • プランク〜ボーアの時代
    • 光は波か粒子か?
      • 光の二重性
    • コンプトン散乱
    • 教科書の物理モデルは間違い
      • ラザフォードの太陽系型原子モデル
      • ボーアモデル
    • ド・ブロイ
  4. 数学的定式化

  5. 内在的矛盾と解釈問題

  6. 量子力学の先へ

  7. 近未来応用への道

感想

  • 量子力学というか物理学自体に明るくないが、なんとなく概要はつかめるようになった気がする。
  • 数学的定式化の行列のところはある程度知識がないと辛いのではないかと感じた。
  • コレをベースに量子コンピュータの勉強をすすめることにする。

Pythonで代数学をやる

ライブラリ

ライブラリ Version 説明
Sympy 1.1.1 代数計算
NetworkX 2.0 グラフ理論

概要

 PythonMaximaMathematicaのような代数計算ができるライブラリであるSympyとグラフ理論用のライブラリであるNetworkXを使ってみたかった。
 そのうちmatplotlibと連携してグラフとか出力してみたい。

導入

  • pipでインストールできる

はじめに

実践

Tips

参考

TODO

  • NetworkXを触っていないので後日なんか作る

Tidalに入門したかった

概要

  • プログラミングで音を奏でられる&LiveCodingができるということで、Tidalをインストールしようとしたがダメだったのでメモしておく

環境

Softwares Version
Basix(OS) 3.0
Stack 1.3.2
SuperCollider 3.6.2

インストール

ダメだった点

まとめ

  • これ以上はめんどくさいので、とりあえず保留
  • 後日再挑戦する

Kivy備忘

Kivy使い方メモ

概要

  • PythonGUI作成ライブラリとしてKivyが注目されているのでやってみた
  • 実装はPythonではなく、hylangで行う

環境

App Version
Python 3.5.2
hylang 0.13.0

Install

作成メモ

デフォルトで読み込まれるkvファイル

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

Kivyでテトリス

  • https://github.com/mmueller/tetrivy
  • PC上での操作性はもっと改良する必要がある気がする
  • マネして作ってみてイベント操作性とか改良してみると結構勉強になる

Tips

キーボード入力のやり方 (Windowクラス利用)

キーボード入力のやり方 (FocusBehaviorクラス利用)

Errors

"__no_builder"的なやつ

履歴

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を落とした。

設定

  1. メニュー → セットアップ → Puppyユニバーサルインストーラを選択
  2. SDカード領域を選択する
  3. 領域を適当に初期化する。(bootの設定を入れる様にする)
  4. インストール時にファイルの指定を迫られるので以下のファイルを指定
    • /initrd/mnt/tmpfs/puppy_lxxenial_XX.XX.sfs
  5. 以下の4ファイルをUSBからコピーしてインストール先に突っ込む(今回は/mnt/sda1)
    • initrd.gz
    • vmlinuz
    • puppy_lxpup_XX.XX.sfs
    • zdrv_lxpup_XX.XX.sfs
  6. メニュー → システム → Grub4Dosブートローダの設定を起動する
    • 上記ファイルを入れておくと場所(/mnt/sda1)を認識してくれる筈
  7. lang_pack_ja-2.1.sfsをリンクから落としてタブルクリックでインストール
  8. 再起動

アプリケーション等

  1. vimリンクを参照して、sfsを落としてインストールする

その他

  1. ユーザ領域をどのぐらいのサイズにするか?
    • 2Gにすると起動が遅くなったので、1Gぐらいがいいのか?
  2. PETgetマネージャでインストールできないものが結構ある(vimがダメだった)
  3. 本体の電源で切ると、次回起動時に立ち上がらない事がある(EeePC側の問題か?)
  4. 起動が不安定

まとめ

 良い子のみんなはマネしないで、もっといい中古のPCを買おう。

参考