Upgrade to Pro — share decks privately, control downloads, hide ads and more …

赤間仁志さんのプラレールによる半加算器

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Hidemi KAWAI Hidemi KAWAI
November 02, 2016
880

 赤間仁志さんのプラレールによる半加算器

Avatar for Hidemi KAWAI

Hidemi KAWAI

November 02, 2016

Transcript

  1. おことわり • このスライド資料は主に川合が社内での説明の ために作ったもので、完成度がほどほどになって おります。すみません。 – 時間をかけていいものを作るよりも、早く概要をお知ら せすることを優先したためです。 • 資料内に出てくるプラレールの写真は、ver.1.0の

    もので、最新のver.1.1とは一部違っております。 • どうしても写真では分かりにくい部分があります。 それは是非実物で確認してください。 – [サイボウズ以外の方へ] 社外で展示することもありま すので、検索などで調べてみてください!
  2. 赤間仁志さんについて • 2015年度 サイボウズ・ラボユース生 – プログラミング言語を開発 – 川合が指導担当 • なぜプラレールをサイボウズ社内で?

    – ラボユース生の卒業プレゼントで、「広い社内で のびのびとプラレールする権利+レール購入費」 をプレゼントしたからです!
  3. 半加算器とは? • 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ビットの和を算出する仕組みは 「全加算器」と呼ばれる
  4. 今回の半加算器の仕様 • (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
  5. 半加算器の説明 下: A 上: B 下: C 上:S 下: スタート位置

    自動ターン アウトレール 3階建て-1 自動ターン アウトレール 3階建て-2 2階: X Y 2階: Z ここはお金が かかっていて かっこいい 自動ターンアウ トレールが6個も 並んでいる! XYZについて は後述
  6. 右上を拡大(ちなみに演算後) • 重要な部分が 集まっている場所 です 入力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階)
  7. A = 0 の場合(1) • (1) まず、電車 は図の経路を 通り、X=0にした あと、Aの場所

    に戻ってきます A(1階) X 自動ターンアウト レール-1 (2階) 電車の進行方向 スタート位置 ここから出発
  8. A = 0 の場合(2) • (2) 次に、電車 は図の経路を 通り、Y=0にした あと、Aの場所に

    戻ってきます A Y 自動-1(2階) 自動-2(2階) ここから出発
  9. A = 0 の場合(3) 補足 • なぜ X=0 を二度やるのですか? –

    本当は二度やる必要はないです – 自動ターンアウトレールが交互に切り替わるので、 やむを得ないのです
  10. A = 0 の場合(4) • (4) 次に、電車は 図の経路を通り、 Z=0にしたあと、 Bの場所へ行きま

    す(後半へ続く) A(1階) Z 自動-1(2階) 自動-2(2階) 2階 2階 3階 3階 2階 ここから出発 B(2階) 複雑なので実物を指で 追う方が分かりやすいです
  11. A = 1 の場合 • A=0の場合と同様に、X, Y, Zをそれぞれ1にして いきます –

    自動ターンアウトレールの1階を使うところが違い ます(A=0の場合は2階を使っていました) – A=0の場合と同様に、X=1は二度実行してしまいま す – 図を作るのが面倒なので、図は省略します(すみ ません!)
  12. B = 0 で A = 0 の場合 • (1)電車は図の

    経路を通り、Xの 値に応じて分岐 します ゆえにS=0になる そしてBの位置に 戻ります B(2階) S(2階) X 自動-1(3階) ここから出発 これも複雑
  13. B = 0 で A = 1 の場合 • (1')電車は図の

    経路を通り、Xの 値に応じて分岐 します ゆえにS=1になり そしてBの位置に 戻ってきます B(2階) S(2階) X 自動-1(3階) ここから出発 これも複雑
  14. ここまでのまとめ • 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
  15. 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
  16. 考察(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)に行きます
  17. 考察(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入力へ)
  18. 考察(4) • 自動ターンアウトレールを使ったループ構造 自動 自動 スタート位置 1回目と3回目 2回目 4回目 ①

    ② ③ 自動ターンアウトレールは、あらかじめすべて直進状態で初期化しておく 自動ターンアウトレールは、「切り替わってから分岐する」ので、最初は曲がる 上図だと、①→②→①→③の順に電車が走る ③を抜けた時点で、自動ターンアウトレールはすべて直進状態に戻っている (Xの設定) (Yの設定) (Zの設定)
  19. 考察(6) • X, Y, Zの原理(混線をさける仕組み) Xなど 改造レール 改造レール 改造レール ①から入るとXに0を書き込んで③へ抜けます

    ②から入るとXに1を書き込んで③へ抜けます ④から入るとXの値によって⑤か⑥へ分岐します (混線=読むときと書くときとで、経路が混ざってしまうこと)
  20. 補足 • 考察(6)で「混線」を避ける必要があるのはな ぜか? – たとえば、Aの値がXにコピーされる – Sの値を計算するために、Xの値を逆走することで 参照するとき、もし混線をさける仕組みがなけれ ば、結局電車は単にA地点に戻る

    • Xの値が0か1であるかに関わりなく – 何もしないまま同じ場所に戻ってしまっては、Xの 値によって結果を変えることができない – それではSの計算なんてできない