SlideShare a Scribd company logo
1 of 38
Download to read offline
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

What's hot

kintone Café 名古屋 Vol.3 「マジでkintoneに恋する5秒前!?」
kintone Café 名古屋 Vol.3 「マジでkintoneに恋する5秒前!?」kintone Café 名古屋 Vol.3 「マジでkintoneに恋する5秒前!?」
kintone Café 名古屋 Vol.3 「マジでkintoneに恋する5秒前!?」kintone Café 名古屋支部
 
まんまとリレーションされた話
まんまとリレーションされた話まんまとリレーションされた話
まんまとリレーションされた話m ishizaki
 
kintone Café 名古屋 Vol.3 「寂しくないKintone」
kintone Café 名古屋 Vol.3 「寂しくないKintone」kintone Café 名古屋 Vol.3 「寂しくないKintone」
kintone Café 名古屋 Vol.3 「寂しくないKintone」kintone Café 名古屋支部
 
【kintone Cafe 名古屋】kintone×○○○の可能性
【kintone Cafe 名古屋】kintone×○○○の可能性【kintone Cafe 名古屋】kintone×○○○の可能性
【kintone Cafe 名古屋】kintone×○○○の可能性Hiroyasu Yamada
 
Pythonの10年と今、これから
Pythonの10年と今、これからPythonの10年と今、これから
Pythonの10年と今、これからHaruo Sato
 
OSS Study#19_LT
OSS Study#19_LTOSS Study#19_LT
OSS Study#19_LTNaoY-2501
 
3Dプリンタの出力は遅いのでどうにかしたい
3Dプリンタの出力は遅いのでどうにかしたい3Dプリンタの出力は遅いのでどうにかしたい
3Dプリンタの出力は遅いのでどうにかしたいNISHIMOTO Keisuke
 
ZendEngine Study Meeting @Tokyo
ZendEngine Study Meeting @TokyoZendEngine Study Meeting @Tokyo
ZendEngine Study Meeting @TokyoMasaki Fujimoto
 
【kintone Cafe 名古屋】kintone初心者がプラグイン作ってみた話
【kintone Cafe 名古屋】kintone初心者がプラグイン作ってみた話【kintone Cafe 名古屋】kintone初心者がプラグイン作ってみた話
【kintone Cafe 名古屋】kintone初心者がプラグイン作ってみた話Hiroyasu Yamada
 
なぜ科学計算にはPythonか?
なぜ科学計算にはPythonか?なぜ科学計算にはPythonか?
なぜ科学計算にはPythonか?Aki Ariga
 
Python研修の作り方 - teaching-is_learning-
Python研修の作り方 - teaching-is_learning-Python研修の作り方 - teaching-is_learning-
Python研修の作り方 - teaching-is_learning-BrainPad Inc.
 
自動化は仕様が9割(Zapier Meetup #0)
自動化は仕様が9割(Zapier Meetup #0)自動化は仕様が9割(Zapier Meetup #0)
自動化は仕様が9割(Zapier Meetup #0)Marina Suzuki
 
コボラーがPython始めてみた話
コボラーがPython始めてみた話コボラーがPython始めてみた話
コボラーがPython始めてみた話Yuuki Nakajima
 
Hokkaido.pm.casual #03 slide
Hokkaido.pm.casual #03 slideHokkaido.pm.casual #03 slide
Hokkaido.pm.casual #03 slideTohru Shinohara
 
WindowsでPython
WindowsでPythonWindowsでPython
WindowsでPythondrillan
 

What's hot (16)

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

Viewers also liked

PietでLISP処理系を書くのは難しい
PietでLISP処理系を書くのは難しいPietでLISP処理系を書くのは難しい
PietでLISP処理系を書くのは難しいHideaki Nagamine
 
Pietでlisp処理系を書くのは難しい 進捗報告
Pietでlisp処理系を書くのは難しい 進捗報告Pietでlisp処理系を書くのは難しい 進捗報告
Pietでlisp処理系を書くのは難しい 進捗報告Hideaki Nagamine
 
KMC JavaScriptから始めるプログラミング2016 第一回
KMC JavaScriptから始めるプログラミング2016 第一回KMC JavaScriptから始めるプログラミング2016 第一回
KMC JavaScriptから始めるプログラミング2016 第一回kyoto university
 
第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016kyoto university
 
ひまわり本7章
ひまわり本7章ひまわり本7章
ひまわり本7章CHY72
 
暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編京大 マイコンクラブ
 
FM音源をいじれるWebサービスを作った
FM音源をいじれるWebサービスを作ったFM音源をいじれるWebサービスを作った
FM音源をいじれるWebサービスを作ったCHY72
 
数値解析と物理学
数値解析と物理学数値解析と物理学
数値解析と物理学すずしめ
 

Viewers also liked (20)

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

More from Hideaki Nagamine

競技プログラミング練習会2015 Normal 第4回
競技プログラミング練習会2015 Normal 第4回競技プログラミング練習会2015 Normal 第4回
競技プログラミング練習会2015 Normal 第4回Hideaki Nagamine
 
競技プログラミング練習会2015 Normal 第3回
競技プログラミング練習会2015 Normal 第3回競技プログラミング練習会2015 Normal 第3回
競技プログラミング練習会2015 Normal 第3回Hideaki Nagamine
 
競技プログラミング練習会2015 Normal 第1回
競技プログラミング練習会2015 Normal 第1回競技プログラミング練習会2015 Normal 第1回
競技プログラミング練習会2015 Normal 第1回Hideaki Nagamine
 
競技プログラミング練習会2015 Normal 第2回
競技プログラミング練習会2015 Normal 第2回競技プログラミング練習会2015 Normal 第2回
競技プログラミング練習会2015 Normal 第2回Hideaki Nagamine
 
Gaucheでマクロを書こう
Gaucheでマクロを書こうGaucheでマクロを書こう
Gaucheでマクロを書こうHideaki Nagamine
 
On Lisp読書会2014 第3回「第2章 関数 (つづき)」
On Lisp読書会2014 第3回「第2章 関数 (つづき)」On Lisp読書会2014 第3回「第2章 関数 (つづき)」
On Lisp読書会2014 第3回「第2章 関数 (つづき)」Hideaki Nagamine
 

More from Hideaki Nagamine (7)

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

Pietソースコード精読