アドイン版 Casio Basic 用サンプルプログラム
誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
動画・説明追加 2015/11/15
更新 2016/05/02
プログラムアップデート 2021/06/13
記事の大幅な追記修正 2021/06/20
超お勧めライフゲームの動画を追加 2021/06/24
ライフゲーム マイナーアップデート 2021/06/26
全プリセットパターンの動画を収録 2021/06/26
プログラムダウンロードリンク修正 2021/07/12
追記 2022/03/06
[2015/11/16] プリセットした初期パターンを選べるようにバージョンアップ[2015/11/17] 記事を大幅に追加して更新
[2015/11/20] C.Basic Ver 0.73 へのバージョンアップを反映した更新
[2016/02/11] C.Basic 最新版は
アドイン Casio Basic - トップページ の最新バージョンから
[2016/05/02] ライフゲーム Ver 0.74 へアップテート(C.Basic Ver0.99m に対応) [2021/06/13] ライフゲーム Ver 2.45 / Ver 2.45F へアップデート
(C.Basic for FX Ver2.45 build20、C.Basic for CG Ver 1.45 build20 に対応) [2021/06/26] ライフゲーム Ver 2.45 / Ver 2.45F をマイナーアップデート
カシオのグラフ関数電卓で、そこそこ遊べるライフゲームができました...
とは言っても、純正 Casio Basic では無理なので、
アドイン版 Casio Basic : C.Basic で作りました。
まず最初に、ライフゲームを知らなかった方や知っていた方にも楽しんで頂けると思う最高の動画を紹介します;
▶ ライフゲームの世界1~9 複雑系コミュニティ動画 by はむくん
電卓で走らせるライフゲームを初めて作り、このページで紹介したのは 2015年のことで、2017年にアップデートしています。プログラムは
C.Basic で作成。その後
C.Basic 自体がアップデートを繰り返し、機能を充実させつつ完成度が上がってきました。それに合わせてライフゲームもアップデートします。今回のアップデートでは、基本的なロジックは変えておらず、幾つかのバグ取りとチョットした新機能追加を行っています。
カシオのグラフ関数電卓でしっかりと動作するライフゲームは他では見ないと思います (TIやhpのモデルで走るライフゲームはネットで検索すると出てきますが...)。実際の動作の動画を多く掲載したので、
C.Basic の能力やライフゲームの面白さを実感できると思います。
お持ちのグラフ関数電卓で、是非とも実際にライフゲームを楽しんで頂きたいと思います。
カラー液晶搭載モデルなら
fx-CG50 がお勧め、モノクロ液晶搭載モデルなら
fx-9860GII がお勧めです。この記事では、
fx-CG50 と
fx-9750GIII (最新のモノクロ液晶モデル) での動作画面を掲載しています。
目 次 ▋ライフゲームのルール ▋プログラム電卓でライフゲーム ▍ライフゲーム作成の経緯 ▍ライフゲームで遊ぶための準備 ◆ アドイン版 Casio Basic: C.Basic for FX ◆ アドイン版 Casio Basic: C.Basic for CG ◆ チューンアップツール (アドインプログラム) ◆ ライフゲームのプログラムファイル ▍ライフゲームの遊び方 (プリセットパターンの実行動画あり) ▋プログラムのロジックについて ▋各モデルでの処理速度 (実行動画あり) ▋ライフゲームに関するサイト
ライフゲームは 1970年に数学者 Conway が発表したのが始まりで、英語では
Conway's Game of Life と呼ばれます。
画面の1ピクセルを1個の細胞 (セル - Cell)と見立て、誕生、生存、死滅を繰り返す細胞集団の変化(世代変化)を画面上で再現して、眺めて楽しみます。
ピクセル1個 = 細胞1個は、
■ (On:生きている) か
□ (Off:死んでいる) のどちらかの状態になります。そして以下の単純な3つの条件だけで次の世代の細胞の生死、つまりピクセルの
On / Off が決定されます。
<誕生>周りに生きている細胞が3個あれば、次の世代でその場所に新たな細胞が生まれます。つまり、 あるピクセルが
Off で、周りの8 個のピクセルのうち3個が
On の場合、
そのピクセルは次の世代で
On になります。
<生存>生きている細胞の周りに生きている細胞が2個か3個あれは、その細胞は次の世代でも生き残ります。つまり、あるピクセルが
On で、周りの8個のピクセルのうち2個か3個が
On の場合、
そのピクセルは次の世代では
On のままになります。
<死滅>上以外の場合、細胞は次の世代で死にます。つまり、あるピクセルが
On で、周りの8 個のピクセルが1個以下(過疎)、
あるいは4個以上(過密)の場合、
そのピクセルは次の世代で
Off になります。
このルールに従って、画面全てのピクセルについて計算すると全体が1世代進みます。
世代が進むと、複雑なパターンに進化したり、死滅したり、一定パターンに落ち着くこともあります。ピクセル一個の生死が3つの単純なルールに従うだけなのに、実際に動かしてみると予想もしないパターンに進化するのが、ライフゲームの面白いところです。
▋プログラム電卓でライフゲームライフゲーム・プログラムは、
アドイン版 Casio Basic - C.Basic で作成し、純正
Casio Basic にない拡張機能を使っているので、
C.Basic のインストールが必要です。さらに、チューンアップツールで実行速度を上げると良いかもしれません。
▶ 必須 - アドイン版Casio Basic - C.Basic ▶ 必須 - ライフゲーム プログラム - LIFE245 や 高速化バージョンLIFE245F ▶ 有ると良いかも - チューンアップツール (アドイン) ※
LIFE245F と
C.Basic だけでも楽しめると思います。
▍ライフゲーム作成の経緯ライフゲームを作るとしたら、画面全体のビットマップパターンを2次元配列 (行列) に対応させて計算するのが単純で分かりやすい方法でしょう。カシオのグラフ関数電卓の画面全体のピクセルを扱うには 63×127行列が必要ですが、
純正Casio Basic の行列は最大 99行99列なので、画面全体のビットマップパターンを処理できそうにありません。さらにグラフィックス画面を頻繁に更新する処理は
純正Casio Basic では非常に長い時間を要します。従って、グラフ関数電卓の
純正Casio Basic でライフゲームを作るのは極めて不向きで、現実的ではありません。
ところが
アドイン版 Casio Basic - C.Basic の開発が始まり、実際に色々なプログラムを作ってみると、計算は速く、グラフィックス画面への描画動作も速く、画面全体のピットマップを2次元配列で比較的高速に処理できるようになったので、
C.Basic のベンチマークの目的も兼ねて、ライフゲームを作ってみました。
PCで動作する多くのライフゲームは広い画面を使うものがあり、メモリが許す限りの十分に広い世界を用意しているものがあります。一方、今回は
127 ピクセル × 63 ピクセル に限定された狭い世界でのライフゲームを作ってみます。電卓でのグラフィックス画面の更新は比較的時間がかかるので、本プログラムでは更新するビットマップ領域(行列のサイズ)を必要最小限にして高速化する工夫をしているため、画面全体の2ピクセルの内側にある
123×59画面 ピクセルの領域をパターンが超えようとするときは、本来のルール通りに動作しません。
本ライフゲームは、
アドイン版 Casio Basic - C.Basic の能力確認 (ベンチマーク) も目的です。最初はモノクロ液晶搭載のグラフ関数電卓 fx-9860GII にインストールした
C.Basic for FX Ver 0.66 で作り始め、
C.Basic for FX Ver 0.73 で仕上げて、それ以降のアップデートの際に動作確認しています。
C.Basic for FX Ver 0.99m 以降に合わせて ライフゲームを
Ver 0.74 にアップデート。その後
DotP() 関数が
DotPut() に変更されたこともあり、さらに
C.Basic for FX が
Ver 2.45 までアップデートされたのに合わせて、ライフゲームをアップデートしました。
一方で、高精細カラー液晶画面を搭載した
CG モデル (
fx-CG20 や
fx-CG50) に対応した
C.Basic for CG の開発も始まり、これら CGモデルでも
C.Basic が使えるようになりました。
C.Basic for CG で扱うプログラムファイルは
g3m ファイルですが、
g1m ファイルも
FX モデルと同じように動作するようになっています。従って、FXモデル用に作ったライフゲーム (
g1mファイル) は、CGモデル (
fx-CG20 や
fx-CG50) でも動作します。
▍ライフゲームで遊ぶための準備ここで紹介するライフゲーム・プログラムは、
C.Basic for FX や
C.Basic for CG をインストールして、
C.Basic で実行してください。さらに下記で紹介するチューンアップツールを導入すると電卓自体の演算速度を高速化できるので、ライフゲームをさらに高速化できます。
C.Basic for FX や
C.Basic for CG は以下に紹介するモデルで動作します。 チューンアップツールはモデルごとに適用されている正しいバージョンを使ってください。詳しくは以下に紹介します。
※ FXモデル:モノクロ液晶を搭載した下記グラフ関数電卓
・fx-9860G / SD / Slim
・fx-9860GII / SD
・fx-9860GIII
・fx-9750GIII※ CGモデル:高精細カラー液晶を搭載した下記グラフ関数電卓 ・fx-CG10 / fx-CG20 ・fx-CG50◆ アドイン版 Casio Basic: C.Basic for FX※ 最新バージョン
Ver 2.45 build 20 以降のダウンロード:
アドイン Casio Basic - トップページ ・ZIPファイルで提供
・ソースファイル(C言語)を公開
・ZIPファイル内にある
CBASIC.G1A がアドインプログラム本体
◆ アドイン版 Casio Basic: C.Basic for CG fx-CG20 /
fx-CG50 (CGモデル) 用
C.Basic for CG でも g1m ファイルを実行すると、FXモデルで実行するのと同様な出力になるので、 g1m ファイルのライフゲームで遊べます。但し、以下の2つの設定を行ってください。
※ 最新バージョン
Ver 1.45 build 20 以降のダウンロード:
アドイン Casio Basic - トップページ ・ZIPファイルで提供
・ソースファイル(C言語)を公開
・ZIPファイル内にある
CBCG145.G3A がアドインプログラム本体
※ ライフゲームプログラムの
g1m ファイルを編集する場合、下記設定をしないと
g3m ファイル
として保存されてしまいます。
g1mファイルとして保存するための設定 ・C.Basic for CG を起動
・[SHIFT][MENU] で設定画面表示
・設定画面にある項目
Force g1m save を
on にする
CGモデルで g1m ファイルを保存する時の操作 ・プログラム編集画面で [EXIT]キーを押して ファイルリスト画面に戻る前に

