頭の体操?A=Bというゲームをやってみる/ Steam

A=B ってどんなゲーム?

SteamにA=Bというゲームがあります。
windows,macともにプレイ可能。Steamのレビューでは「圧倒的に好評」となっています。

以下はSteam公式ページにあるゲームの概要です。

このゲームについて

A=Bは命令が1つしかないプログラミングゲームです:A=Bで、AをBに置き換えるという意味です。

ゲームの中では以下のことができます。
このシンプルなプログラミング言語を使ってさまざまな問題を解決する。それぞれの文字を大文字に置き換えることから2つの2進数を乗算することまで
できるだけ少ない行数でチャレンジする。
A=Bの真の力を発見する。

https://store.steampowered.com/app/1720850/AB/?l=japanese

ふむふむ、解説読んでもよくわからないけど、A=Bみたいなコードをお題に沿って書く、ということね(面白そうやん)という認識で購入。(プログラマじゃなくても出来るらしいし)

定価は580円です。

しかしこんなものを買ってしまうなんて、私はコードを書きたいんだろうか…(それならゲーム作れば… むにゃむにゃ)

画面はいたってシンプル。左上にお題が出て、プレイヤーが入力するのは、右下の部分。1,2,3とタブがあり3つのデータが保存できるようです。

左側の再生ボタンで、自分の書いたコードを再生し、正誤をチェックできます。

問題の進め方

1問目からやってみる

最初の画面では、A=Bを選択し、「コンパイラの原理の講座の課題提出の遅れについて」という生徒から教授へのレポートを読みます。

すると最後に「コースレポート.pdf」なるものが添付されており、これを見ると、インターフェースの説明などを見ることができます。このようなPDFはゲームが進むたびに出てくるみたいで、その都度しっかり見ておく必要があります。

添付されたPDFの一部

以下のようなルールも明記されています。

実行フロー
1 入力文字列の読み込み
2 実行可能な最初の命令を上から下に向かって探していく
2.1 実行可能な命令がある場合、現在の文字列を置き換える
2.2 実行可能な命令がない場合、実行を終了して現在の文字列を出力する

ルールをざっくり理解したところで実際にプレイしてみましょう

以下はネタバレを含みます。

1-1

AをBに
入力:abcからなる文字列
出力:すべてのaをbに置き換える
制約:1<=入力文字列の長さ<=7

(1問目は確か最初から解答が書かれていたと思います)

a=b

左のボタンで再生(早送り)するとコードが検証され、エラーがなければ以下のような画面になります。

(完成)やAcceptedとなっていればOKなので、メニューに戻り、次の問題に進みます。

1-2 大文字

入力:abcからなる文字列
出力:すべての文字を大文字に置き換える
制約:1<=入力文字列の長さ<=7

(教授からの返信も来てます。今のところ問題には関係ないようだけど、読んでおくと面白そう)

ふむふむ。

これも簡単ですよね。

a=A
b=B
c=C

無事正解。文系でも大丈夫だぁ〜

1-3 重複削除

入力:abcからなる文字列
出力:連続した同じ文字を1文字に置き換える
制約:1<=入力文字列の長さ<=7

2個以上ある場合、それを1個にしていけば良いのですよね。

aa=a
bb=b
cc=C

最初にaa=a,aaa=a,aaaa=a,aaaaa=a……?と書いたのは内緒w

1-4 重複削除2

入力:abcからなる文字列
出力:連続したaを取り除く
制約:1<=入力文字列の長さ<=7

aaa=aa
aa=

最初はaa=””としてしまったんですが、”"は不要でした。(文字列を空にするの””入れたくなりません??)

1-5 ソート

入力:abcからなる文字列
出力:入力をアルファベット順に並び替える
制約:1<=入力文字列の長さ<=7

ca=ac
cb=bc
ba=ab

合ってるかどうか再生のたびにドキドキしつつ… 何とかセーフ

1-6 比較

入力:aとbからなる文字列
出力:最も出現回数の多い文字
制約:1<=入力文字列の長さ<=7
aとbの個数は異なる

ab=
ba=
aa=a
bb=b

入出力例を見て、メモ書きもして、ペアずつ消せばいい、ということは分かったのですが、それだけだとbbbbbみたいなのが残っちゃう。連続した文字を消すのはさっきやったよね!(もう忘れてる)

