上 下
72 / 164
第12章 受験生のドラゴン

第72話 電卓魔法

しおりを挟む
 カンニングに協力はするが、計算問題を俺がやるのはめんどくさい。
 今更、小学生の問題を筆算で解くなんて面倒臭ささの嵐だ。
 だいいち俺は筆記用具を持てない。
 そりゃあ、ドラゴンの記憶力があれば計算途中も忘れないから暗算でも出来る事は出来る。
 しかし、繰り返すが、めんどくさい。

 聞いた話では問題が三百問近くあるらしい。
 こういう時こそ魔法だ。
 それが良い。
 魔法を作るのも手間だが、作るのは案外楽しいからな。
 挑戦してみよう。

 タルコットから貰った発動しない魔法に、歴史のカンニングの魔法があった。
 年数を入れると、説明文が出てくるという魔法だ。
 それに『#define』と『switch』に対する魔法語の『あシイハニミイ』と『トテニカソク』があった。
 それに付随するもろもろの魔法語も分かった。
 これなら電卓魔法が作れる。

 しかし、電卓魔法は難しい。
 何が難しいかと言えばエラーチェックだ。

 基本は数値の後に記号。
 記号の後に数値。
 この繰り返しなのだが、例外がある。

 『6×-5』この数式は成り立つのに記号と数値が交互じゃない。
 マイナスが引き算なのか数値がマイナスなのかチェックしなきゃならない。

 初期設定を終えた最初のループで構文チェックと数値と記号を分ける事にした。
 ここで活躍するのが『switch』の機能。
 要するに箇条書きなんだが、整頓されて見やすい。

 肝心の処理だけど数値の処理は簡単だ。
 数値の前が数値でなければ良い。

 プラスの処理も簡単だ。
 前が数値ならオッケーだ。

 問題はマイナスだ。
 まずマイナスの前に何もない場合を考える。
 『-1+5』みたいな数式の場合だ。
 これは簡単だ。
 『-1』の数値と『+』の記号と『5』の数値こういう区分に分かれれば良い。

 『1-3』みたいな数式だと『1』の数値と『-』の記号『3』の数値という風に分かれれば良い。

 問題は『5×-6』みたいな場合だ。
 この場合の『-』は数値につけないといけない。
 『5』の数値と『×』の記号と『-6』の数値に分ける。
 こうすれば数値と記号が交互だ。
 ややこしいが分解して場合分けすればなんとかなる。

 記号だが、記号を数値化というのをする。
 『+』を『1』に、『-』を『2』にとやるわけだが。
 普通にやると訳が分からなくなる。
 『1+2-3』を分解すると『数値の1』、『記号の1』、『数値の2』、『記号の2』、『数値の3』となる。
 ややこしいだろう。
 そこで出てくるのが、『#define』だ。
 『#define TASU 1』と書くと『TASU』が出てくると自動的に『1』になる。
 さっきの例でいくと、『数値の1』、『TASU』、『数値の2』、『HIKU』、『数値の3』となる。
 魔法語だと『あシイハニミイ・カチトナ・ヌ』だ。
 『カチトナ』=『ヌ』になる。

 『#define』を使った翻訳後は、ドラゴンの祝福がなければ訳が分からないが、イメージなら少し見やすくなる。
 構文チェックはこれで完成のめどが立った。

 あとは掛け算と割り算を計算する。
 そして足し算と引き算だ

 これで完成だ。

「おーい、電卓魔法が出来たぞ」

 俺は急きょ作った豆腐ハウスの中で一生懸命、試験勉強しているミニアの前に文字を出した。

「電卓って何?」
「自動的に計算する道具だよ」
「凄い。天才。偉い。よっ、大将」
「使い方はだな。魔法を使う時に数値と計算記号を区切ってイメージする」
「魔道具作ってよ」
「でも試験には持って行けないぞ」
「いいよ。普段、使うから」
「おじさん、今ちょっと悪い事を考えたよ」
「えっ、なに? なに?」
「魔道具を売りに出したら、受験生が大量に失格しないかなと」
「越後屋、そちもワルよのう」

 ミニアの語集に磨きが掛かっているな。
 良い事だ。

 魔法都市について来ていたタルコットを豆腐ハウスの前に呼び出した。

「これは、これはミニア様。本日はどんな御用で」
「計算する魔道具、作ったよ」
「試してみても」

 タルコットは魔石を手に取り念じ始めた。
 しばらくして。

