NandGame が面白過ぎて年末年始ハマった その4
NandGame 完結編
今まで 3 回に渡って解いてきた NandGame もついに完結である。もはや年末年始でも何でもないが、そこは気にしない。
せっかくなので、今までの記事へのリンクも貼っておく。
ちなみに、今回もバリバリネタバレ全開なので、まさかいないとは思うが万一まだゲームをやっていない方は是非コンプリートしてから読んで欲しい。
Processor
プロセッサである。いよいよ大詰めだ。
Combined Memory
「コンバインドメモリー」だそうだ。良く分からないが、レジスタとメモリをぶっこんだもののようだ。
とは言え構成するのは何も難しいことはなく、せいぜい既製品の register に惑わされずに自作部品の register を使用すればいいだけだ。
195 Nand + 63488 Nand で正解だ。
ちなみに、RAM の部分は別にカウントしてくれるらしい。
Instruction Decoder
命令デコーダである。
入力のビット 15 の状態によって、W の側に出すか W じゃない側に出すかを決めるようだ。
出すか出さないかを切り替えると言う事であれば、構成済みの mask inv 16 が使えるかと思いきや、なんとツールボックスに inv 16 が無い。
さすがに意味なく全く同一の inv 16 を作るのもしゃくなので、仕方なく mask 16 を作ろうかと思ったが、よくよく考えるとビット 15 は制御に使用されているのでマスク対象とする必要がない。つまりここで必要なのは mask 15 だ。
ここでは制御ビットも mask 15 の中で生成してしまった。これだと W じゃない側に使えないじゃないか、と思われるかもしれない。だが、勘のいい方はすでに気付いていると思うが、W じゃない側は出力が 14 ビットしかない。しかも、ci は制御ビットである。つまり W じゃない側のために mask 13 も必要なのだ。
そしてこれらを使用して命令デコーダを構成する。
オーケー、59 Nand だ。ちなみに、ちょっと出力の右側が隠れてしまっているが、まっすぐ繋がっているだけなので見えなくても問題ないと思う。
しかしこれで満足してはいけない。気になるのは出力 a の部分だ。こいつだけ他のビットと違って、ビット 15 が 0 の時には 1 を出力しなければならないので、このような構成になっている。
入出力を整理するとこのようになる。
入力ビット 15 | 入力ビット 5 | 出力 a |
---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 0 |
1 | 1 | 1 |
つまり、これはビット 5 を反転して Nand すればいいだけだ。めんどうなのでこれも mask 13 に入れてしまおう。(mask とは…) | ||
そして、これを使うと命令デコーダはこのようになる。 | ||
オーケー、57 Nand でエンドだ。 |
Control Unit
制御ユニットである。メモリも含めて制御ユニットと呼ぶのはどうなんだろう、と思わなくもないが、それは置いておくとしよう。
こいつも構成するのは難しくはない。せいぜい既製品の select 16 に惑わされなければいいだけだ。
オーケー、837 Nand + 63488 Nand で完了だ。
なお、例によって嫌がらせのようにツールボックスに Inv が無いので Nand で代用してある。
Program Engine
プログラムエンジンだそうだ。最早何の説明も必要ないだろう。
220 Nand で終了だ。
ちなみに、ROM はノーカンらしい。
Computer
ついに来た。コンピュータだ。これも何の説明も必要ないだろう。
1057 Nand + 63488 Nand でエンドだ。
Input and Output
入出力である。入力にマスクが必要な事以外、何の工夫の余地もない。
なお、もう気付いていると思うが、mask 7 が必要になる。
あとは組むだけだ。
17 Nand でミッションコンプリートだ。
Arithmetics(Optional Levels)
せっかくなので、Optional Levels もやってしまおうと思う。
とは言っても、Nor、Xnor、Left Shift は取り立てて見るところもないだろうから、Logic の方はスキップとさせていただく。
Multiplication
乗算器である。筆算と同様、桁をずらしては加算を繰り返すだけだ。まあ Nand 数は多くなるだろうが、これまで散々自作部品を構成して来たので恐れることは何もない。
と言うわけで、まずは「桁をずらしては加算」を行う shift add を構成する。
S はひとつ前の加算結果、A は加算する数、L0 は加算するか否かを決定するビットだ。特に難しいことはしていない。例によって既製品に惑わされずに自作部品で固めている。なお、加算の前に A をシフトしているのがポイントだ。
これをもりもり使って構成したのがこれだ。
最下位だけはひとつ前の加算結果が無いため、shift add を使用せずに mask inv 16 と inv 16 を使用している。
これで 2597 Nand だ。
ついに終わった
NandGame、どうだっただろうか。Nand を大切に思う心は育っただろうか。
なお、重ね重ねのお願いになるが、もしこれらよりも少ない Nand で解けたら是非教えて欲しい。
Discussion
Can you do the Input and Output one again? They updated it and I can't find the solution for the life of me and it is really stumping me.