上 下
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); /*計算の答えを返す*/
}

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

あなたにおすすめの小説

加工を極めし転生者、チート化した幼女たちとの自由気ままな冒険ライフ

犬社護
ファンタジー
交通事故で不慮の死を遂げてしまった僕-リョウトは、死後の世界で女神と出会い、異世界へ転生されることになった。事前に転生先の世界観について詳しく教えられ、その場でスキルやギフトを練習しても構わないと言われたので、僕は自分に与えられるギフトだけを極めるまで練習を重ねた。女神の目的は不明だけど、僕は全てを納得した上で、フランベル王国王都ベルンシュナイルに住む貴族の名門ヒライデン伯爵家の次男として転生すると、とある理由で魔法を一つも習得できないせいで、15年間軟禁生活を強いられ、15歳の誕生日に両親から追放処分を受けてしまう。ようやく自由を手に入れたけど、初日から幽霊に憑かれた幼女ルティナ、2日目には幽霊になってしまった幼女リノアと出会い、2人を仲間にしたことで、僕は様々な選択を迫られることになる。そしてその結果、子供たちが意図せず、どんどんチート化してしまう。 僕の夢は、自由気ままに世界中を冒険すること…なんだけど、いつの間にかチートな子供たちが主体となって、冒険が進んでいく。 僕の夢……どこいった?

貴族に生まれたのに誘拐され1歳で死にかけた

佐藤醤油
ファンタジー
 貴族に生まれ、のんびりと赤ちゃん生活を満喫していたのに、気がついたら世界が変わっていた。  僕は、盗賊に誘拐され魔力を吸われながら生きる日々を過ごす。  魔力枯渇に陥ると死ぬ確率が高いにも関わらず年に1回は魔力枯渇になり死にかけている。  言葉が通じる様になって気がついたが、僕は他の人が持っていないステータスを見る力を持ち、さらに異世界と思われる世界の知識を覗ける力を持っている。  この力を使って、いつか脱出し母親の元へと戻ることを夢見て過ごす。  小さい体でチートな力は使えない中、どうにか生きる知恵を出し生活する。 ------------------------------------------------------------------  お知らせ   「転生者はめぐりあう」 始めました。 ------------------------------------------------------------------ 注意  作者の暇つぶし、気分転換中の自己満足で公開する作品です。  感想は受け付けていません。  誤字脱字、文面等気になる方はお気に入りを削除で対応してください。

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

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

病弱が転生 ~やっぱり体力は無いけれど知識だけは豊富です~

於田縫紀
ファンタジー
 ここは魔法がある世界。ただし各人がそれぞれ遺伝で受け継いだ魔法や日常生活に使える魔法を持っている。商家の次男に生まれた俺が受け継いだのは鑑定魔法、商売で使うにはいいが今一つさえない魔法だ。  しかし流行風邪で寝込んだ俺は前世の記憶を思い出す。病弱で病院からほとんど出る事無く日々を送っていた頃の記憶と、動けないかわりにネットや読書で知識を詰め込んだ知識を。  そしてある日、白い花を見て鑑定した事で、俺は前世の知識を使ってお金を稼げそうな事に気付いた。ならば今のぱっとしない暮らしをもっと豊かにしよう。俺は親友のシンハ君と挑戦を開始した。  対人戦闘ほぼ無し、知識チート系学園ものです。

無能なので辞めさせていただきます!

サカキ カリイ
ファンタジー
ブラック商業ギルドにて、休みなく働き詰めだった自分。 マウントとる新人が入って来て、馬鹿にされだした。 えっ上司まで新人に同調してこちらに辞めろだって? 残業は無能の証拠、職務に時間が長くかかる分、 無駄に残業代払わせてるからお前を辞めさせたいって? はいはいわかりました。 辞めますよ。 退職後、困ったんですかね?さあ、知りませんねえ。 自分無能なんで、なんにもわかりませんから。 カクヨム、なろうにも同内容のものを時差投稿しております。

王宮で汚職を告発したら逆に指名手配されて殺されかけたけど、たまたま出会ったメイドロボに転生者の技術力を借りて反撃します

有賀冬馬
ファンタジー
王国貴族ヘンリー・レンは大臣と宰相の汚職を告発したが、逆に濡れ衣を着せられてしまい、追われる身になってしまう。 妻は宰相側に寝返り、ヘンリーは女性不信になってしまう。 さらに差し向けられた追手によって左腕切断、毒、呪い状態という満身創痍で、命からがら雪山に逃げ込む。 そこで力尽き、倒れたヘンリーを助けたのは、奇妙なメイド型アンドロイドだった。 そのアンドロイドは、かつて大賢者と呼ばれた転生者の技術で作られたメイドロボだったのだ。 現代知識チートと魔法の融合技術で作られた義手を与えられたヘンリーが、独立勢力となって王国の悪を蹴散らしていく!

異世界転生したらよくわからない騎士の家に生まれたので、とりあえず死なないように気をつけていたら無双してしまった件。

星の国のマジシャン
ファンタジー
 引きこもりニート、40歳の俺が、皇帝に騎士として支える分家の貴族に転生。  そして魔法剣術学校の剣術科に通うことなるが、そこには波瀾万丈な物語が生まれる程の過酷な「必須科目」の数々が。  本家VS分家の「決闘」や、卒業と命を懸け必死で戦い抜く「魔物サバイバル」、さらには40年の弱男人生で味わったことのない甘酸っぱい青春群像劇やモテ期も…。  この世界を動かす、最大の敵にご注目ください!

フリーター転生。公爵家に転生したけど継承権が低い件。精霊の加護(チート)を得たので、努力と知識と根性で公爵家当主へと成り上がる 

SOU 5月17日10作同時連載開始❗❗
ファンタジー
400倍の魔力ってマジ!?魔力が多すぎて範囲攻撃魔法だけとか縛りでしょ 25歳子供部屋在住。彼女なし=年齢のフリーター・バンドマンはある日理不尽にも、バンドリーダでボーカルからクビを宣告され、反論を述べる間もなくガッチャ切りされそんな失意のか、理不尽に言い渡された残業中に急死してしまう。  目が覚めると俺は広大な領地を有するノーフォーク公爵家の長男の息子ユーサー・フォン・ハワードに転生していた。 ユーサーは一度目の人生の漠然とした目標であった『有名になりたい』他人から好かれ、知られる何者かになりたかった。と言う目標を再認識し、二度目の生を悔いの無いように、全力で生きる事を誓うのであった。 しかし、俺が公爵になるためには父の兄弟である次男、三男の息子。つまり従妹達と争う事になってしまい。 ユーサーは富国強兵を掲げ、先ずは小さな事から始めるのであった。 そんな主人公のゆったり成長期!!

処理中です...