「素、素、素晴らしい。魔石は、魔石のランクは。もしかして、この大きさは」
「驚きのFランク」
「これはもの凄い革命ですよ。古代魔道具に匹敵する出来栄えです」
「ドラゴン的な魔道具だよ」

「そういえば、ミニア様。言葉がスラスラと出るようになられたのですね」
「うん、成長した」
「それはめでたい事です。お祝いは何が良いですか」

「この魔道具を受験生に安く売ってほしい」
「なるほど合格の必須アイテムとか言って、売り出すのですね。怪しげなお守りも沢山買われています。それに比べれば、きっと爆売れすると思います。ところで商品の名前は何にします」
「魔法電卓」
「電気の魔法が使われているのですか。そんな感じはしないですね」
「ドラゴン的なネーミングだよ」
「そうですね。自動計算機なんてのも芸がないですね。それで行きましょう」

 魔法電卓はもの凄い大ヒット商品になった。
 これで俺の試験準備は終わりだ。

 だが、魔法のイメージを後々のために記す。

#define SUUCHI 0 /*『SUUCHI』という文字が出てくると自動的に0になる*/
#define TASU 1 /*以下『define』は同じ機能。要するに数字に名前をつけただけ*/
#define HIKU 2
#define KAKERU 3
#define WARU 4
#define OWARU 5
#define KUUHAKU 6
#define ERR 999999999
long main(int argc,char *argv[])
{
 int i,j,k; /*カウンター*/
 int flag[100]; /*数字か演算記号化の区別の領域*/
 int val[100]; /*数値の領域*/

 long ans; /*答えが入る*/

 if(argc<2){
  return(ERR); /*式がないエラー*/
 }

 for(i=0;i<100;i++){ /*区別と数値の初期化*/
  flag[i]=OWARU;
  val[i]=0;
 }
 j=0; /*記号と数値の項目の個数*/
 for(i=1;i<argc;i++){ /*このループで数字と記号を分ける。構文チェックも兼ねる*/
  switch(*argv[i]){
  case'0': /*0から9なら数字*/
  case'1':
  case'2':
  case'3':
  case'4':
  case'5':
  case'6':
  case'7':
  case'8':
  case'9':
   k=0;
   while(*(argv[i]+k) != '\0'){ /*単語の終わりまで繰り返す*/
    if(*(argv[i]+k) < '0' || *(argv[i]+k) > '9') return(ERR); /*記号が混じっているからエラー*/
    k++;
   }
   val[j]=atoi(argv[i]); /*数値を入れる*/
   flag[j]=SUUCHI; /*区別を数値*/
   switch(j){
    case 0: /*最初が数値*/
     j++;
    break;
    case 1: /*二つ目が数値*/
     if(flag[j-1]==HIKU){ /*前がマイナス*/
      val[j-1]=val[j]*-1;
      flag[j-1]=SUUCHI;
      flag[j]=OWARU;
     }
     else{
      if(flag[j-1]==SUUCHI){
       return(ERR); /*数値の前が数値だとエラー*/
      }
      j++;
     }
    break;
    default: /*三つ目以降*/
     if(flag[j-1]==SUUCHI){
      return(ERR); /*数値の前が数値だとエラー*/
     }
     if(flag[j-1]==HIKU){ /*前がマイナス*/
      if(flag[j-2]==KAKERU||flag[j-2]==WARU){
       val[j-1]=val[j]*-1;
       flag[j-1]=SUUCHI;
       flag[j]=OWARU;
      }
      else{
       j++;
      }
     }
     else{
      j++;
     }
    break;
   }
  break;
  case'+':
   if(*(argv[i]+1)!='\0') return(ERR); /*記号が二文字だとエラー*
   flag[j]=TASU; /*区別を足し算*/
   if(j==0){
    return(ERR); /*いきなりだとエラー*/
   }
   if(flag[j-1]!=SUUCHI){
    return(ERR); /*前が記号だとエラー*/
   }
   if(i==argc-1){
    return(ERR); /*記号で終わるとエラー*/
   }
   j++;
  break;
  case'-':
   if(*(argv[i]+1)!='\0') return(ERR); /*記号が二文字だとエラー*
   flag[j]=HIKU; /*区別を引き算*/
   switch(j){
    case 0:
     j++;
    break;
    case 1:
     if(flag[j-1]==SUUCHI){
      j++;
     }
     else{
      return(ERR); /*前が記号だとエラー*/
     }
    break;
    default:
     if(flag[j-1]==KAKERU||flag[j-1]==WARU||flag[j-1]==SUUCHI){
      j++;
     }
     else{
      return(ERR); /*前が掛け算と割り算の記号以外だとエラー*/
     }
    break;
   }
   if(i==argc-1){
    return(ERR); /*記号で終わるとエラー*/
   }
  break;
  case'*':
   if(*(argv[i]+1)!='\0') return(ERR); /*記号が二文字だとエラー*
   flag[j]=KAKERU; /*区別を掛け算*/
   if(j==0){
    return(ERR); /*いきなりだとエラー*/
   }
   if(flag[j-1]!=SUUCHI){
    return(ERR); /*前が記号だとエラー*/
   }
   if(i==argc-1){
    return(ERR); /*記号で終わるとエラー*/
   }
   j++;
  break;
  case'/':
   if(*(argv[i]+1)!='\0') return(ERR); /*記号が二文字だとエラー*
   flag[j]=WARU; /*区別を割り算*/
   if(j==0){
    return(ERR); /*いきなりだとエラー*/
   }
   if(flag[j-1]!=SUUCHI){
    return(ERR); /*前が記号だとエラー*/
   }
   if(i==argc-1){
    return(ERR); /*記号で終わるとエラー*/
   }
   j++;
  break;
  default:
   return(ERR); /*演算記号以外エラー*/
  break;
  }
 }

 i=0;
 while(flag[i]!=OWARU){ /*終わりまで繰り返す。このループでは掛け算と割り算を先に計算する*/
  if(flag[i]==KAKERU){ /*掛け算の処理*/
   val[i+1]=val[i-1]*val[i+1];
   val[i-1]=0;
   flag[i-1]=KUUHAKU; /*計算済み*/
   flag[i]=KUUHAKU; /*計算済み*/
   i+=2;
  }
  else{
   if(flag[i]==WARU){ /*割り算の処理*/
    val[i+1]=val[i-1]/val[i+1];
    val[i-1]=0;
    flag[i-1]=KUUHAKU; /*計算済み*/
    flag[i]=KUUHAKU; /*計算済み*/
    i+=2;
   }
   else{
    i++;
   }
  }
 }

 i=0;
 while(flag[i]!=SUUCHI && flag[i]!=OWARU){ /*最初の数字を見つけ出す*/
  i++;
 }
 ans=val[i];

 while(flag[i]!=OWARU){ /*終わりまで繰り返す。このループでは足し算と引き算を計算する*/
  if(flag[i]==TASU){ /*足し算の処理*/
   while(flag[i]!=SUUCHI){ /*掛け算と割り算の処理済を飛ばす*/
    i++;
   }
   ans+=val[i];
   i++;
  }
  else{
   if(flag[i]==HIKU){ /*引き算の処理*/
    while(flag[i]!=SUUCHI){ /*掛け算と割り算の処理済を飛ばす*/
     i++;
    }
    ans-=val[i];
    i++;
   }
   else{
    i++;
   }
  }
 }
 return(ans); /*計算の答えを返す*/
}

 呪文に翻訳したものは、ニ千文字越えている。
 こんな長い呪文唱えられる訳ないだろう。
 だから、魔道具にするかコンパイルするしかない。
しおりを挟む
1 / 5

この作品を読んでいる人はこんな作品も読んでいます!

転生王女は異世界でも美味しい生活がしたい!~モブですがヒロインを排除します~

ファンタジー / 連載中 24h.ポイント:2,792pt お気に入り:1,464

最低なふたり

BL / 完結 24h.ポイント:569pt お気に入り:25

イバラの鎖

BL / 連載中 24h.ポイント:1,804pt お気に入り:229

車いすの少女が異世界に行ったら大変な事になりました

AYU
ファンタジー / 連載中 24h.ポイント:262pt お気に入り:50

【祝福の御子】黄金の瞳の王子が望むのは

BL / 完結 24h.ポイント:752pt お気に入り:975

あなたの一番になれたらいいのに

恋愛 / 完結 24h.ポイント:21pt お気に入り:1,005

【R18】姫初めからのはじめかた

恋愛 / 完結 24h.ポイント:71pt お気に入り:115

変人魔術師に一目惚れされて結婚しました

恋愛 / 連載中 24h.ポイント:1,011pt お気に入り:1,583

処理中です...