A=Bというゲームをやってみる(つづき)2-6~

先日、2-5まで解いたのですが、2-6で詰まってしまっていたので再度挑戦しました。

このゲームには解法が複数あります


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

2-6 ただひとつ

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

問題文の意味が分かりにくかったのですが、(https://steamcommunity.com/app/1720850/)こちらの画像で理解できました。再度お借りした画像を載せておきます。

https://steamcommunity.com/app/1720850/ありがとうございます

つまり、隣とペアになれない、ぼっちを探せ!ということ
ぼっちが1つだけの場合のみtrue を返す。それ以外は複数でも0でもfalse。

解答1(18行)

aa=A
bb=B
cc=C
Aa=A
aA=A
Bb=B
bB=B
Cc=C
cC=C
a=s
b=s
c=s
A=
B=
C=
ss=(return)false
s=(return)true
=(return)false

最初は、「ペアを消せばいいんだ」と思って、”aa=P, bb=P, cc=P P= ” としてペアのものをPとしてまとめて削除したんですが、削除しちゃうとその前後に残ったaやbがペアになっちゃう可能性が。
なので、一旦それぞれを元の順通りのABCの大文字で残してみた。
で、残った小文字の子たちが「ペアでない文字」なので全てをsとする。
ペアとなったABCは不要なので削除する
ペアでない文字 s が2個以上ならfalse
1つの場合なら true
それ以外(0)の場合は false

一応これでOKは出たんですが、「追加の目的:最大13ライン」の目標が。


というわけで、減らす方法を考えてみる。
上の部分が明らかに面倒な処理をしてるよね…

解答2(まだ15行ある)

aaa=aa
bbb=bb
ccc=cc
aa=A
bb=B
cc=C
a=s
b=s
c=s
A=
B=
C=
ss=(return)false
s=(return)true
=(return)false

最初はペアを見つけてから、まだ連続した文字があるかを調べて… としていたけど、最初から3つ以上連続をペア(aa)にまとめてしまえばよかったんだね。

でもこれでもまだ15行あるので、あと2行減らさないと。



解答3(13行になった!)

aaa=aa
bbb=bb
ccc=cc
aa=P
bb=P
cc=P
a=s
b=s
c=s
P=
ss=(return)false
s=(return)true
=(return)false

ペアになった時点で、その子がどのタイプのペアかは不要なので、全てPとした。

これで13行!ぱちぱちぱち!

2-7 昇順

入力:abcからなる文字列
出力:cがbより多く、かつbがaよりも多い場合に「true」そうでなければ「false」
制約:1<=入力文字列の長さ<=7

解答1(14行)無駄が多い

ba=ab
cb=bc
ca=ac
aa=(return)false
ab=B
Bc=(return)false
B=b
bc=P
bPc=P
Pc=(return)true
=(return)false

aaを除外して→abの個数を比較→bcの個数を比較
a<b<cと3つの比較が必要なのと、文字列が”c”など一文字だけの場合の対策を考えるのにかなり時間がかかりました。しかし何か不細工なコードですねぇ。

解答2(9行)

ba=ab
cb=bc
ca=ac
aa=(return)false
abc=(return)false
bc=P
bPc=P
Pc=(return)true
=(return)false

abを比較するのに無駄にab=Bとして、さらにそれを元に戻して…とやっていたのを削除

しかしこれでもまだ9行あります。

解答3(8行)未達成

2-8 最多

入力:abcからなる文字列
出力:最も出現回数が多い文字を出力する
制約:1<=入力文字列の長さ<=7
最も多い文字が複数にはならない

解答1(15行)力技!

ba=ab
cb=bc
ca=ac
aaaa=(return)a
bbbb=(return)b
cccc=(return)c
aaa=(return)a
bbb=(return)b
ccc=(return)c
aa=(return)a
bb=(return)b
cc=(return)c
a=(return)a
b=(return)b
c=(return)c

最大7文字なので、4文字なら最多。
その条件を満たさなければ3文字が、そうでなければ2文字が…という力技です。

追加の目的は11ライン。

解答2(11ライン)未達成

2-9 最小

入力:abcからなる文字列
出力:出現回数が最も少ない文字を出力する
制約:2<=入力文字列の長さ<=7
最も少ない文字は複数にはならない

解答1(12行)

ba=ab
cb=bc
ca=ac
aaa=aa
bbb=bb
ccc=cc
ac=(return)b
abc=(return)b
bcc=(return)a
abb=(return)c
bc=(return)a
ab=(return)c

これはかなり時間をかけて試行錯誤を繰り返しました。
候補は0か1か、というのをどう出すか…

まずaa=Aと置き換えるところから抜け出せなくて、ソートした時点で “ac”と並んだらbがゼロだ!!!”abc”ならbが一個だ!!!ということに気づくのに数日かかりました…。

解答2(9ライン)

aaa=aa …ていうのもいらなかった。

ba=ab
cb=bc
ca=ac
ac=(return)b
abc=(return)b
bcc=(return)a
abb=(return)c
bc=(return)a
ab=(return)

感想など

行数を減らすチャレンジは後回しにして今はこの次の3章に進んでいます。

1日一問取り組んでみて、無理そうならその日はノートにメモだけして終わり。

あまり根をつめてやると答えを見たくなってしまうので、「今日は解けなくてもいいや」くらいの気持ちで取り組んでおります。

問題をメモしておけば、いつでもどこでも考えられるのも良いですね。

非常にシンプルながら長く遊べるゲームなので、気になった方はぜひチェックしてみてください。

https://store.steampowered.com/app/1720850/AB/


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