と表示され、一番下のシフトキーメニューの [F2] に g1m、[F3] に g3m と表示されている。
・ここで [F2] (g1m) を押してから [EXE] キーを押すと
g1m ファイル として 保存される。
◆ チューンアップツール(アドインプログラム)より高速でスムーズな動きを楽しむには、オーバークロックによるチューンアップツールの使用を勧めます。
※
fx-9860G / fx-9860GII USB GRAPHIC モデル (SH3搭載) シリーズ向け Ftune の導入※
fx-9860GII USB GRAPHIC 2 モデル (SH4搭載) シリーズ向け Ftune2 の導入※
fx-9860GIII / fx-9750GIII / GRAPH35++EII 向け Ftune3 の導入※
fx-CG10 / fx-CG20 向け Ptune2 の導入※
fx-CG50 向け Ptune3 の導入チューンアップツールを起動したら、プリセットされている
[F5] を押して設定すると、安全なチューンアップで高速化できます。
[F1] を押すと電卓本来の設定に戻ります。これ以上のチューンアップもできる可能性がありますが、自己責任でお願いします。
◆ ライフゲームのプログラムファイル ▶ ライフゲーム Ver 2.45 ※ 手動パターン入力時、[EXE]を1回押してもドットが表示されないバグを修正 [2021/06/16]
※ パターン作成画面で[EXIT]キーで最初のメニューに戻るよう修正 [2021/06/24]
※ パターン作成画面での操作説明表示を 125 dot x 61 dot の範囲内に収める [2021/06/26]
・チューンアップツールで [F5] を押して得られる設定を推奨
・初期パターンは、手入力だけでなくプリセットした16個の初期設定から選択可能
電卓表示のの狭い世界でも、パターンが変化する様子は面白くて飽きません。純正Casio Basic ではライフゲームは無理ですが、C.Basic で実現しました。
▶ ライフゲーム Ver 2.45F (
高速化バージョン) ※ 手動パターン入力時、[EXE]を1回押してもドットが表示されないバグを修正 [2021/06/16]
※ パターン作成画面で[EXIT]キーで最初のメニューに戻るよう修正 [2021/06/26]
※ パターン作成画面での操作説明表示を 125 dot x 61 dot の範囲内に収める [2021/06/26]
・チューンアップツール が無くても高速に動作
・チューンアップツール で [F5] を押して得られる設定で使うとさらに高速化
Ver. 2.45 のパターン更新処理をまとめて1つの関数にすることで、高速化したものです。▍ライフゲームの遊び方 ・C.Basic で
LIFE245 か
LIFE245F を起動
・メニューで
[F1] (手入力) か
[F6] (16個のプリセットから選択) かのどちらかを選ぶ

