閑話 短編賞創作フェスのお題

第428話 スタートと、始まりと終わりと、積み木

「ええとプログラムってスタートとストップがたくさんあってややこしい」


 俺は婚約者のマイラにプログラムを教えてたところ、マイラがすねたように愚痴った。

 俺が転生したこの異世界、魔法の呪文がプログラムでもオッケーだ。


「そんなことないよ。大抵は対になってる」

「そうなんだけど」


「『{』がスタートで、『}』がストップ。簡単だろ」


void main(void)

{

 i=0;

 if(i==0){

  printf("iはゼロです");

 }

 else{

  printf("iはゼロではありません");

 }

}


 俺は例題を書いた。


「こんなプログラムがあったとして、対になっているのが分かるだろ」

「そこなのよ」


void main(void)

{

 i=0;

 if(i==0){

  printf("iはゼロです");

 }←ここが納得いかない。

 else{

  printf("iはゼロではありません");

 }

}


 マイラがプログラムのある部分を指差した。


「ここが納得いかない。だって対なら最初の所と対でしょ」


void main(void)

{←ここと。

 i=0;

 if(i==0){

  printf("iはゼロです");

 }←ここが対のはず。

 else{

  printf("iはゼロではありません");

 }

}


「それを理解するにはスタックという考え方が必要なんだ」


void main(void)

{←スタート1。1を積む。

 i=0;

 if(i==0){←スタート2。2を1の上に積む。

  printf("iはゼロです");

 }←上からしか取れないから、スタート2を取り出す。それのエンド。

 else{←スタート3。3を1の上に積む。

  printf("iはゼロではありません");

 }←上からしか取れないから、スタート3を取り出す。それのエンド。

}←上からしか取れないから、最後に残ったスタート1を取り出す。それのエンド。


「分かったかな。要は縦に積むだけの積木だよ」

「むーん。プログラム嫌い」

「積み木だから、常に上のしか取り出せない。こんなに簡単なのに」

「スタートと終わりのないプログラムを組みたい」

「完全には無理だけど、できるよ」


void main(void)

{

 fire_ball();

}


 例題を書いた。


「一個だけなら許せる」

「二個は許して欲しいな」


void fire_ball10(void)

{

 for(i=0;i<10;i++){

  fire_ball();

 }

}

void main(void)

{

 fire_ball10();

}


「こんなのはどう?」

「むきー、わけ分かんないよ。どことどこが対なのかもうパニック」


 異世界の人間にプログラムは難しいらしい。


void fire_ball10(void)

{

 fire_ball();

 fire_ball();

 fire_ball();

 fire_ball();

 fire_ball();

 fire_ball();

 fire_ball();

 fire_ball();

 fire_ball();

 fire_ball();

}

void main(void)

{

 fire_ball10();

}


「じゃあこれなら分かる?」

「ええと分かんない」


void main(void)

{

 fire_ball();

 fire_ball();

 fire_ball();

 fire_ball();

 fire_ball();

 fire_ball();

 fire_ball();

 fire_ball();

 fire_ball();

 fire_ball();

}


「これなら」

「それなら許す」

「オッケー、分岐なしの一本道プログラムね。でもそれじゃ限界が来る」

「いいのよ限界が来ても。これで十分。C言語で魔法を唱えると効率が何万倍にもなるんでしょ。その恩恵だけで構わない」


 うん、一筆書きみたいなプログラムしか受け付けないらしい。

 まあ良いか。

 今俺が使っているファイヤーボールの呪文はこうだ。


extern MAGIC *fire_make(float mana);

extern void magic_straight(MAGIC *mp,char *orbit,int orbit_size);

extern void magic_move(MAGIC *mp,char *orbit,int orbit_size);

void main(void)

{

 char orbit[2000]; /*軌道データ*/

 MAGIC *mp; /*魔法構造体*/

 mp=fire_make(0.0001); /*火の玉作成*/

 magic_straight(mp,orbit,sizeof(orbit)); /*真っ直ぐの軌道データを入れる*/

 magic_move(mp,orbit,sizeof(orbit)); /*火の玉を動かす*/

 mclose(mp); /*魔法終わり*/

}


 確かに一筆書きのプログラムだが、『main(void)』からして実は『(』がスタートで『)』が終わりだ。

 こういう小さい始まりと終わりを含んでる。

 『magic_straight(mp,orbit,sizeof(orbit));』の部分も『(』の入れ子状態。

 終わりと始まりが2重になってる。

 さっきの積み木を思い出せば簡単に分かるけどな。


「やった。フャイヤーボールの魔法がプログラム的魔法で出来たよ。こんなプログラムなら楽勝よ」


 マイラから火の玉が飛んだ。

 色々な始まりと終わりがあることは言わないでおこう。

  • Xで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る