Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
赤間仁志さんのプラレールによる半加算器
Search
Hidemi KAWAI
November 02, 2016
0
700
赤間仁志さんのプラレールによる半加算器
Hidemi KAWAI
November 02, 2016
Tweet
Share
More Decks by Hidemi KAWAI
See All by Hidemi KAWAI
C言語でメモリ管理を考えた話
hkawai
0
570
超軽量型プログラミング言語 ES-BASIC
hkawai
0
1.4k
OSASK計画が考える新しいプログラミング言語の構想
hkawai
1
1.2k
OSECPU-VMの資料
hkawai
0
590
20130806a
hkawai
0
290
20120823a
hkawai
0
860
20120326a
hkawai
1
980
Featured
See All Featured
Building Adaptive Systems
keathley
38
2.3k
The World Runs on Bad Software
bkeepers
PRO
65
11k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
131
33k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
6.9k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
A Tale of Four Properties
chriscoyier
156
23k
Thoughts on Productivity
jonyablonski
67
4.3k
Optimising Largest Contentful Paint
csswizardry
33
2.9k
Mobile First: as difficult as doing things right
swwweet
222
8.9k
Happy Clients
brianwarren
98
6.7k
KATA
mclloyd
29
14k
Transcript
赤間仁志さんの プラレールによる半加算器 サイボウズ・ラボ株式会社 川合秀実
おことわり • このスライド資料は主に川合が社内での説明の ために作ったもので、完成度がほどほどになって おります。すみません。 – 時間をかけていいものを作るよりも、早く概要をお知ら せすることを優先したためです。 • 資料内に出てくるプラレールの写真は、ver.1.0の
もので、最新のver.1.1とは一部違っております。 • どうしても写真では分かりにくい部分があります。 それは是非実物で確認してください。 – [サイボウズ以外の方へ] 社外で展示することもありま すので、検索などで調べてみてください!
赤間仁志さんについて • 2015年度 サイボウズ・ラボユース生 – プログラミング言語を開発 – 川合が指導担当 • なぜプラレールをサイボウズ社内で?
– ラボユース生の卒業プレゼントで、「広い社内で のびのびとプラレールする権利+レール購入費」 をプレゼントしたからです!
半加算器とは? • 2進数における足し算(2つの入力) 0 + 0 = 00 0 +
1 = 01 1 + 0 = 01 1 + 1 = 10 ↑ こういう計算ができる仕組みが 「半加算器」と呼ばれる 入力A 入力B → 出力C 出力S 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 ちなみに、3つの1ビットの入力から計算して、2ビットの和を算出する仕組みは 「全加算器」と呼ばれる
プラレールとは? • タカラトミー製のおもちゃ • よくできている • 価格も手ごろ • とてもたのしい
0や1の表現方法 • どうやって0や1をプラレールで表現するか? – ターンアウトレール(ポイントレール)を使います 直進設定 → 0 を表す 曲がり設定
→ 1を表す
その他の主要なレール部品(1) • 直線レール、曲線レール、坂レール
その他の主要なレール部品(2) • 自動ターンアウトレール – 電池がなくても自動で交互に切り替わる優れモノ – 今回利用したレール部品としては、もっとも高価 – 2つのモードがある •
自動: 電車が通るたびに切り替わる(曲→直→曲→直・・・) • 固定: あらかじめ設定した分岐方向をずっと維持する
その他の主要なレール部品(3) • 改造ターンアウトレール – これは標準のレールとは違うものに見えるかもし れませんが、自動ターンアウトレールで固定モー ドにすれば同じ機能が得られます。今回はコスト 削減のために改造レールを利用しています。 左から入った場合は 必ず直進する
右や右上から入る場合 は問題なく左へ抜ける
0や1を読み取る方法 • ターンアウトレールの上を電車が通って、進 行方向が変わることで、電車の挙動を変える 左から電車が入ると、0か1かによって どちらに進むかが変わる
0や1を書き込む方法 • 先ほどとは逆の方向からターンアウトレール に進入すると、ターンアウトレールの状態を 変えることができる 右から電車が入ると、0に設定される 右上から電車が入ると、1に設定される
今回の半加算器の仕様 • (1) AとBに、0か1をセット(人間が手でやる) • (2) スタート地点から電車を走らせる • (3) 電車があれこれと走る
• (4) やがて電車はスタート地点に戻ってくる • (5) SやCが正しく計算されている! 入力A 入力B → 出力C 出力S 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0
半加算器の全景(ver.1.0)
半加算器の説明 下: A 上: B 下: C 上:S 下: スタート位置
自動ターン アウトレール 3階建て-1 自動ターン アウトレール 3階建て-2 2階: X Y 2階: Z ここはお金が かかっていて かっこいい 自動ターンアウ トレールが6個も 並んでいる! XYZについて は後述
右上を拡大(ちなみに演算後) • 重要な部分が 集まっている場所 です 入力A(1階) 入力B(2階) 入A 入B →
出C 出S 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 出力C(1階) 出力S(2階) スタート位置 (1階)
記号の説明 • ターンアウトレールA, B, C, S – 入力・出力用のレール • ターンアウトレールX,
Y, Z – 説明の便宜のための特別に名前を付けたレール
A = 0 の場合(1) • (1) まず、電車 は図の経路を 通り、X=0にした あと、Aの場所
に戻ってきます A(1階) X 自動ターンアウト レール-1 (2階) 電車の進行方向 スタート位置 ここから出発
A = 0 の場合(2) • (2) 次に、電車 は図の経路を 通り、Y=0にした あと、Aの場所に
戻ってきます A Y 自動-1(2階) 自動-2(2階) ここから出発
A = 0 の場合(2) 補足 • なぜ(1)とは違う経路に行ったのですか? – 自動ターンアウトレールの向きが変わったからです
A = 0 の場合(3) • (3) 次に、電車は 図の経路を通り、 再びX=0にした あと、Aの場所に
戻ってきます A X 自動-1(2階) ここから出発
A = 0 の場合(3) 補足 • なぜ X=0 を二度やるのですか? –
本当は二度やる必要はないです – 自動ターンアウトレールが交互に切り替わるので、 やむを得ないのです
A = 0 の場合(4) • (4) 次に、電車は 図の経路を通り、 Z=0にしたあと、 Bの場所へ行きま
す(後半へ続く) A(1階) Z 自動-1(2階) 自動-2(2階) 2階 2階 3階 3階 2階 ここから出発 B(2階) 複雑なので実物を指で 追う方が分かりやすいです
A = 1 の場合 • A=0の場合と同様に、X, Y, Zをそれぞれ1にして いきます –
自動ターンアウトレールの1階を使うところが違い ます(A=0の場合は2階を使っていました) – A=0の場合と同様に、X=1は二度実行してしまいま す – 図を作るのが面倒なので、図は省略します(すみ ません!)
ここまでのまとめ • A=0 の場合は、2階の2つの自動ターンアウト レールを通って、X=Y=Z=0になる • A=1 の場合は、1階の2つの自動ターンアウト レールを通って、X=Y=Z=1になる •
つまり、X, Y, ZにはAの値がコピーされる • そして電車はBへ向かう
B = 0 で A = 0 の場合 • (1)電車は図の
経路を通り、Xの 値に応じて分岐 します ゆえにS=0になる そしてBの位置に 戻ります B(2階) S(2階) X 自動-1(3階) ここから出発 これも複雑
B = 0 で A = 1 の場合 • (1')電車は図の
経路を通り、Xの 値に応じて分岐 します ゆえにS=1になり そしてBの位置に 戻ってきます B(2階) S(2階) X 自動-1(3階) ここから出発 これも複雑
B = 0 の場合 • (2)電車は図の 経路を通り、C=0 になります そしてスタート 位置に戻ってき
ます[終了] B(2階) C(1階) 自動-1(3階) ここから出発
ここまでのまとめ • B=0の場合、Bの位置から出発して、2周します – 1周目はXを参照してSを計算 – 2周目は無条件にC=0にしに行く – Cに値を設定し終わると、 スタート位置へ帰って
終了 • つまりB=0の場合は、Xしか見てません – YやZにもAの値をコピーしましたが使っていません • 自動-1(3階)だけを使います 入A 入B → 出C 出S 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0
B = 1 の場合 • B = 1 の場合も同様に計算していきます –
図は省略 – 1周目でSを計算(Yを参照) – 2周目でCを計算(Zを参照) – Cに値を設定し終わると、スタート位置へ帰って終了 • B=1の場合はXを参照しません – XにもAの値をコピーしましたが使っていません • 自動-2(3階)だけを使います 入A 入B → 出C 出S 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0
考察(1) • ターンアウトレールの状態が0や1を表現します • 電車が通過する・しないは数を表現しません – 電車は「今はここの計算をしています」という「プロ グラム・カウンタ」を意味しています
考察(2) • SやCの計算に当たっては、全く別の4つの経路 が用意されています – (1) B=0の時のS計算用の経路 – (2) B=0の時のC計算用の経路(C=0に固定)
– (3) B=1の時のS計算用の経路 – (4) B=1の時のC計算用の経路 • B入力のターンアウトレールによって(1)&(2)か、 (3)&(4)に行くかを最初に振り分けています • その後、3階の自動ターンアウトレールによって 1周目に(1)か(3)、2周目に(2)か(4)に行きます
考察(3) • A入力を読み取るループでは、X,Y,Zに値を コピー するだけで、SやCの計算はしていません • コピーのための6つの経路があります – (1) X=0にするための経路
– (2) Y=0にするための経路 – (3) Z=0にするための経路(&終わったらB入力へ) – (4) X=1にするための経路 – (5) Y=1にするための経路 – (6) Z=1にするための経路(&終わったらB入力へ)
考察(4) • 自動ターンアウトレールを使ったループ構造 自動 自動 スタート位置 1回目と3回目 2回目 4回目 ①
② ③ 自動ターンアウトレールは、あらかじめすべて直進状態で初期化しておく 自動ターンアウトレールは、「切り替わってから分岐する」ので、最初は曲がる 上図だと、①→②→①→③の順に電車が走る ③を抜けた時点で、自動ターンアウトレールはすべて直進状態に戻っている (Xの設定) (Yの設定) (Zの設定)
考察(5) • 合計すると4+6=10もの経路があり、しかもそ れらをうまく接続するために引き回しています • だから「たかが半加算器」なのに、こんなに複 雑で大規模なのです
考察(6) • X, Y, Zの原理(混線をさける仕組み) Xなど 改造レール 改造レール 改造レール ①から入るとXに0を書き込んで③へ抜けます
②から入るとXに1を書き込んで③へ抜けます ④から入るとXの値によって⑤か⑥へ分岐します (混線=読むときと書くときとで、経路が混ざってしまうこと)
考察(7) • 演算が終了するとスタート地点に戻ってくる • A, B, C, Sのすべてがスタート地点のそばにあ り、操作・確認しやすい •
これらは赤間さんが意識して工夫したそうで す。さすがです。職人芸です。
None
補足 • 考察(6)で「混線」を避ける必要があるのはな ぜか? – たとえば、Aの値がXにコピーされる – Sの値を計算するために、Xの値を逆走することで 参照するとき、もし混線をさける仕組みがなけれ ば、結局電車は単にA地点に戻る
• Xの値が0か1であるかに関わりなく – 何もしないまま同じ場所に戻ってしまっては、Xの 値によって結果を変えることができない – それではSの計算なんてできない