[F1] 手入力の場合 - FXモデルでの画面例 ・操作方法の説明を表示

-
[F1] で次に進む
・パターン作成画面になる

・
[EXE]キーを押すと十字カーソルが現れる

矢印キーでカーソルを上下左右に移動させ、
[EXE]キーを押せばその位置のピクセルがONになる
カーソルの座標 X, Y の座標値が表示される
・[EXE] ⇒ カーソル移動 ⇒ [EXE] を繰り返してパターンを作成

-
[EXIT] キーを押せば、パターン作成を中断して最初の画面に戻る
・[DEL] キーを押すと、パターンが1世代進む

右上に世代が表示される
- [(-)] キーを押せば1世代進む
- [EXE] キーを押せば世代が連続して進む
- [EXIT] キーを押せば世代更新を中止して、世代数と所要時間を表示
・上の初期パターンが1316世代目になった画面 (例)

・[EXIT] キーを押すと、世代更新を中断して結果表示

[SHIFT] [F6] を押すと、1316世代のパターン画面に切り替えられる
[F6] プリセットパターン選択の場合 - CGモデルでの画面例
・メニューで
[F6] (16個のプリセットから選択) を押す

・プリセットパターン1を表示

・[↑] / [↓] キーでパターンを選ぶ

(例)
13個目のパターン (グライダー銃) を選ぶ
・[F1] キーでプリセットパターンを確定

