SlideShare a Scribd company logo
Pietソースコード精読
ID: hnagamin(長嶺英朗)
2015/05/24 第11回KMC学習発表会
おまえだれ
● ID: hnagamin(長嶺英朗)
– KMC-2回生
– KMC38第会計
● 京都大学工学部電気電子工学科2回
● Piet歴2ヶ月
Twitter: @hnagamin
GitHub: 1995hnagamin
今日話すこと
● Pietの概要
●
プログラミングするときに考えること
● ソースコードの解説(逆ポーランド記法電卓の実装)
Pietの概要
http://www.slideshare.net/KMC_JP/piet-46068527
を読め(終了)
プログラミングするときに考えること
●
最初からゴルフをしない
●
解くべき問題の難易度を下げる
– 超重要
– そもそも(人間が)Pietでできることはあまり多くない
– 徐々に難易度を上げていくと士気が落ちない
●
スタックの上での再帰
●
黒ドットが少ないと良いプログラムみたいなとこある
逆ポーランド記法電卓の実装
背景
● Pietでそれなりに(大きな|実用的な)プログラムを
書きたかった
● Pietはスタックの操作と相性が良いので、逆ポーラ
ンド記法数式計算を実装することは完成度の割に
難易度が小さそうだと思った
課題設定
●
とりあえず実装できることを確かめる
– キャンバスが余っても気にしない
●
1桁の数字の入力だけ受け付ける
– 複数桁の処理はつらい
●
四則演算くらいは実装する
●
知らない文字が出てきたらエラー処理
●
終了記号を使おう
– PietはEOFを受け取れない
課題
逆ポーランド記法の数式を入力として受け取り、
その計算結果を出力する
課題
受け付ける入力は以下とする
<stmt> := <expr> <DOT>
<expr> := <NUM> | <expr> <expr> <operator>
<operator> := <PLUS> <MINUS> <MULT> <DIV>
<NUM> [0­9]
<DOT> .
<PLUS> +
<MINUS> ­
<MULT> *
<DIV> /
方針
● 入力ストリームから1文字ずつ受け取る
●
受け取った文字が
– '.'ならスタックの先頭要素を出力
– 数字なら対応する数をスタックにpush
– 演算子ならスタックから2要素popして計算結果をpush
– どれにも当てはまらなければエラーとして終了(“E”と出力)
イメージ
stack<int> s;
while (true) {
char c = getchar();
if (c == '.') {
int ans = s.top();
cout << ans;
break;
} else if (isdigit(c)) {
s.push(c­48);
} else if (c == '+') {
int a = s.top();
s.pop();
int b = s.top();
s.pop();
s.push(a + b);
} else if (c == '­') { ...
イメージ
stack<int> s;
while (true) {
char c = getchar();
if (c ­ 46 == 0) {
int ans = s.top();
cout << ans;
break;
} else if (c > 47 && 58 > c) {
s.push(c­48);
} else if (c ­ 43 == 0) {
int a = s.top();
s.pop();
int b = s.top();
s.pop();
s.push(a + b);
} else if (c ­ 43 == 0) { ...
文字コード
* 42
+ 43
­ 45
. 46
/ 47
0 48
実装
// ここでデモを行う
さらなる高みへ
●
ソースコードのサイズを小さくしよう
– エラー処理は省こう
●
複数桁の入力を受け付けよう
課題
受け付ける入力は以下とする
<stmt> := <expr> <DOT>
<expr> := <NUM> | <expr> <expr> <operator>
<operator> := <PLUS> <MINUS> <MULT> <DIV>
<NUM> [0­9]+
<DOT> .
<PLUS> +
<MINUS> ­
<MULT> *
<DIV> /
(デリミタ) #Space
複数桁の入力
●
再帰する
● 保存している数を10倍しながら入力された数を
足しあわせていく
動作例
入力: “2014+”
スタック: [0]
動作例
入力: “014+”
スタック: [0,2]
入力を受け取る
動作例
入力: “014+”
スタック: [0,2]
保存している数を10倍する
0×10 = 0
動作例
入力: “014+”
スタック: [2]
足す
動作例
入力: “14+”
スタック: [2,0]
入力を受け取る
動作例
入力: “14+”
スタック: [20,0]
保存している数を10倍する
動作例
入力: “14+”
スタック: [20]
足す
動作例
入力: “4+”
スタック: [20,1]
入力を受け取る
動作例
入力: “4+”
スタック: [200,1]
保存している数を10倍する
動作例
入力: “4+”
スタック: [201]
足す
動作例
入力: “+”
スタック: [201,4]
入力を受け取る
動作例
入力: “+”
スタック: [2010,4]
保存している数を10倍する
動作例
入力: “+”
スタック: [2014]
足す
動作例
入力: “”
スタック: [2014,43(+)]
入力を受け取る
動作例
入力: “”
スタック: [2014,43(+)]
数字じゃないので終了
実装
さらなる高みへ
●
ゴルフをする
●
ロジックは変えない
●
コードの進む向きをうねらせる
実装
もう話すことがない
● Pietは楽しい
●
スタックで再帰するのは意外と簡単、意外と楽しい
– 2変数くらいまでだったらなんとなくいける
– 3変数以上でも多分何とかなる
●
書こう

More Related Content

PDF
Pietで競プロしよう
PDF
ドット絵でプログラミング!難解言語『Piet』勉強会
PDF
新しい世界の学び方 by @masaru_b_cl #nds55
PDF
MARICON発表資料
PPTX
【修正版】Django + SQLAlchemy: シンプルWay
PDF
Webアプリを並行開発する際のマイグレーション戦略
PDF
PinP機能をWebRTCで実現できるか検証してみた
Pietで競プロしよう
ドット絵でプログラミング!難解言語『Piet』勉強会
新しい世界の学び方 by @masaru_b_cl #nds55
MARICON発表資料
【修正版】Django + SQLAlchemy: シンプルWay
Webアプリを並行開発する際のマイグレーション戦略
PinP機能をWebRTCで実現できるか検証してみた

What's hot (16)

PPTX
kintone Café 名古屋 Vol.3 「マジでkintoneに恋する5秒前!?」
PPTX
まんまとリレーションされた話
PPTX
kintone Café 名古屋 Vol.3 「寂しくないKintone」
PPTX
【kintone Cafe 名古屋】kintone×○○○の可能性
PPTX
Pythonの10年と今、これから
PDF
OSS Study#19_LT
PDF
3Dプリンタの出力は遅いのでどうにかしたい
PPTX
ZendEngine Study Meeting @Tokyo
PPTX
【kintone Cafe 名古屋】kintone初心者がプラグイン作ってみた話
PDF
S03 t4 wrapup
PDF
なぜ科学計算にはPythonか?
PDF
Python研修の作り方 - teaching-is_learning-
PPTX
自動化は仕様が9割(Zapier Meetup #0)
PPTX
コボラーがPython始めてみた話
PPT
Hokkaido.pm.casual #03 slide
PDF
WindowsでPython
kintone Café 名古屋 Vol.3 「マジでkintoneに恋する5秒前!?」
まんまとリレーションされた話
kintone Café 名古屋 Vol.3 「寂しくないKintone」
【kintone Cafe 名古屋】kintone×○○○の可能性
Pythonの10年と今、これから
OSS Study#19_LT
3Dプリンタの出力は遅いのでどうにかしたい
ZendEngine Study Meeting @Tokyo
【kintone Cafe 名古屋】kintone初心者がプラグイン作ってみた話
S03 t4 wrapup
なぜ科学計算にはPythonか?
Python研修の作り方 - teaching-is_learning-
自動化は仕様が9割(Zapier Meetup #0)
コボラーがPython始めてみた話
Hokkaido.pm.casual #03 slide
WindowsでPython
Ad

Viewers also liked (20)

PDF
Pietのエディタを作った話
PDF
PietでLISP処理系を書くのは難しい
PDF
Pietでlisp処理系を書くのは難しい 進捗報告
PDF
KMC JavaScriptから始めるプログラミング2016 第一回
PDF
第2回 JavaScriptから始めるプログラミング2016
PDF
C#でゲームを作る2016 第3回
PPTX
ひまわり本7章
PDF
C#でゲームを作る2016 第5回
PDF
お絵かきをはじめよう!
PDF
C#でゲームを作る2016 第7回
PDF
C#でゲームを作る2016 第1回
ODP
PDF
C#でゲームを作る2016 第8回
PDF
暗号技術入門 秘密の国のアリス 総集編
PDF
FM音源をいじれるWebサービスを作った
PPTX
hideya流 テストプレイ観察術
PDF
数値解析と物理学
Pietのエディタを作った話
PietでLISP処理系を書くのは難しい
Pietでlisp処理系を書くのは難しい 進捗報告
KMC JavaScriptから始めるプログラミング2016 第一回
第2回 JavaScriptから始めるプログラミング2016
C#でゲームを作る2016 第3回
ひまわり本7章
C#でゲームを作る2016 第5回
お絵かきをはじめよう!
C#でゲームを作る2016 第7回
C#でゲームを作る2016 第1回
C#でゲームを作る2016 第8回
暗号技術入門 秘密の国のアリス 総集編
FM音源をいじれるWebサービスを作った
hideya流 テストプレイ観察術
数値解析と物理学
Ad

More from Hideaki Nagamine (7)

PDF
フェーザとか
PDF
競技プログラミング練習会2015 Normal 第4回
PDF
競技プログラミング練習会2015 Normal 第3回
PDF
競技プログラミング練習会2015 Normal 第1回
PDF
競技プログラミング練習会2015 Normal 第2回
PPTX
Gaucheでマクロを書こう
ODP
On Lisp読書会2014 第3回「第2章 関数 (つづき)」
フェーザとか
競技プログラミング練習会2015 Normal 第4回
競技プログラミング練習会2015 Normal 第3回
競技プログラミング練習会2015 Normal 第1回
競技プログラミング練習会2015 Normal 第2回
Gaucheでマクロを書こう
On Lisp読書会2014 第3回「第2章 関数 (つづき)」

Pietソースコード精読