中級その3
こんにちは!このページは「コンピュータサイエンスと魔法のYコンビネータ」という記事の10ページ目です。1ページ目から読むにはこちらからどうぞ。

コンピュータサイエンスと
魔法のYコンビネータ

中級その4: 1を足せない?

スライド 1 / 9

前回の復習

前回は、 サヤちゃんの弁当箱を使うことで、計算箱の「1を足す機能 」を再現できることを学びました。

サヤちゃんの弁当箱と、
に変換できる弁当箱を
合体させて実行すると、
1
に変換できる弁当箱
1
13
2
23
1
に
変換できる弁当箱になる
に変換できる弁当箱

それでは、話を進めましょう!

他のページをお探しですか?

中級その3·
·中級その5
スライド 2 / 9

サヤちゃんの疑問

サヤちゃんは、あることに気が付きました。

ねえねえ、見てほしいものがあるんだけど。

まず、これは に変換できる弁当箱だよね。

右下には がついた が「1個」
→ 計算箱に変換すると になる
1
1

うん、そうだけど、それがどうしたの?

これを、前回サヤが考えた「1を足す機能 」を再現できる弁当箱と合体させて、実行するとどうなると思う?

「1を足す機能 」を再現できる
弁当箱と合体させて…
1
1
1
1
13
2
23
1
実行 するとどうなる?

そりゃあ、 を計算できるんだから、 に変換できる弁当箱になるに決まっているだろう?

に変換できる
弁当箱になるはず…?

じゃあ、実行 してみてよ!

スライド 3 / 9

実行してみると…

それでは、実行 を押してみてください。最後までスキップすることも可能です。

1
1
1
1
13
2
23
1

実行を終えたので、 計算箱に変換 したいところですが…

残念ながら、この弁当箱はぼくが計算箱に変換することができません。

計算箱に変換できない
12
2
1

理由は、以下の法則に沿っていないからです。

一番左の料理を 、
真ん中の料理を とした場合、
右上に がひとつあり、
右下に がいくつかある
がひとつ
がいくつか

右上には の料理が「ひとつだけ」ある必要があります。しかし、ここでは の料理がふたつもあるので、計算箱に変換できないのです。

右上に がふたつあるので、
計算箱に変換できない
12
2
1

お、おかしい…なんで に変換できる弁当箱にならないんだ?前回はちゃんとできていたのに…

スライド 4 / 9

上 と 中 に同じ料理があると、結果が狂う

では、ここでネタばらしをしましょう。

まず、先ほどの失敗した弁当箱に 上 左 中 右 の印をつけてみます。

上 左 中 右 の印をつけます
1
上
上
1
上
上
1
å·¦
1
中
中
13
右
2
右
右
23
右
1

ここで、上 と 中 の両方に、サンドイッチ があるのに注目してみてください。

上 と 中 の両方にサンドイッチ がある
1
上
上
1
上
上
1
å·¦
1
中
中
13
右
2
右
右
23
右
1

実は、このように 上 と 中 に同じ料理があると、実行結果が狂ってしまうのです。

実行結果が狂ってしまうから、 を計算できない、ということになります。

上中
上 と 中 に同じ料理があると、
実行結果が狂う

(先ほどの場合はサンドイッチ が
上 と 中 両方にある)

へー、そうなんだ!どうして結果が狂うの?

この例だと複雑すぎて説明が難しいので、簡単な例を使って説明しますね!

スライド 5 / 9

上 と 中 に同じ料理がない場合とある場合

では、簡単な例で説明します。次のふたつの例をご覧ください。

  • 左側は、上 と 中 が違います。
  • 右側は、上 と 中 が同じサンドイッチ です。

それぞれを進めてみますね。

上 と 中 が違う
2
1
上
å·¦
12
中
右
2
1
上
å·¦
12
中
右
2
1
上
å·¦
12
中
右
2
1
上
å·¦
12
下の料理が違う
1
1
上 と 中 が同じ
2
1
上
å·¦
12
中
右
2
1
上
å·¦
12
中
右
2
1
上
å·¦
12
中
右
2
1
上
å·¦
12
下の料理が同じ
1
1

左側は、下のふたつの料理が違うけど、右側は下のふたつの料理が同じになった!

そうなんです。このまま最後まで実行すると、

  • 左側は 右 の ハンバーガー が残るのに対し、
  • 右側は 上 の チキン が残ります。
1
上
å·¦
1
右
1
上
å·¦
1
1
上
å·¦
1
右
1
上
å·¦
1
右
1
上
å·¦
1

最初と最後だけをピックアップすると、以下のようになります。

上 と 中 が違う
2
1
上
å·¦
12
中
右
上 と 中 が同じ
2
1
上
å·¦
12
中
右

というわけで、上 と 中 に同じ料理がない場合とある場合で、最終的な結果が狂ってくることがお分かりいただけたでしょうか。

上中
上 と 中 に同じ料理があると…
実行結果が狂う
スライド 6 / 9

話を戻すと…

では、先ほど を計算できなかった弁当箱に話を戻しましょう。

