当サイトの一部ページには、アフィリエイト・アドセンス・アソシエイト・プロモーション広告を掲載しています。

Amazonのアソシエイトとして、Security Akademeiaは適格販売により収入を得ています。

広告配信等の詳細については、プライバシーポリシーページに掲載しています。

消費者庁が、2023年10月1日から施行する景品表示法の規制対象(通称:ステマ規制)にならないよう、配慮して記事を作成しています。もし問題の表現がありましたら、問い合わせページよりご連絡ください。

参考:令和5年10月1日からステルスマーケティングは景品表示法違反となります。 | 消費者庁

Planet Names【Turing Complete編】

はじめに

いつもブログをご覧いただきありがとうございます。

コーストFIRE中のIPUSIRONです😀

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のテストパターンがあります。

テストにパスすると、ステージクリアになります。