・プリセットから確定したのち
[EXE] を押して手入力でチョイ足しできる

[EXE] で十字カーソルを表示 ⇒ 矢印キーでカーソル移動 ⇒ [EXE] でピクセルON
・[DEL] で1世代目のパターンに進む

- [(-)] で1世代進む
- [EXE] で連続して世代が進む
- 世代が連続して進んでいる時
[(-)] を押せば一旦停止
・世代が連続して進んでいる時 [(-)] を押せば一旦停止

・[EXIT]キーでゲーム終了し、その時の世代数と最初からの実行時間を表示する

- [SHIFT] [F6] を押すと 終了時のパターンの画面に切り替えられる
プリセット初期パターン <パターン1>
174世代目で安定状態になる。
<パターン2>
こんなに小さい5ピクセルから、大きく広がりながらグライダーを5機発射する。
6機目のグライダーは途中で消滅。一般にはかなり長寿命だが、 電卓の狭い世界では
652世代目で安定状態になる。
<パターン3>
たまたま見つけた面白いパターン。
大きく広がらないのに、安定状態になるまで517世代と長寿命なのが特徴。
<パターン4>
たまたま見つけたパターン。横に広がり218世代目で安定状態になる。
<パターン5>
たまたま見つけた面白いパターン。
途中から、画面全体のピクセルで計算と描画を行い負荷が最大になるので、
プログラムのスピード評価に使える。
グライダーを6機発射し、そのうち2機は途中で消滅。
飛び去るグライダーを別にすれば、495世代目で安定状態になる。
<パターン6>
たまたま見つけた寿命の長いパターン(658世代)。
但し、狭い画面よりも広がろうとするので、境界での特異現象あり。
<パターン7>
固定パターン(ブリンカー)の1つ。床屋さんのサインのようだ。
<パターン8> 
グライダーが反射を続けて往復移動する様子が面白い。
<パターン9>
グライダー: 回転しながら斜めに移動してゆく。
<パターン10>
小さい宇宙船と大きい宇宙船: 横に直進する。
小さい宇宙船は壁に当たるとグライダーに変身する(画面端での特異ケース)。
<パターン11>
左右に往復運動するパターン(シャトル)。
<パターン12>
往復移動するパターン(シャトル)の1つ。
壊れて消えそうで、消えずに往復運動するのが面白い。
<パターン13>
グライダー銃: MITのゴスペラーが最初に見つけた無限増殖するパターン。
次々にグライダーが発射される。
<パターン14>
シュッシュポッポ列車 (Puffer Train): 煙(スパイク)を残しながら移動する。
<パターン15>
移動するパターン。ゴミ(スパイク)を残さないのが面白い。
<パターン16> 画面全体にランダムに生成させる初期パターン
▋プログラムのロジックについて単純な規則に従って
LIFE245.g1m を書いていますが、1つだけ工夫しています。結構な量の行列計算を出来るだけ少なくするために、パターンの周りの最低限必要なビットマップ領域だけの配列計算をするようにしています。ビットマップ領域の拡大に伴ってフレキシブルに行列の要素数を拡大しているので、パターンの領域が広がるにつれて行列計算処理に時間がかかるようになります。
LIFE245F.g1m は、ライフゲームの規則に従ってパターンを進化させるブロック (下記) を、丸ごと専用関数
DotLife() に置き換えた高速化バージョンです。具体的には、
LIFE245.g1m の以下の部分を
DotLife() に置き換えています。
LIFE245.g1m : パターンを進化させるブロック '== Calc Next Map ==
For T→Y To B
For L→X To R
0→C
CellSum(Mat B[X,Y])→C
If Mat B[X,Y]:Then
If C≦1 Or C≧4:Then
0→Mat C[X,Y]
IfEnd
Else
If C=3:Then
1→Mat C[X,Y]
IfEnd
IfEnd
'Expand Map Area
If C:Then
If l≦2:Then 2→l
Else X≦l⇒Dsz l:IfEnd
If r≧126:Then 126→r
Else X≧r⇒Isz r:IfEnd
If t≦2:Then 2→t
Else Y≦t⇒Dsz t:IfEnd
If b≧62:Then 62→b
Else Y≧b⇒Isz b:IfEnd
IfEnd
Next:Next
l→L:r→R:t→T:b→BLIFE245F.g1m : 関数に置き換えたブロック '== Calc Next Map ==
DotLife(Mat B,L,T,R,B)→Mat C見て判るように、
'== Calc Next Map == ブロックは、ライフゲームの規則通りに所定の領域内のパターンを1世代更新しています。この処理をごっそり
DotLife() 関数で処理させています。
さて、
C.Basic はインタープリタで、プログラムを読み込みながら動作します。将来的にコンパイラ版も構想しており、
DotLife() 関数は、バイナリレベルで処理しており、コンパイラ版の動作速度をシミュレートしたものです。その結果 7.7倍高速化しています。コンパイラ版はそれ以上の高速化が期待されます。
なお、実際のコードは、ダウンロードしたzipファイルを解凍して得られる textフォルダ内にあるテキストファイルをご覧下さい。
さて、サブルーチン
LMAP2P.g1m では、配列データとしてプリセットパターンを記述していて、それをビットマップとして画面に表示するようにしています。プリセットパターンは、矢印キーで切り替えます。16パターン目は、画面全体にランダムにドットを書いています。
▋各モデルでの処理速度fx-9750GIII を使い、
LIFE245 と
LIFE245F について、ノーマル 58.9MHz (
Ftune3 で
[F1]の設定) と 235.9 MHz (
Ftune3 で
{F5]の設定) で処理時間を調べます。プリセットパターン3 は、電卓の画面の外に広がらず、517世代まで変化が続く面白いパターンなので、このパターンが517世代になるまでの時間を比較します。
この測定のため、プログラムソースの
'== Key Operation == のすぐ上の行に以下を追加します。
G=517⇒Break '== Key Operation ==すると、517世代のパターンを描画した直後に世代進化を止めて、最後の表示にジャンプし、以下のような表示をしてプログラムが終了します。本プログラムでは、操作による時間を含まず、パターンの世代更新の実時間を計測しているので、精度の良い処理時間が表示されます(ノーマルクロックで
LIFE245F.g1m 実行の例)。

