Planet Names【Turing Complete編】
はじめに
いつもブログをご覧いただきありがとうございます。
コーストFIRE中のIPUSIRONです
Planet Namesステージ
Planet Namesステージのゴールは、空白区切りの単語の頭文字を大文字に変換することです。
クルー曰く、我々はインターンに惑星の名前を人間の文字で入力してもらったとのことです。残念ながら、彼は名前を大文字にするのを忘れていたようです。
我々のLEGアーキテクチャーに対して、入力として惑星名のASCIIコード文字列が与えられます。


小文字と大文字の相互変換
ASCIIコード表を参照してください。ASCIIコード表はネットで公開されていますし、シミュレーターのManual内にも収録されています。
・空白は32d
・小文字a-zは、97d~122d
・大文字A-Zは、65d~90d
小文字と大文字の差はちょうど32です。つまり、小文字から大文字に変換したければ、32を引くだけです。
※典型的かつ単純なアルゴリズムです。


例えば、"arev katra qui’lari"という文字列が入力されたとき、"Arev Katra Qui’lari"を出力することになります。
入力の候補文字は、小文字a-z、アポストロフィー、空白、ハイフンになります。アポストロフィーやハイフンが名称の先頭にくることはないので、32を引いて意図しない文字になることは考慮しなくて済みます。
Planet Namesステージを解く
1:プログラムを設計する
①惑星名を構成する文字が次々と送られてくるので、RAMに保存していく。
※スタックに保存すると「後入れ先出し」なので不都合なので、RAMに保存しました。
②空白がきたら、取り出し処理に移行する。
その際、1文字目だけ大文字に変換し、2文字目以降は取り出したデータ(小文字)のまま出力する。
③すべての文字を出力したら、入力待ち状態に移行し、ステップ1に戻る。

2:プログラムを実装する
RAM内の文字列の終端をNULL(0d)で識別してはいけません。なぜなら2つ目の単語が1つ目の単語より短い場合、2つ目の単語の終端の位置に1つ目の単語の一部があるためです。
読み取った文字数を保持しておき、それを出力する文字数として使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | const SPACE 32 const INDEX REG1 const FLAG_TOUPPER REG2 const NAME_SIZE REG3 label main ADDi INPUT 0 REG0 IF_EQi REG0 SPACE output ADDi INDEX 0 RAM SAVE REG0 _ _ ADDi INDEX 1 INDEX IF_EQ REG0 REG0 main # 強制ジャンプ. label output ADDi INDEX 0 NAME_SIZE XOR INDEX INDEX INDEX CALL OutputName _ _ ADDii SPACE 0 OUTPUT # 空白出力. XOR INDEX INDEX INDEX IF_EQ REG0 REG0 main # 強制ジャンプ. # main処理終わり. # RAMから文字列を取り出して出力する. # ただし1文字目だけは大文字にする. label OutputName ADDi INDEX 0 RAM LOAD _ _ REG0 IF_GT_EQ INDEX NAME_SIZE ret IF_NOT_EQi FLAG_TOUPPER 0 output_char SUBi REG0 SPACE REG0 # 大文字化. ADDii 1 0 FLAG_TOUPPER label output_char ADDi REG0 0 OUTPUT # 実際の出力. ADDi INDEX 1 INDEX IF_EQ REG0 REG0 OutputName # 強制ジャンプ. label ret XOR FLAG_TOUPPER FLAG_TOUPPER FLAG_TOUPPER RET _ _ _ |

3:テストする
16のテストパターンがあります。
テストにパスすると、ステージクリアになります。
