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つ目の単語の一部があるためです。
読み取った文字数を保持しておき、それを出力する文字数として使います。
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のテストパターンがあります。
テストにパスすると、ステージクリアになります。