※ USBケーブルでPCと接続し、カシオ提供の
Screen Receiver でPCに画面を表示、pngファイルとしてダウンロードしたのが上のイメージです。
Screen Receiver に接続するとパターンの変化がリアルタイムでPCに表示され、その結果517世代までの時間が41.64 秒になっており、USB接続していない時 (34.47 秒) よりも処理時間が長くなっています。PCにリアルタイム表示させると表示のためのオーバーヘッドがあるようです。
▶ LIFE245, ノーマル 58.9MHz - 258.2秒 (4分18.2秒) [2021/06/14 修正] ※ 描画領域が広がるにつれ、目に見えて描画が遅くなることが確認できます。
▶ LIFE245, チューンアップ 235.9MHz - 59.4秒 ※ Ftune3 で
[F5] の設定 235.9MHz でようやく実用的な速度になります。
▶ LIFE245F, ノーマル 58.9MHz - 34.4秒 ※ DotLife() 関数を用いた
LIFE245F では、ノーマル設定 58.9MHz でも十分に速くなります。
▶ LIFE245F, チューンアップ 235.9MHz - 7.8秒 ※ DotLife() 関数を使った
LIFE245F は、
Ftune3 で
[F5] 設定にすると、非常に高速になります。
複数のモデルで
FLIE245Fを走らせ、 パターン3の517世代までの処理時間をまとめます。
モデル | OS | ノーマルクロック チューニングツール [F1]設定 | 処理時間
| チューンアップ チューンアップツール [F5]設定 | 処理時間 |
fx-CG50 | 3.50 | 115.16 MHz | 24.0 秒 | 196.01 MHz | 12.8 秒 |
fx-CG20 | 2.00 | 58.90 MHz | 24.1 秒 | 250.05 MHz | 14.7 秒 |
fx-9750GIII | 3.40 | 58.90 MHz | 34.5 秒 | 235.90 MHz | 7.8 秒 |
fx-9860GII (SH4) | 2.09 | 29.49 MHz | 36.1 秒 | 235.93 MHz | 5.5 秒 |
fx-9860GII (SH4) | 2.04 | 29.49 MHz | 36.2 秒 | 235.93 MHz | 5.6 秒 |
fx-9860G AU | 1.03 | 29.49 MHz | 49.6 秒 | 117.96 MHz | 19.0 秒 |
fx-9860GII SD (SH3) | 2.00 | 29.49 MHz | 49.7 秒 | 117.98 MHz | 19.0 秒 |
fx-9860G | 2.00 | 29.49 MHz | 49.8 秒 | 117.96 MHz | 19.1 秒 |
fx-9860G Slim | 1.10 | 29.49 MHz | 49.9 秒 | 117.96 MHz | 19.1 秒 |
fx-9860G Slim | 2.00 | 29.49 MHz | 49.9 秒 | 117.96 MHz | 19.1 秒 |
ノーマルクロックでは、
fx-CG50 が最速です。一方、チューンアップの場合は、モデルによりオーバークロック可能レベルが異なり、最速は
fx-9860GII / SD (SH4) / OS2.09 となっています。
このようにライフゲームと新旧様々なモデルで動作します。お持ちのモデルに適切にインストールして遊んでみてください。
▋ライフゲームに関するサイトライフゲームについての情報をまとめました。
ライフゲームの解説▶ライフゲームの世界 - 複雑系コミュニティ動画 by はむくん -
超お勧め ・ライフゲームの世界1【複雑系】 ・ライフゲームの世界2【複雑系】 ・ライフゲームの世界3【複雑系】 ・ライフゲームの世界4【複雑系】 ・ライフゲームの世界5【複雑系】 ・ライフゲームの世界6【複雑系】 ・ライフゲームの世界7【複雑系】 ・ライフゲームの世界8【複雑系】 ・ライフゲームの世界9 最終回【複雑系】▶
人口知能に関する断創録 - ライフゲームの世界▶
人口知能に関する断創録 - ライフゲーム ▶
ライフゲームから生命誕生(前編)▶
ライフゲームから生命誕生(後編)▶
数字の難民 - ライフゲームを知っていますか?《機械仕掛けの生物》▶
ウィキペディア - ライフゲーム▶
ライフゲーム入門 (Introduction The Game of Life)▶
続・ライフゲーム入門 (Game of Life Demo)fx-5800P でライフゲームを作った人が居た!▶
nimu.akhの日記: 関数電卓でライフゲーム
ライフゲームの数学的側面▶
ウィキペディア - ライフゲームの物体一覧▶
ウィキペディア - セル・オートマトン▶
ウィキペディア - チューリングマシン応援クリックをお願いします。励みになるので...