転生ドラゴンの魔法使い~魔法はガチでプログラムだった~

喰寝丸太

文字の大きさ
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); /*計算の答えを返す*/
}

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

あなたにおすすめの小説

貧民街の元娼婦に育てられた孤児は前世の記憶が蘇り底辺から成り上がり世界の救世主になる。

黒ハット
ファンタジー
【完結しました】捨て子だった主人公は、元貴族の側室で騙せれて娼婦だった女性に拾われて最下層階級の貧民街で育てられるが、13歳の時に崖から川に突き落とされて意識が無くなり。気が付くと前世の日本で物理学の研究生だった記憶が蘇り、周りの人たちの善意で底辺から抜け出し成り上がって世界の救世主と呼ばれる様になる。 この作品は小説書き始めた初期の作品で内容と書き方をリメイクして再投稿を始めました。感想、応援よろしくお願いいたします。

悪役令息、前世の記憶により悪評が嵩んで死ぬことを悟り教会に出家しに行った結果、最強の聖騎士になり伝説になる

竜頭蛇
ファンタジー
ある日、前世の記憶を思い出したシド・カマッセイはこの世界がギャルゲー「ヒロイックキングダム」の世界であり、自分がギャルゲの悪役令息であると理解する。 評判が悪すぎて破滅する運命にあるが父親が毒親でシドの悪評を広げたり、関係を作ったものには危害を加えるので現状では何をやっても悪評に繋がるを悟り、家との関係を断って出家をすることを決意する。 身を寄せた教会で働くうちに評判が上がりすぎて、聖女や信者から崇められたり、女神から一目置かれ、やがて最強の聖騎士となり、伝説となる物語。

元おっさんの俺、公爵家嫡男に転生~普通にしてるだけなのに、次々と問題が降りかかってくる~

おとら@ 書籍発売中
ファンタジー
アルカディア王国の公爵家嫡男であるアレク(十六歳)はある日突然、前触れもなく前世の記憶を蘇らせる。 どうやら、それまでの自分はグータラ生活を送っていて、ろくでもない評判のようだ。 そんな中、アラフォー社畜だった前世の記憶が蘇り混乱しつつも、今の生活に慣れようとするが……。 その行動は以前とは違く見え、色々と勘違いをされる羽目に。 その結果、様々な女性に迫られることになる。 元婚約者にしてツンデレ王女、専属メイドのお調子者エルフ、決闘を仕掛けてくるクーデレ竜人姫、世話をすることなったドジっ子犬耳娘など……。 「ハーレムは嫌だァァァァ! どうしてこうなった!?」 今日も、そんな彼の悲鳴が響き渡る。

知識スキルで異世界らいふ

菻莅❝りんり❞
ファンタジー
他の異世界の神様のやらかしで死んだ俺は、その神様の紹介で別の異世界に転生する事になった。地球の神様からもらった知識スキルを駆使して、異世界ライフ

神々に見捨てられし者、自力で最強へ

九頭七尾
ファンタジー
三大貴族の一角、アルベール家の長子として生まれた少年、ライズ。だが「祝福の儀」で何の天職も授かることができなかった彼は、『神々に見捨てられた者』と蔑まれ、一族を追放されてしまう。 「天職なし。最高じゃないか」 しかし彼は逆にこの状況を喜んだ。というのも、実はこの世界は、前世で彼がやり込んでいたゲーム【グランドワールド】にそっくりだったのだ。 天職を取得せずにゲームを始める「超ハードモード」こそが最強になれる道だと知るライズは、前世の知識を活かして成り上がっていく。

26番目の王子に転生しました。今生こそは健康に大地を駆け回れる身体に成りたいです。

克全
ファンタジー
アルファポリスオンリー。男はずっと我慢の人生を歩んできた。先天的なファロー四徴症という心疾患によって、物心つく前に大手術をしなければいけなかった。手術は成功したものの、術後の遺残症や続発症により厳しい運動制限や生活習慣制限を課せられる人生だった。激しい運動どころか、体育の授業すら見学するしかなかった。大好きな犬や猫を飼いたくても、「人獣共通感染症」や怪我が怖くてペットが飼えなかった。その分勉強に打ち込み、色々な資格を散り、知識も蓄えることはできた。それでも、自分が本当に欲しいものは全て諦めなければいいけない人生だった。だが、気が付けば異世界に転生していた。代償のような異世界の人生を思いっきり楽しもうと考えながら7年の月日が過ぎて……

異世界転生したらたくさんスキルもらったけど今まで選ばれなかったものだった~魔王討伐は無理な気がする~

宝者来価
ファンタジー
俺は異世界転生者カドマツ。 転生理由は幼い少女を交通事故からかばったこと。 良いとこなしの日々を送っていたが女神様から異世界に転生すると説明された時にはアニメやゲームのような展開を期待したりもした。 例えばモンスターを倒して国を救いヒロインと結ばれるなど。 けれど与えられた【今まで選ばれなかったスキルが使える】 戦闘はおろか日常の役にも立つ気がしない余りものばかり。 同じ転生者でイケメン王子のレイニーに出迎えられ歓迎される。 彼は【スキル:水】を使う最強で理想的な異世界転生者に思えたのだが―――!? ※小説家になろう様にも掲載しています。

無限の転生~今世でついに人間卒業!? こんな人生こりごりだとは言ったけど、人間辞めたいとは言ってない~

ねむ鯛
ファンタジー
気づいたら人間を辞めていた。 繰り返す転生。訪れない平穏。終わりのない闘争。 そんな人生はこりごりだと言った少女は、なんか気づいたら鳥になっていた。 ……鳥だから人生じゃない? 望み通り? 違う、そうじゃない。 「巨大な魔物がひしめくこんな厳しい大自然で、才能のない私が果たして生き残れるのでしょうか……?」 才がないと自認する少女は、事実としてこれまでの転生で幾度となく敗北を味わっていた。 しかし転生を重ねるたびに着実に強くなっていたようで……?   「まあ、私の能力を使えばなんとかなるでしょう。……あれ? 使えなくなってる……」 「転生なんてこりごりですが、……投げ出して、後悔だけはしたくないから……!!」 これはチート封印、慣れない鳥の姿、弟妹達のじゃれつき、大自然の脅威などなんやかんやに襲われて。 もう転生なんてしたくないと涙目になりつつ、修行し直したり、能力を取り戻したりしながら、今世は絶対幸せに過ごすために頑張って、世界最強への道を駆け上がっていく女の子のお話。 あと出会う人の脳を焼いたりもするよ。 ※見切り発車、不定期更新です。ガールズラブは保険。 たくさん転生してきた女の子のお話です。人外転生、のち人化要素があります。 題名変えました。  (旧旧旧旧題:永劫無尽の魂源輪廻《ウロボロス》)  (旧旧旧題:無限の転生~人外少女は異世界の空を飛ぶ(略)~) (旧旧題:無才少女~今世は人外です~(略)) (旧題【悲報】無限に転生してきた私、遂に人類をやめる【タスケテ】)

処理中です...