マイクラで回路を作る場合、信号強度などの数値が登場します。その為、処理を行う上においては、ゲーム内での挙動(仕様)とパーツの条件を知る必要があります。その上で、指定された数値をコントロールすると、作れる物が増えますが、マイクラでは、サバイバルのワールドでコーディングを行って何かを作る事はありませんが、回路を作ると、二値とレッドストーンの特性として存在する数値を使うことになります。
そこで、今回は、数値などについて触れようかなと思います。
等 式
物事を判断する場合に必ず必要になるのが、この概念ですが、算数では、数値が順番で増える事を学んだ後に計算を学びます。小学校に入ったらアラビア数字を学びますが、数は数値で表す事が出来る事なども学びます。この時に、
【 状態 】
● ● ● ● ●
【 数値 】
5個
と認知する訳ですが、この状態の認知は、
【 状態 】
● ● ● ● ●
【 数値 】
● が5個
となっているはずです。つまり、数値の認知は常に状態と一致しているという条件の判定によってこの認識ができているわけですが、これが学習になります。
その為、等式を学び前に物事を学習する段階で常に等式・不等式を用いた条件判定を行い、学習を行っているわけです。例えば、これが四則演算になったとします。そうすると、はじめて、右辺と左辺が一致するという 【 等式 】 の概念が登場しますが、そうした物を学ぶ前に、 【 状態と数値の認知で等式の処理を行っている 】 ので、定数同士の判定による条件の一致と言う認識については、数列の学習の段階で出来ているという事になります。
この数値の認識というのが、状態の一致ですから
のような物になります。アラビア数字を学び、十進数の推移を学んだ後は、左辺の状態が何個であるかを、同じものを並べるのではなく、十進数の数値で表記するようになります。この時の判定における最小単位は、
になりますが、等式とは 【 同じものは同じである 】 と言う至極当然な法則性を右辺と左辺の状態を演算記号で示したものになります。
この場合、数値で見ると、定数ですから、これは動きがありません。つまり、これは常にそのに存在する物であり、変化がないのでこの状態になります。この 【 動きのない物で状態が一致している 】 と言う等式が、 【 物体が 【 n個 】 あるという状態 】 のn個を数値で示した時の数の一致と言う認識になります。
小学校低学年で四則演算を学びますが、その時には、
のような物を学びます。
数 列
十進数を学ぶ場合、間違いなく
【 1づつ増加する等差数列 】
の形で数列を用いて、 【 1増えると数が変わる 】 と言う仕様を学習します。そうなると、 【 加算 】 については、この段階で数列の推移において学んでいるので、最も理解しやすいのは、その数値の変化と同じものという事になります。そうなると、前述のような足し算は数列の増加の応用分野ですから、数が増えると数値が変わるという学習をしていれば、その増加分の変化による数値の変化が発生するというのも理解しやすくなります。これが、学習における基礎分野の重要性になりますが、アラビア数字による十進数の表記と言う数列と言う増加する物を学んでいるので、足し算も理解しやすいという訳です。
この状態を見てみると、先ほどの
のような、推移のない物とは異なり、
には 【 増加 】 と言う推移があります。つまり、この場合、動的な変化が存在する場合の条件が左辺に存在しているわけです。つまり、
【 要素と結果を等式で示したもの 】
が数式になります。これが、算数の基礎である数式の構造になります。また、この条件は
【 アルゴリズムと結果が一致している状態を示したもの 】
になりますが、知識の根本は
と言う静的条件の一致とその認知とその記憶になるので、その条件の上で
のようなアルゴリズムと状態の一致を示す法則性を学んでいくことになります。そうなると、基本的に、学習と言うのは、状態の認知と等式による誤差のない状態の承認によって記憶する作業という事になります。
その上で、前述のようなアルゴリズムが発生した場合に対処できるように、数式や法則性を理解する必要があるので、基礎分野の理解の後に応用分野の学習を行う事になります。
数式を学ぶ前に数列を学びますが、小学校では個数を並べたグラフが登場します。
のような物ですが、これが数値の推移になります。数値の増加についてはこんな感じになりますが、算数を学ぶ前に 【 有無の概念 】 は知っているので、
のように何もない状態と何かがある状態は認識できています。つまり、
■ 何もない状態
空間上に何もない状態だと、状況としては存在しない
ので、認知の中で ”なし” と判定している。
また、動的な物ではなく静的な物なので、これはアルゴ
リズムによる推移が存在しないので、定数なので
■ 定数 = 0
となる。
■ 何かが存在する
空間上に何かがある状態と、状況としては存在するの
で、認知の中で ”なり” と判定している。
また、動的な物ではなく静的な物なので、これはアルゴ
リズムによる推移が存在しないので、定数なので
■ 定数 = 1
となる。
わけです。有無と言う判定は、二つの認知なので、0と1に置き換える事が出来ます。この判定は小学校に上がる前でも認知できる内容なので、二値の判定というのは、それ以前に生活の中で認識でいる物という事になります。この考え方を、空間座標で考えると、人が移動可能な条件としては空間が存在する事ですから、体積と質量と人が通過できないような密度をを持つ物が存在した場合、その場所は移動可能な条件から除外しています。つまり、足場がない場所を歩く事が出来ない事や、壁に向かって歩いて行っても壁の向こう側に移動することはできないなどがそれです。つまり、これは空間の条件における二値判定によって有無を判断して移動しているわけですが、この条件はアルゴリズムではなく、空間に存在する定数なので、その判断ができているわけです。この条件だと推移の理解ができないので、
のような等差数列を学ぶことになりますが、
のような形で、 【 整数の推移 】 を学ぶことになります。
ただし、このグラフの状態で算数の問題が出てきて3桁の計算をするような問題が出てきた場合、回答もこの状態で答えることになるので、
【 テストの採点をしているだけで膨大な時間を要する事になる 】
ので現実的ではありませんし、そもそも、この状態で数値が推移していた場合、扱いにくいので、便宜上、数列を扱う場合には、アラビア数字とその推移で示す事になります。
その為、算数で数字が登場した時には。
のような列と数の表記で登場します。ここでは、あえてアラビア数字を使っていませんが、整数の数列はこんな感じで数値の推移が並んだものになります。
奇 数と偶数
ここでは、上下に回路を分けていますが、
のようにするとその理由も解り易いと思いますが、下のランプが奇数で、上のランプが偶数になります。
■ 偶数
2で割り切れる数値
■ 偶数
2で割り切ない数値
になります。つまり、整数だと、2で割った時に1余れば奇数で、割り切れると偶数という事になります。この回路は都合上、左に向かって数値が推移していますが、通常は、
0,1,2,3,4,5,6,7,8,9
のように左から右に数値は推移します。数列についてはそうなっていますが、デジタルで扱う物の数値の変化も水平軸については殆どの物がそうなっています。これはグラフもそうですが、
のような推移になっています。この状態にすると状態が見づらいので、逆に作っていますが、
のように0は1よりも小さい場所にあります。奇数と偶数ですが
■ 偶数
2で割り切れる数値 => N=2a
■ 偶数
2で割り切ない数値 => N=2a+1
と言う構造体なので、aに任意の数値を入れた場合に、算出される数値は全て奇数になります。そうなると、aに0を入れた場合にNは1Nになりますから、0の場合、2で割って余りが出ることはありませんから、偶数という事になります。ちなみに、スプレッドシートには奇数と偶数を判定する関数が実装されており、EXCELの場合だと、
■ ISEVEN関数
偶数の判定をする関数
■ 偶数だとTRUE、奇数だとFALSE
■ ISODD関数
奇数数の判定をする関数
■ 奇数だとTRUE、偶数だとFALSE
がありますが、0を代入した場合、
■ ISEVEN(0) = TRUE
■ ISODD(0) = FALSE
となります。また、偶数の特性が2aとしましたが、これは、
奇数か偶数の同じ数字を二つ足した場合、その解は偶数になる
と言う特性を2と言う係数を用いて示したもの似なります。つまり、
2つの同じ数値を足す = その数値を2倍にする
なので、それが成立します。この条件を考えると、奇数というのはそれに1を足したものになるので、先ほどの条件が成立する訳です。その為、0の偶数性を考えると、 【 偶数として扱われていて偶数の特性がある 】 ので偶数という事になります。また、この法則性があるので、
奇数は2で割った時の剰余が1になる数値
という考え方もできます。これが、奇数と偶数の特性になります。
十 進数
数値の変化を学ぶ場合、日常で使うのは0-9で推移する十進数になります。先ほどの
をもう少し見やすくすると、
のようになりますが、桁が一つの場合だと、こんな推移になりますが、9以上の数値は、10になります。これは桁が繰り上がっているので、1の桁が0になり、一つ上の桁が1追加されているわけです。この桁のモデルで10を示すと
のような状態になります。右が9で左が10ですが、0-9までは、1桁で表現できますが、9以上になると、表記できないので桁が繰り上がる仕様になっています。数値を示す場合に、これが7本もあると大変なので、判断しやすく、扱いやすくするためにアラビア数字と桁の推移を学びます。十進数の信号のモデルで桁を用意すると画像のようになりますが、アラビア数字を使うと、
のようになるので、非常に扱いやすくなります。その為、算数では数値を桁数を持ったアラビア数字で表記します。
定 数と状態
小学校で整数の数列が登城しますが、定数の数値が存在する場合、
のように任意の数値で指定されます。ここでは、4を選択していますが、この数値は変化しないので定数になります。仮に、A個と言う個数がこの状態だとすると、数学的には等式の表記になるので、
■ A = 4
と表記できます。この場合、ブロックの数が4つなので4と言う認識と同じですが、整数の数列上で、整数の推移で考えた場合、この定数には特性があります。数値には、
【 隣接する数値との関係性が存在する 】
ので、数値の大小を判断できます。この条件だと、
のようにレッドストーンブロックとダイヤブロックを置いた場所が隣接する数値になりますが、
■ 4と言う整数の特性
■ 4は3よりも大きい
■ 4は5よりも小さい
という事が数列上で判断できます。この条件式は、一致とは異なるものになりますが、算数を学んでいなくても、
【 学校の建物は、自動販売機よりも大きい 】
のような概算による認知はできています。その為、条件判定においては、一致と言う検知だけでなく、大小の差異と言う判定も行っているわけです。これが、後に登場する 【 等式、不等式 】 になります。
この判断基準ですが、数列上の数値と同じなので、前述の条件を判定で用いることになります。数値の大小ですが、数列上の違いとして判断することもできますが、判定としては、
の4つがあります。これに一致を含めた5つが条件の判定になりますが、
■ 超過
■ 対象の数値を含まない状態でその数値よりも
多い状態
■ 以上
■ 対象の数値を含めた状態でその数値よりも多
い状態
■ 一致
■ 二つの対象が同じ数値
■ 以下
■ 対象の数値を含めた状態でその数値よりも少
ない状態
■ 未満
■ 対象の数値を含まない状態でその数値よりも
少ない状態
のようになります。この基準が、
のように対象の数値になりますが、一致する場合は等式なので、前述のとおりですが、以上と以下の場合には、その数値を含み、超過や未満だとその数値を含みません。
プログラミング言語では、この判定を 【 比較演算子 】 を用いて判定を行っていますが、数値を扱う場合には、こう言った処理を用いて条件の判定をすることになります。この基準が整数の数列になりますが、
のように数列上で隣接する物から向こう側が超過と未満になりますから、整数の判定の場合だと、
■ 超過の判定
整数の数列を基準とした場合、1づつ推移する数列
状の数値なので、 【 超過の判定 】 をする場合、
対象の値をAとした場合、
■ A+1よりも大きなの数値
が対象になるその為、対象がBの場合、
■ BからAを引いた場合に整数の余りが出る
場合、超過している事になります。
■ 未満の判定
整数の数列を基準とした場合、1づつ推移する数列
状の数値なので、 【 未満の判定 】 をする場合、
対象の値をAとした場合、
■ A-1よりも大きなの数値
が対象になるその為、対象がBの場合、
■ BからAを引いた場合に符号の付いた余りが出る
場合、その数値未満という事になります。
のような条件になります。これを以上にする場合には、超過と未満のそれぞれの条件にA=Bを含めた判定を入れることになります。そうなると、この場合、二つの判定が発生しますから、AND回路(論理積)で二つの条件を結ぶ必要があります。
条件の判定ですが、プログラミング言語の場合、二値判定の一致と不一致の判定は比較演算子で行えるので、
■ 一 致 : ==
■ 不一致 : !=
のように記述できます。また、先ほどの超過、以上、以下、未満については、
■ 超 過 : >
■ 以 上 : >=
■ 以 下 : <
■ 未 満 : <=
の記述で対応できるので、前述のようなアルゴリズムを実装して実行しなくても条件の判定は行えるようになっています。数値を用いた判定をする場合には、
のようなボーダーラインが存在し、その条件からどう言った状態なのか?を判断します。その時に、数列が理解できていないと、数値の大小の判定からできなくなるので、こう言った判定が出来なくなります。
また、桁については、
のような形で示しましたが、プラス方向に桁が増えると、桁の増加で、マイナス方向に増えると、小数点以下の数値になります。
プログラミング言語だと、
■ 整 数 : Integer , Long
■ 浮動小数点数 : flort , Double
がありますが、1づつ推移する十進数の数列を基準とした数値を圧場う場合には整数を用い、小数点以下の桁数を持つものだと、浮動小数点数を用います。ただし、財務演算のように桁が少ないと誤差が出る世な処理だと、Decimalを用いることになります。未実装のプログラミング言語だとライブラリなどが存在しますから、Decimalを追加して使用することになります。
基本的に、プログラミング言語を使う場合も数的な処理は行いますし、条件の判定では、比較演算子を用いるので、等式、不等式を用いた判定を行います。一致と不一致の場合だと、ブール型の判定と同じなので、電子回路的な判定になりますが、プログラミング言語の場合、これを数値や文字列で判定できるようになっているので、電子回路のような完全な二値の判定とは異なります。
ちなみに、
のような数式は、アルゴリズムになりますが、このブロックが変数だと仮定すると、結構いろいろな事が出来ます。つまり、結果を変数にして、数式側をアルゴリズムに指定しておけば、変数にはいろいろな数値を代入できることになります。この時に、
■ x = a + 1
のような感じで記述する事が出来ますが、これを 【 算術演算子 】 と呼びます。プログラムで計算機を作りたい場合だと、スプレッドシートの計算式と同じ記述で演算が行えます。
ちなみに、JavaScriptだと、%で剰余が表示で来たり、**でべき乗にできるのですが、Internet Explorer 11ではサポートされていません。この機能は 【 ES2016 】 で追加されたものになります。
n 進数と取り扱い
数学を学ぶ場合、十進数を用いますが、中学校になると指数が登場します。これが累乗と言う物になりますが、累乗については高校でさらに深く学ぶ事が出来るようになります。小学校で 【 数字の桁 】 について学びますが、この桁というのは、【 桁数は累乗の指数 】 なので、数値を示す場合、
【 小数点数 】 + 【 10の累乗 】
と言う形で表記で見ると思います。この形式が 【 浮動小数点数 】 の表記になりますが、コンピューターで数値を扱う場合には、この形の物を用います。この時の、指数の桁数が変数宣言時の型で変わってくるのですが、単精度と倍精度で指数が異なるので扱える数値も異なるわけです。
プログラミング教育が始まっているので、この浮動小数点数と言うのも全く見かけない物ではなくなっているとは思いますが、算数や数学で登場する円周率の3.14とか、√2の1.4.1421356などは、整数の後に小数点が続いていますが、これが固定小数点数になります。この場合、
■ 整 数
■ 固定小数点数
で桁の位置が変わってしまいます。しかし、
■ 100 : 1.0x10 2
■ 0.01 : 1.0x10-2
で表記できます。つまり、固定小数点数に10の累乗を掛け合わせると、一つのフォーマットで整数と小数点数の双方を表示できるようになります。その為、コンピューターでは浮動小数点数を用いた処理を行います。
これが桁の数になりますが、電子機器は電気信号のオンとオフで動作していますから、二値の判定になります。
これを二進数として桁を持たせることで、数値を作る事が出来るので、これをまとめて扱うと数値を作る事が出来ます。
のようにすると、個別のレジスタを持った状態になりますが、この状態で、各ビットに信号を送る事が出来ます。こえを二進数の桁として考えて、数値を作る事が出来るのですが、前述のように、桁は累乗の指数の増加として考える事が出来るので、2の累乗として扱えます。すると、各ビットのデータを桁に置き換えると、
のように推移します。その為、変数aをa= a++のような感じで、いくるーどの指定にして、
■ y = x a
のような状態にすると画像のような推移が発生します。これは、指数関数なので、
■ y = aX
と書いた方が馴染みがありそうですが、基本的に、n進数の桁数と言うのは指数関数という事になります。2進数のデータですが、
のように4ビットのデータで10と言う数値が作れるので、10進数の数値は4bitで構築できることになります。このデータだと、二進数のパターンしかありませんが、こうした扱い方をすると、10進数として数値を扱う事が出来ます。この4ビットのデータで0-fまでの数値が扱えるのですが、データを扱う場合、便宜上8つの塊で扱うので8bitが基準になります。
その為、コンピューターでは、この塊が基準となって使用されています。処理においては、二値の判定の 【 ビット 】 を用いますが、この1ビットが
と言う信号になりますが、これが8つ集まると1バイトになります。ストレージやメモリーの単位がこれになりますが、この単位は信号のオンとオフの情報が8つ集まった物がそれ位の量存在するのか?と言う表記になります。
の状態にすると、10進数で数値を扱えるようになりますが、7セグメントにする場合だと、この信号を7つの信号に変える必要があります。そうなると、ここで、デコーダを用意する必要が出てきますから、信号を得て、それをパターンで制御する必要があります。
例えば、4ビットのデータから1と2の信号を得ようと思うと、
のような感じになりますが、点灯させるパターンを決めている場合、その信号から対応したLEDに向かって信号を送る必要があります。そうなると、画像のように個別の信号をデコーダで引っ張ってくる必要があります。しかし、デコーダで必要になる信号はパターンがあるので、ハーネスから得る信号は4つですが、得る信号の条件を抽出する必要があります。
条 件抽出と論理演算
条件の判定ですが、プログラミング言語で演算子による判定を行うように電子回路の場合、論理演算による処理を行う事で、二値の信号の条件抽出を行う事が出来ます。
まず、
の4ビットの信号から十進数の1を得る場合ですが、状態としては、2の0乗数の桁に信号を与えることになるので、
の場所に信号を入れることになります。すると、端がオンの時に他はオフになる必要があるので、
のような判定になっている必要があります。この条件で、オンの時にだけ動く必要がありますから、この4つをAND回路で接続する必要があります。マイクラの場合、
でAND回路を作る事が出来ますが、NAND ICの場合だと、2つの脚が入力でその横が出力になっているので、2つのNAND回路を消費して
のようにすることでAND回路を作る事が出来ます。つまり、8つのNAND回路があった場合、その集積だと4つのAND回路を作る事が出来るという事になります。流石に、これで作ると回路の状態を見ても訳が分からなくなるので、今回は、
を使いますが、
の条件で動くようにした場合、AND回路を3つ使うことになるので、判定用の回路は
のような構造になります。これが0-9まであるので、一つの桁の判定用の回路を作る場合、
の9つのパターン分だけ判定用の回路を作る事になります。これを7節にする場合だと、各パターンの抽出から、デコードを行って、7セグのパターンに合わせた信号の伝達を行う必要が出てきますが、
のように8x8の1バイト文字のような物になると、条件が変わってきます。この場合、デコードを行う場合、8バイトのデータが必要になりますから、
のように1バイトX8のデータをデコーダ側に送信する必要が出てきます。その為、7セグディスプレイよりも多くのデータを必要とします。表示を行う場合には、文字のデコード用にデコードパターンを用意しておく必要がありますが、そのデータも7セグや16セグよりも作業が多くなります。
仮に、左端にラインを引くだけだと、0000 0001の01のデータを8つ用にすることになるので、
のような判定が必要になり、
のような状態で慎吾を送るようになります。その為、セグメント数が増えると、データも増大するのですが、完全な二値判定でもデータの総数が増えると、処理に時間がかかるわけです。
コンピューターの速度が速くなると、こうした処理も高速化されますが、マイクラのレッドストーン回路の場合、レッドストーンティックとブロック通過時の遅延が発生するので論理演算やデータの転送やデコード処理などを入れると遅延が物凄くなるので、遅延の少ない回路を用いたり、高速に伝送する仕組みを考える必要があります。
基本的な考え方としては、こうなりますが、こうした処理を効率的に行う為にデータの転送方法や処理方法を効率化して高速な処理を実装する事になります。
先 日作った物
先日は、
■ 格納できる本棚を作る
にて、エンチャントテーブル周辺の本棚を収納できる回路を紹介しました。構造自体は単純で、直線的な信号の流れがあって、入力部分から右回りに信号に遅延を入れているだけです。この作りにすると、信号が順次送信されるので、一つづつ本棚が上がっていきます。戻る時も遅延が発生するので、上がって言った順番に信号が反転して送られるようになります。これを反転させる場合には、別の回路を組む必要がありますが、順序が同じ場合だと、信号のオンとオフの遅延だけで制御できます。
この回路はレバーで制御しているので、トグルスイッチのように信号を維持する特性がありますから、ピストンが伸びたままになっていますが、これはボタンのようなパルス信号だとRSラッチ回路やフリップフロップ回路を用意する必要があります。と言っても、この回路の場合、信号を固定して反転させる回路があれば問題がないので、tフリップフロップ回路を入れるだけでボタンで制御できるようになります。
Tフリップフロップ回路については、
■ Tフリップフロップ回路
のような物を紹介していますが、パルス信号を得てそれを保存する場合には、記憶する回路が必要になりますが、Tフリップフロップ回路もそう言った機能を持っています。ただし、一つのボタンで信号の反転をさせる事が出来るので、今回のようにレバーで制御するような回路をパルス信号で動作させる場合には中継地点に入れて使用することになります。その為、今回はレバーを使っていますが、ボヤンにする場合には、こうした回路をあいらに入れることでボタンでの制御ができるようになります。Tフリップフロップ回路も1ブロックの幅で作れる物がありますから、そうした回路を組むと場所を取らなずに感圧版の通過でオンオフを指定できるようにしたり、ドアの制御のようにOR回路を含めて複数のボタンで状態をコントロールする事が出来るようになります。
エンチャントテーブルですが、最大でLV3まで存在し、最大で使う場合には、15個の本棚が必要になります。この時に、
ののように赤い羊毛を置いた場所は空間として空けておく必要があります。動画では、
の通路から入り
のような部屋に配置していますが、隠した状態だとこんな感じで本棚は床と一体化しています。この状態でレバーを引くと
のようになっていますが、部屋が狭すぎるので、この作りにするとLV3
のエンチャントが得来ません。前述のように
の空間を空ける必要がるので、この木材の場所に装飾を入れた場合、
のようにもう少し空間があったほうが圧迫感がないので、エンチャントを行う部屋のレイアウトの最小単位は、
になります。この本棚の位置よりも部屋を広くしたほうが内装を作りやすいので、エンチャントを行う部屋はかなり広めな空間を用意する事になります。