上 と 中 の両方にサンドイッチ があるので、結果が狂うのですね。

を計算できなかった理由:
上 と 中 の両方にサンドイッチ が
あるせいで、結果が狂ったから
1
上
上
1
上
上
1
å·¦
1
中
中
13
右
2
右
右
23
右
1

じゃあ、どうすればいいんだろう?

上 と 中 のどちらかのサンドイッチ を別の料理に変えれば、上手くいくというわけだよね。

じゃあ…ミニオンさんお願い!特別ルールを設けてくれないかな?

どういうことですか?

「弁当箱のパズル 」に、「上 と 中 に同じ料理が登場したら、どちらかを別な料理に変える」という特別ルールを設けてほしいんだ。

上中
上 と 中 に同じ料理が登場したら、
どちらかを別な料理に変える

という特別ルールを設けてほしい

分かりました、いいですよ!

やったー、ありがとう!

え、そんなに簡単にルールを改変してくれるの…?

スライド 7 / 9

特別ルール

それでは、

  • 上 と 中 に同じ料理が登場したら、
  • 自動的に 上 を、まだ使われてない料理にランダムに変える。

という特別ルールを設けましょう。

上
上 と 中 に同じ料理が登場したら、
自動的に 上 がまだ使われてない料理に
ランダムに変わる

つまり、先ほどのように サンドイッチ が 上 と 中 両方に登場した場合…

上 中 に同じ料理があります
1
上
上
1
上
上
1
å·¦
1
中
中
13
右
2
右
右
23
右
1

上 の サンドイッチ が自動的に別の料理に変わります。

上
上 のサンドイッチ が、
自動的に別の料理に変わる

じゃあ、何の料理に変わるの?

これは、まだ使われていない料理にランダムに変わります。ここでは、フライドポテト になります。

上上
まだ使われていない
フライドポテト に変わる
特別ルール: 上 を別の料理に
1
上
上
1
上
上
1
å·¦
1
中
中
13
右
2
右
右
23
右
1

これで、上 と 中 が被らなくなった!

では、最後まで進めてみましょう。実行 を押してみてください:

1
上
上
1
上
上
1
å·¦
1
中
中
13
右
2
右
右
23
右
1

やった!無事、 に変換できる弁当箱になった!

右下には がついた が「2個」
→ 計算箱に変換すると になる
12
2
1

ということは、 を計算できたということだね!

その通りです。では、そろそろ今回のまとめに入りましょう!

スライド 8 / 9

まとめ

前回サヤちゃんが考えた「1を足す機能 」を再現できる弁当箱は、

サヤちゃんが考えた
「1を足す機能 」を
再現できる弁当箱
13
2
23
1

次の に変換できる弁当箱と合体させた場合、

右下には がついた が「1個」
→ 計算箱に変換すると になる
1
1

上 と 中 に同じ料理があり、そのままだと結果が狂ってしまいます。

上 と 中 の両方にサンドイッチ がある
1
上
上
1
上
上
1
å·¦
1
中
中
13
右
2
右
右
23
右
1

しかし、今回から新たに以下の特別ルールが適用されます:

  • 上 と 中 に同じ料理が登場したら、
  • 自動的に 上 を、まだ使われてない料理にランダムに変える。
上 中 に同じ料理があります
1
上
上
1
上
上
1
å·¦
1
中
中
13
右
2
右
右
23
右
1
特別ルール: 上 を別の料理に
1
上
上
1
上
上
1
å·¦
1
中
中
13
右
2
右
右
23
右
1

これにより、正しく を計算できるようになります。

うーん、理解はできたけど、この特別ルールは忘れてしまいそうだなあ…

ご心配なく!この特別ルールは次のページ以降で登場する弁当箱でも使われますが、暗記する必要はありません。実行中に自動で行われますから。

なんとなく「こういう法則があるんだな」と思ってくだされば大丈夫です!

スライド 9 / 9

これで完璧!

いろいろあったけど、これで、 「1を足す機能 」 を再現できる弁当箱は完璧にマスターしたぞ!

悪魔よ、約束通り計算箱は返してもらう!

うぐぐ…

果たして、村人たちは計算箱を取り戻せたのでしょうか?次のページで確かめてみましょう!

次のページへ進む中級その5へ
中級は残り1ページです!

ひと休みする前に

お願い:「長いのでひと休みしよう」とお考えの方にお願いがあります。

差し支えなければ、このページを閉じる前に下のツイートをリツイートしてくださると、宣伝になるので非常に助かります。もしくは、「中級その4までは読み終えた」と引用リツイートしてくださると、さらに励みになります。図々しいお願いで恐縮です。

また、本稿の内容について質問がございましたら、上のツイートにスクリーンショット付きで返信してくだされば最優先で対応します。メール(shu@chibicode.com)でもお答えできますが、返事が遅れる可能性が高いです。

次のページへ進む中級その5へ
中級は残り1ページです!

著者: 上杉周作 (ブログはこちら)
公開日:
ソースコード: GitHubで公開中
英語版: 英語版はこちら

中級その3
プライバシーポリシー · 当サイトについて · Twemoji