ここでA=Bの問題が終了し、次に「キーワード」という新しい問題リストに進みます。

2-1 Hello World

「これでA=Bはhelloworldを出力できます」というメッセージの中の CorseReport.pdf を読んでおきます。

入力:abcからなる文字列
出力:helloworld
制約:1<=入力文字列の長さ<=7

=(return)helloworld

ふふふ余裕ですよね

2-2 AAA

入力:abcからなる文字列
出力:入力にaが3つ以上含まれていれば「true」そうでばければ「false」を出力する
制約:1<=入力文字列の長さ<=7

b=
c=
aaa=(return)true
=(return)false

aさえ数えればいいんでしょっ

2-3 ちょうど3文字

入力:abcからなる文字列
出力:入力がちょうど3文字なら「true」そうでばければ「false」を出力する
制約:1<=入力文字列の長さ<=7

b=a
c=a
aaaa=(return)false
aaa=(return)true
=(return)false

ここでもaaaa=(return)false, aaaaa=(return)false….と途中まで書きました
ちゃうよなぁーと思いつつも止められない。
4文字以上ならどの場合でもaaaa=(return)falseを実行するからそこでプログラムはストップするんだよね
こうやって落ち着いて書いてれば分かるんだけど…

2-4 余り

入力:abcからなる文字列
出力:入力文字列の長さを3で割り、その余りを出力する。
制約:1<=入力文字列の長さ<=7

b=a
c=a
aaa=
aa=(return)2
a=(return)1
=(return)0

3で割った場合、余りは0、1、2のどれか、だよね…

割る、というので / を使うのかな?とまず思いましたが(ここではそんなルールは提示されてないよねーーー)
ここも aaaというひとまとまりごとに消していけばいいんだっ

2-5 奇数

入力:abcからなる文字列
出力:各文字の数がすべて奇数または0の場合に「true」を出力する。そうでなければ「false」を出力する
制約:1<=入力文字列の長さ<=7

ここらでだいぶもう力尽きてきました。

言われていることは単純なことなんだけど、全てが奇数か0か、どやって出すの??

ba=ab
cb=bc
ca=ac
aaa=a
aa=(return)false
bbb=b
bb=(return)false
ccc=c
cc=(return)false
=(return)true

前半のソートするところまではいけたんですが、後半がわからず、ネット上のヒントを見てしまいました。

えーとまずソートしてaaabbcccみたいな形にするでしょ。
全てが奇数または0以外は、falseなので、
aaa=aとするとー、例えばaaaaa(aが5こ)の場合は、aaaとなってー、次にこれがaとなる、と。
もし aaaa(偶数)ならaaa=aのところで、aaとなるから、次のaa=(return)falseで終わる、と。
同じことをbでもcでもやって、どこにも引っかからない場合が trueになる、と。
そそ、そゆことだよね??

2-6 ただひとつ

入力:abcからなる文字列
出力:両隣の文字と異なる文字が1文字だけの場合「true」を出力する。そうでなければ「false」を出力する
制約:1<=入力文字列の長さ<=7
例えば、「babbcc」では最初のaと最初のbが両隣の文字と異なるので「false」

は?

「例えば」の例を何度読んでも、問題の意味が分からない…

Steamのストアページのコミュニティにも問題文に関するヒントがありました。

画像をお借りしております。(https://steamcommunity.com/app/1720850/

隣の文字とペアに出来ない子は、1と数えるんですね。(上の画像だと赤文字の子)

で、その1の子が1つだけの場合のみtrue を返すと。複数でも0でもfalse。

はい。

そこまで何とか理解しました。

がしかし、解けません…

後日、再度挑戦してみたいと思います。

問題文を理解するのに時間かかったわ… 翻訳の問題なの??

ここまで読んで気になった方はぜひ

このゲーム、購入前に検索してみたところ、プログラマじゃなくてもパズルやなぞ解き感覚で楽しむ出来る と書かれてました。

えええー、ほんまかいな、と今は思ってます。

でも解きたい。ぼちぼちやっていきたいと思ってます。

そしてここまで読んでくださった方は、「どんなゲーム?」って興味を持たれた方ですよね?!

ぜひ一度ストアをチェックしてみてください。


A=B  Steam公式サイト

定価でも580円とお手頃で、じっくり楽しめそうです


にほんブログ村 にほんブログ村へ