
最近C言語の勉強を始めた学生です。
講義中の課題で「セルオートマトン(ルール90)を作成する」というものがありました。
セルオートマトンについて・どのようなものを作るのかはわかったのですが、”次の世代を作るための計算”の部分をどのようにすれば良いのかわかりません。
ヒントとして、シフト演算を使って…と言われたのですが、なぜシフト演算が必要なのかもわからず…
昔から計算が苦手で、わからないのが歯がゆいです。
どなたか解説して頂けませんでしょうか?
ソースコードのみや、それらが載っている書籍の紹介でも構いません。
宜しくお願い致します。
No.1ベストアンサー
- 回答日時:
たとえば1次元セルオートマトンの計算をするときに、セル位置0の状態計算を行ったあとで、セル位置1の計算を行うことにします。
セル位置1の計算はセル位置0の計算と同じですから、1次元セルをシフトすることで位置1のセルは位置0にくることになり、位置0について同じ計算を行えば良いことになります。同様にセル位置2の計算を行うには、さらにシフトすれば、位置2のものが位置0に来ますから、その繰り返しで1次元セル全体の計算を行うことができます。
そんなところからシフト演算を使うことをヒントとして挙げているのではないかと。
外している可能性もあるので、詳しいことは、お使いの教科書を読み返してみるか、先生の質問したほうが手っ取り早いと思います。
No.3
- 回答日時:
解説やソースをお求めとのことなので、シフト演算を使わずになるべく平易に書いてみました。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void print_data(char *data, char len)
{
int i;
for(i=0; i<len; i++){
if(data[i] == 0)
printf("□");
else
printf("■");
}
printf("\n");
}
void step(char *data, char len)
{
int i;
char rule[8][3] = {
{1,1,1},
{1,1,0},
{1,0,1},
{1,0,0},
{0,1,1},
{0,1,0},
{0,0,1},
{0,0,0}
};
char value[] = {0,1,0,1,1,0,1,0};
char *result = malloc(len);
for(i=1; i<len-1; i++){
int j;
for(j=0; j<8; j++){
if(memcmp(rule[j], &data[i-1], 3) == 0)
break;
}
result[i] = value[j];
}
memcpy(data, result, len);
free(result);
}
#define WIDTH 80
#define HEIGHT 40
int main(int argc, const char *argv[])
{
char data[WIDTH] = {0};
data[WIDTH/2] = 1;
int len = sizeof(data);
int i;
for(i=0; i<HEIGHT; i++){
print_data(data, len);
step(data, len);
}
return 0;
}
パターン比較の処理をメモリ節約しようとしたときに、以下の様な感じで
ビットシフト使うことも考えられます。
rule[] = {7, 6, 5, 4, 3 , 2, 1, 0};
int tmp = (data[i-1] << 2) + (data[i] << 1) + data[i+1];
for(j=0; j<8; j++)
if(rule[j] = tmp)
break;
result[i] = value[j];
ちょっと見当違いかもしれませんね。
シンプルでわかりやすいソースコードをありがとうございます!
メモリ節約が目的のビットシフトとは、気付きませんでした。勉強になります。
こちらも参考にして書いてみようと思います!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(自然科学) 科学技術計算の仕事について 2 2023/02/04 18:09
- C言語・C++・C# C言語 3 2022/10/04 15:07
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- 化学 化学のエンタルピ変化を求め方について ある例題では各物質のモール数を換算して計算することもあり、ある 1 2022/06/20 23:22
- ノートパソコン 大学のレポート作成専用ノートパソコンとして、VAIO SX12(Core i7、32GB、1TB-S 5 2023/06/10 11:14
- C言語・C++・C# C言語で移動平均のプログラムを作りたいのですが、数値をファイルから取ってきて計算をするプログラムはど 1 2022/09/29 01:21
- 経済学 国の予算原則について質問です。 「予算単年度主義」と「会計年度独立の原則」の違いが今ひとつ分かりませ 1 2022/04/08 15:53
- その他(プログラミング・Web制作) python コードについて(初学者です) 3 2023/07/20 14:44
- 統計学 t検定を繰り返してはいけない理由について教えて下さい。 2 2022/05/15 12:37
- その他(コンピューター・テクノロジー) 4勤2休のシフト作成 1 2022/12/15 15:38
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・昔のあなたへのアドバイス
- ・字面がカッコいい英単語
- ・許せない心理テスト
- ・歩いた自慢大会
- ・「I love you」 をかっこよく翻訳してみてください
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・はじめての旅行はどこに行きましたか?
- ・準・究極の選択
- ・この人頭いいなと思ったエピソード
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB6.0での小数点の扱いについて
-
EXCELで 0.1 はなぜ 0.1 となる...
-
2進数の足し算(C言語)
-
VB.net Double と...
-
O(n log n)について2
-
VBAでミリ秒まで出力する方法
-
ExcelでPC(パソコン)によって...
-
三菱シーケンサ(Aシリーズ)で...
-
16進数 加算 減算 C言語
-
計算の丸め誤差の解消について
-
ExcelのINT関数の計算結果がお...
-
VBAでの割り算の余りの求め方
-
有効数字について 以前質問をし...
-
2038年問題 日付算出
-
整数のべき数のプログラムについて
-
定数の定義方法 #define
-
三角関数、逆三角関数の算出方...
-
VBAのINT関数について
-
CRCの計算方法について
-
符号誤り率の計算は例題でどの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ExcelでPC(パソコン)によって...
-
有効数字について 以前質問をし...
-
O(n log n)について2
-
VB.net Double と...
-
ExcelのINT関数の計算結果がお...
-
c languageで 簡単な質問があ...
-
VBAでミリ秒まで出力する方法
-
EXCELの関数"STDEV(標準偏差)"...
-
16進数 加算 減算 C言語
-
三菱シーケンサ(Aシリーズ)で...
-
VB6.0での小数点の扱いについて
-
除算を使わずに10で割りたい。
-
”/”を使わずに割り算したいんで...
-
計算の丸め誤差の解消について
-
CRCの計算方法について
-
2038年問題 日付算出
-
VB6のFIX関数での誤差について
-
色の判定
-
大きすぎる数値になるとE+にな...
-
浮動小数演算は実行環境の変化...
おすすめ情報