Fire Bird 上級Sランク攻略

諸々のストーリー楽曲に触り、残すはニジガク3rdソロ楽曲と上級+となりました。
どれから手を付けようかな〜と思っていたところはぐメタ推しさんの記事で難易度ランキングが付けられていたのでこれを参考にしようと思いました。
Just Believe!!!を除く最下位はSay Good-Bye 涙とのことですが、手持ちと相談して次点のFire Birdに挑戦することにしました。

譜面詳細

SIFAS Note Map Database

なんと言ってもAC2の6/11特技発動が気にかかります。URの特技発動率33%では期待値的には達成できません。
これに対する回答ははっきりしていて、Gdタイプでは特技発動率+50%となることです。更にノートギミックで+20%され、特技発動率は驚異の103%となります。一度発動し、更に二度目が3%の確率で発動するということですね。嘘です。
まあ100%ということなので、作戦の残り2名がGdでなくても平均して55%になります。期待値的にはこれで十分ですね。

嘘です。
よく知られているように、特技発動率は70%で頭打ちになるそうです。
ということは作戦の残り2名がGdでない場合は平均して45%になり、分が悪いです。3名中2名がGdでようやく57%となります。

編成

AC2はGd2人作戦で期待値的にはOKなんですが、この曲は楽曲デバフが解除可能なので初期梨子ちゃんデバフ解除チャレンジをしたい。更にAC4も特技ACであることを考えると、できるだけ確率を高めて運ゲー度を下げたいところです。ということでGd3人作戦を用意します。

さて、Gd3人作戦を使うならば、メイン作戦はGGGを検討してみます。
AC2でGd3人作戦を使うので、そこまでメイン作戦で行くと、60ノートはメイン作戦で踏みます。 AC1を開幕で達成(ありえないと思いますが)できても17引いて43ノートとなります。
1ノートあたりのダメージは801なので、実に34443ダメージを受けます。これを受けて緑ゲージを維持するには114810ものスタミナが必要になります。
そんなの無理なので途中でGd3人作戦に切り替える必要がありますが、もう面倒なのでGGSで行くことにしました。

f:id:AT_libra:20201105023347p:plain

凸は左から2,1,1,2,5,5,0,0,0です。
Gdを完凸ってどうなのかという葛藤はあったのですが、早くメロンを投資してリターンを得たかったところにもののけ海未ちゃんが3凸(他は2凸)したので尖らせて使うという判断をしました。
テクニックが高いので巾着袋の落ちる数が増えたのがリターンですね。

緑作戦がGd3人です。これらは全員ダメ軽減という残念特技持ちですが、完凸海未ちゃんがいるので回復もシールドも不要で、単に殴りが強いものと初期梨子ちゃんを入れただけです。
海未ちゃんの回復量は32%なので、1ノートあたりの回復量は18484*0.32*0.33/3=650で差し引き150程度のダメージとなり、ノート数162なので最大総ダメージ24300, これを緑ゲージで凌ぐには81000……なんと推奨スタミナと一致しました。でこの編成のスタミナはそれを上回っているから過剰ですね。緑作戦切替時のボーナスもありますし。

f:id:AT_libra:20201105163645p:plain

アクセはこんな感じです。
付け方の方針としてはメイン作戦にアピール降順で付け、SP特技メンツがいる作戦にテクニックが高いDLPアクセを付け、他は申し訳程度のブレスレットですね。
メイン作戦には多少アピールで劣ってもブローチを着けるべきなのか、SP特技メンツがいようとブレスレットを着けるべきなのか、ちゃんと検証していません。

プレイング

特に言うことがないです。AC2と4で緑作戦に切り替えるぐらいで。

あと青作戦がVo+10%なのでSP特技撃つときはこれにするようにしてましたが、少なくとも5ノートは青作戦で踏むことのマイナスとの比較をちゃんとしてません。
簡単に言うと、SP特技で100,000ボルテージ稼げるとき青作戦にすれば更に10,000稼げるけど、赤作戦と青作戦の1人あたりの獲得ボルテージの差が2,000あったらトントンですよねって話です。

結果

f:id:AT_libra:20201105165107p:plain

あっさり成功しました。やっぱりニジガク3rd曲としてはやさしめでしょうか。
まあ完凸海未ちゃんが大活躍してくれたおかげと言えそうです。

スクスタ20章

まあ酷いですね。

どこが酷いのか考えると、ランジュによる同好会への執拗な弾圧に概ね集約されるという結論に至ったので書いておきます。
20章をプレイした人向けの記事です。

愛さん果林さん、転部する

愛と果林(と栞子)は部に移ります。その理由として、愛は「弾圧下の同好会では練習できない」及び「部のやり方に興味がある」、果林は「仲良しこよしではなくレベルの高い環境に身を置きたい」と言っています。

これはよいです。
同好会入会前、愛は「色々楽しみたいから1つの部活には入らない」といい、果林は軽い気持ちという感じでした。それが「練習したい」「レベルアップしたい」と思うまでスクールアイドルに熱中しているのはよいことです。(練習できないのは弾圧のせいですが)
これだけならば、同好会メンバーに接してる態度をまあまあ許せるというか、かすみんが意固地になっているという言い方も出来ます。

しかし、同好会は弾圧を受けている。そして愛と果林はその弾圧を行っている部に行った。
これは歴史物でよくある、もとい世界中で現在進行形で発生している「弾圧に耐えかねて体制側に寝返った」状態なんですよね。
実際の世界では弾圧をどうにかするのは難しく、命にも関わってくるので寝返りがいいとか悪いとかは余人が判断できる問題ではありません。しかしスクスタストーリーは当然ながら現実ではなく、そもそも理事長の娘だからといって生徒会役員を自分のために使って弾圧しているというのが無茶苦茶なので、同様に無茶苦茶な手段で弾圧を跳ね除けることだってできるはずです。
こう考えると、さっさと寝返るのではなく、同好会に残り、いかに弾圧をかいくぐり、逆転するかを一緒に考えてほしかったというのがあります。

とはいえ、話の作り上そう簡単に解決されては困るというか、ここで一旦離脱者を出したいという考えがあったのでしょう。それはそれで構いませんが、その場合愛と果林の振る舞いが問題になります。
「練習したい」「レベルアップしたい」という目的があるにせよ、同好会を弾圧する部に行った。
同好会メンバーは「仲間」で「ライバル」と表現されますが、どこに身を置こうが「友達」ですよね。
友達を苦しめている部に参加した。なんなら部に参加することによって部の勢いを増すことに一役買っていると言える。そんな状態、同好会に顔向けできないと思うのが普通でしょう。同好会とは袂を分かつぐらいの覚悟で行ってほしいし、そこまでいかずとも、自分からは極力同好会に関わらないようにするでしょう。

ところが愛と果林の軽薄な態度。「まだ転部したこと言ってるの?」と言わんばかりのヘラヘラした言動。同好会は相変わらず弾圧されてるのに。ここがあまりにも酷いところです。思いが至らないのだとしたら考えが浅すぎる。同好会メンバーと愛と果林を直接会わせなくても話は作れた。もしこれが必要な演出だと言うのなら、その狙いは愛と果林を貶める以外にないでしょう。

終盤、部は同好会のゲリラライブにぶつけてライブを行います。これは主人公が動揺していることからもわかるように偶然ではなく、ゲリラライブの正確な場所がわからず監視委員会(これひどすぎる)を送り込めないから観衆を奪っちゃおうということでしょう。そんな明らかな妨害目的ライブで、3人はどんな気持ちでバックダンサーを務めたんでしょうね。まさか「これで観衆を奪われるようならその程度のレベルということ」などとは思ってませんよね。弾圧されてるのでフェアな勝負になってませんからね。

しかし、酷い一枚ですね。 f:id:AT_libra:20201101200203p:plain これ、弾圧がなかったとしてもキツいわ。それぞれソロ曲の衣装を身につけながら、やってることはバックダンサー……。金あるんだろ? バックダンサー用に衣装用意してやれよ。蟹もな。こんな立ち回りさせるんだから、ソロ曲衣装でバックダンサーとか惨めさの上塗りやめろよ。そんな考えには至りませんか。

ランジュ、悪なるもの

これまで、弾圧という要素を入れたことによる愛と果林への悪影響を書きましたが、弾圧を行っている張本人、ランジュについて。

ランジュがなぜ弾圧しているのか、明確な発言はありませんが、普通に考えるなら「自分がせっかく最高の部を作ったのに、部に入らずスクールアイドル活動をしているのが気に食わない」といったところでしょう。これなら弾圧は明確な嫌がらせ、悪意ですね。

ところが栞子は、ランジュについて「悪意はなく、自分の行動がみんなにとっていいこと、正しいことだと思っている」と述べています。
この栞子とかいう女、生徒会長かつランジュの幼馴染ということで、ランジュを止めうる最有力候補なのに、口だけ「なんとか協力します」といいつつ何もしてませんね。まああんまり動かれてもまた栞子無双かよって言われそうで難しいところではありますが。

話がそれました。ランジュに悪意がないのならば、弾圧を行う理由は以下のように考えられるでしょう。

スクールアイドルをやるなら自分の作った部に入るのが正しい。しかし同好会メンバーは入らない。それは同好会が存在するから。だから同好会を活動不能にして、部に入るように仕向けよう。それが本人たちのため。

いずれ私が正しいとわかり感謝する日が来るでしょう、とでも言いそうですね。これは……まあ雑に言うとヤバいやつですね。悪意がないのはもっともタチが悪いと言いますが、それですね。

様々な時空でスクールアイドル部は廃部の危機に晒されていますが、廃部にしようとする者の動機は「自分たちが辛い思いをした」とか「関係者が惨めな人生(主観)を送るのを見た」から「同じ目に遭ってほしくない」という、間違ってはいるんですけど相手のことを考えてのものなんですよね。
ランジュも押し付けだしあまり変わらないのでは? という考えもあるかと思いますが、前2名は心境を語るとき憂い、悔しさ、辛さを滲ませそうなのに対して、ランジュは平然と、むしろ笑顔で言いそうだなってのが僕の考える違いです。

ランジュについては以上のように考えているのですが、率直に言ってヤバいやつは不要でしょう。そういうゲームじゃねえからこれ。しかもただ登場するだけでなく、ゆくゆくは仲間になるやつですよね? 3Dモデルまで作ってんだから。しかしたとえ改心したとしても、ヤバいやつが仲間になるのは嫌です。というか改心可能なんですかね? いや、改心してヤバさが抜けたとしても、弾圧はあまりにも大きすぎるマイナスです。栞子は仲間になりましたが、栞子はこんな不当かつ執拗な弾圧をしていないでしょう。

それでも、仲間になるんでしょうね。一体どう着陸させるのでしょうか。

まとめ

ランジュが同好会を執拗に弾圧しているため、既存キャラが貶められ、ランジュの今後についても納得できる経過は到底望めないということを書きました。

恋になりたいAQUARIUM 上級Sランク攻略

ここ2ヶ月ぐらいスクスタというソシャゲにハマっており、
いやもともとリリース時からやってたんですが飽きて放置していたところ、推しのいいカードが出たんでゆるゆると復帰しました。なお引けませんでした。

今は全譜面をSランククリアすることを目標にやっていて、収録曲の1つ「恋になりたいAQUARIUM」がイベント課題に選ばれたのを機にSランクを狙い、達成できました。色々工夫したので書いておきたいと思います。

恋になりたいAQUARIUM(上級)について

情報は以下のサイトを参照ください。

SIFAS Note Map Database

このサイト、非常に詳しいです。国際版もあるとはいえ日本のソシャゲですが、ここまで詳しい日本の攻略サイトありますかね……?

この曲の攻略に関して留意すべき点は以下のとおり。

  • クール以外はアピール-20%, 解除不可
  • AC1の前に10,000ダメージノートが4つ
  • AC2ではGdタイプ以外アピール-50%

編成

AC2を考えるとGd3人作戦が必要ですが、曲通してGd3人では火力不足です。そこでメイン作戦とGd3人作戦の2つを用意し、AC2はGd3人作戦で受けます。またAC1と3もGd優遇であるためGd3人作戦を使います。
AC1でGd3人(できるだけ回復)使うことで直前の40,000ダメージを回復し、AC3でも同様に回復することを考えると、メイン作戦には回復は不要であると考えられます。

結果以下のような編成となりました。

f:id:AT_libra:20201031015415p:plain

凸は左から2, 0, 0, 0, 5, 0, 2, 0, 0となっています。弱。
課金すれば改善されるとは思うのですが、全譜面Sぐらいなら無課金で達成できるだろうというのと、課金した場合の目標を決めかねているため、ほとんど無課金です。

赤がメイン作戦、緑がGd(回復)3人、青はSP特技火力の凛ちゃんとアピール+:全員の2名です。イベント真面目にやってれば右のかすみんは1凸だったんですが当時はやる気がなかったんですね。

アクセのSSは撮り忘れました。

プレイング

開幕で赤作戦に変更します。

ダメージノートを踏む直前に緑作戦に変更します。これによりダメージを15%カットできます……一方で作戦切替ボーナスはほとんど無駄になります。踏んでから変えるのとどっちがいいんでしょうね。
そのままAC1に突入します。途中でACクリアと同時くらいにSPゲージが溜まります。すかさず撃っておきたいところですが、実は青作戦がVo2人であるため、青に切り替えてから撃つと10%伸びます。その後5ノート踏むと緑に戻せます。

AC1を抜けたら赤に戻します。AC2にたどり着く前にSPゲージが溜まります。ACで撃ったほうが10%増えますが、AC2ではGd以外アピール-50%であるため、AC2で撃つのは美味しくないです。かと言ってAC3まで引っ張るのは撃てる回数が減るので、青に切り替えて撃ちます。

Gdのボーナスノートを踏む前に緑に変更し、そのままAC2に入り、抜けます。ここではSPゲージは溜まりきらないはず。

AC2を抜けてしばらくすると最後の10,000ダメージを踏むので、赤に切り替えます。途中でSPゲージが溜まりますが我慢し、AC3に入るときに青に切り替えてAC3開幕を踏んだら撃ちます。クールタイムが終わったら緑に変更します。そのうちまた溜まるので青に切り替えて撃ちます。このぐらいでAC3が終わるはず。

以降はずっと赤で、SP特技を撃つときだけ青に交換します。
これは今計算して知ったのですが、AC3を抜けた時点で残り65ノートほどで、ノートダメージ187であるためここからの総ダメージは12155程度です。もしAC3を抜けた時点でスタミナが全快していれば、スタミナ値40516あれば回復無しで緑ゲージをキープできます。

結果

f:id:AT_libra:20201031022205p:plain

ギリギリで達成できました。
この前に、SP特技を青で撃っていなくて、ギリギリ足りないということが2回ほどありました。
今回は編成とプレイング両方考えることがあって達成感がありました。

「ここはこうした方がいい」「そのりくつはおかしい」といったことがあったらコメントいただけると勉強になります。

確率分布の利用 (3) もっとベイズ的アプローチ

なんとなく昔学んだことを吐き出したくなりました3。

お題

コイントスn回繰り返してr回表が出た。更に1回コイントスしたとき表が出る確率を考える。

解答

確率分布パラメータを推定しない解

\thetaを推定せず、\thetaの確率分布を利用して、更に1回コイントスしたとき表が出る確率p(H|n,r)を計算する。


\begin{aligned}
p(H|n,r) &= \int_0^1 p(H, \theta | n, r) d\theta \\
&= \int_0^1 p(H|\theta, n, r) p(\theta | n, r) d\theta \\
&= \int_0^1 \theta p(\theta | n, r) d\theta \\
p(\theta|n,r) &\propto \theta^{r+\alpha-1}(1-\theta)^{n-r+\beta-1}
\end{aligned}

 p(\theta|n,r) は確率分布であるから\displaystyle{ \int_0^ 1 p(\theta|n,r) d\theta = 1 }を満たす。ベータ関数の定義より


\displaystyle{ \int_0^1 p(\theta|n,r) d\theta } = B(r+\alpha, n-r+\beta)

であるから


p(\theta|n,r) = \displaystyle{ \frac{ \theta^{r+\alpha-1}(1-\theta)^{n-r+\beta-1} }{ B(r+\alpha, n-r+\beta) }}

よって


\begin{aligned}
p(H|n,r) &= \frac{ 1 }{ B(r+\alpha, n-r+\beta) } \int_0^1 \theta \theta^{r+\alpha-1}(1-\theta)^{n-r+\beta-1} d\theta \\
&= \frac{ 1 }{ B(r+\alpha, n-r+\beta) } \int_0^1 \theta^{r+\alpha}(1-\theta)^{n-r+\beta-1} d\theta \\
&= \frac{ B(r+\alpha+1, n-r+\beta) }{ B(r+\alpha, n-r+\beta) } 
\end{aligned}

ここで


\begin{aligned}
B(\alpha, \beta) &= \frac{ \Gamma(\alpha) \Gamma( \beta ) }{ \Gamma( \alpha + \beta ) } \\
\frac{ \Gamma(x) }{ \Gamma(x - 1) } &= x - 1
\end{aligned}

であるから


\begin{aligned}
p(H|n,r) &= \frac{ \Gamma(r+\alpha+1) \Gamma(n-r+\beta) }{ \Gamma(r+\alpha) \Gamma(n-r+\beta) } \frac{ \Gamma(n + \alpha + \beta) }{ \Gamma(n + \alpha + \beta + 1) } \\
&= \frac{ r+\alpha }{ n + \alpha + \beta } 
\end{aligned}

となる。 これは最尤推定においてコインを n + \alpha + \beta 回投げ、うち r+\alpha回表が出た場合に相当する。 また n = r = 0, \alpha = \beta = 1 とすると \displaystyle{ \frac{ 1 }{ 2 }}となり、事前分布を一様分布として1回もコインを投げていない場合の表が出る確率を示している。

確率分布の利用 (2) MAP推定

なんとなく昔学んだことを吐き出したくなりました2。

お題

コイントスn回繰り返してr回表が出た。更に1回コイントスしたとき表が出る確率を考える。

解答

確率分布パラメータを推定する解

MAP推定

確率分布パラメータ\thetaは確定していなく、これもまた何らかの確率分布に従っている。 コイントスn回繰り返してr回表が出たときの\thetaの確率分布p(\theta|n,r)を考える。これを事後分布という。

ベイズの定理から


\begin{aligned}
p(\theta|n,r)&=\displaystyle{\frac{p(\theta, n, r)}{p(n, r)}}\\
&\propto p(n, r|\theta)p(\theta)\\
p(n, r|\theta)&=\displaystyle{\binom{n}{r}}\theta^r(1-\theta)^{n-r}
\end{aligned}

p(\theta)コイントスをする前の\thetaの確率分布であり事前分布という。 事前分布についてはなんら情報がないが、共役事前分布というものを用いるのが一般的(と思う)。 共役事前分布は事象の確率(関数)と同じ形の確率分布である(正確な定義は知らない)。

なぜ共役事前分布を用いるのか、そうすると便利以外の理由は知らないが、例えばコイントスを1回やってから事後分布を求め、更にコイントスを行い2回目の事後分布を求めることを考える。 このとき1回目の事後分布は2回目の事前分布であるから、事前分布と事後分布は同じ形でなければならないと考えられる。

コイントスを繰り返す試行の確率分布(二項分布という)の共役事前分布はベータ分布である。


p(\theta) = \displaystyle{\frac{\theta^{\alpha-1}(1-\theta)^{\beta-1}}{ B (\alpha, \beta)}}

事後分布を最大にする\thetaの値をもって\thetaの推定値とするのがMAP推定。


\begin{aligned}
\displaystyle{\frac{\partial}{\partial\theta}}p(\theta|n,r)&\propto \displaystyle{\frac{\partial}{\partial\theta}}\theta^r(1-\theta)^{n-r}\cdot \theta^{\alpha-1}(1-\theta)^{\beta-1} \\
&= \displaystyle{\frac{\partial}{\partial\theta}}\theta^{r+\alpha-1}(1-\theta)^{n-r+\beta-1}\\
&= (r+\alpha-1)\theta^{r+\alpha-2}(1-\theta)^{n-r+\beta-1} + \theta^{r+\alpha-1}(n-r+\beta-1)(1-\theta)^{n-r+\beta-2}\cdot(-1) \\
&= \theta^{r+\alpha-2}(1-\theta)^{n-r+\beta-2}\bigl((r+\alpha-1)(1-\theta)-\theta(n-r+\beta-1)\bigr)
\end{aligned}

\displaystyle{\frac{\partial}{\partial\theta}}p(\theta|n,r)=0なる\thetaを求める。


\begin{aligned}
(r+\alpha-1)(1-\theta)-\theta(n-r+\beta-1)&=0\\
r+\alpha-1-(r+\alpha-1)\theta-\theta(n-r+\beta-1)&=0\\
(n+\alpha+\beta-2)\theta&=r+\alpha-1\\
\theta&=\frac{r+\alpha-1}{n+\alpha+\beta-2}
\end{aligned}

ということで、コイントスを1回行って表が出る確率\theta\displaystyle{\frac{r+\alpha-1}{n+\alpha+\beta-2}}と推定されたので、更に1回コイントスしたとき表が出る確率は\displaystyle{\frac{r+\alpha-1}{n+\alpha+\beta-2}}と考えられる。 この値は最尤推定と比較して\alpha, \betaという変数を追加することにより観測値の影響を調整している。

またベータ分布において\alpha=\beta=1とすると一様分布となるが、このときMAP推定値は\displaystyle{\frac{r}{n}}となり最尤推定と一致する。

確率分布の利用 (1) 最尤推定

なんとなく昔学んだことを吐き出したくなりました。

お題

コイントスn回繰り返してr回表が出た。更に1回コイントスしたとき表が出る確率を考える。

解答

確率分布パラメータを推定する解

最尤推定

コイントスn回繰り返してr回表が出る確率は以下のようになる。


\displaystyle{\binom{n}{r}}\theta^r(1-\theta)^{n-r}

ここで\thetaコイントスを1回行って表が出る確率。

今回は「コイントスn回繰り返してr回表が出る」という事象は既に起こったことなので確率ではなく尤度といい、Lと表記する。


L(\theta)=\displaystyle{\binom{n}{r}}\theta^r(1-\theta)^{n-r}

この尤度が最大になるような\thetaの値をもって\thetaの推定値とするのが最尤推定


\begin{aligned}
\displaystyle{\frac{\partial}{\partial\theta}}L(\theta)&\propto \displaystyle{\frac{\partial}{\partial\theta}} \theta^r(1-\theta)^{n-r} \\
&= r \theta^{r-1} (1-\theta)^{n-r} + \theta^r (n-r)(1-\theta)^{n-r-1} \cdot (-1)\\
&= \theta^{r-1}(1-\theta)^{n-r-1}\bigl(r(1-\theta)-\theta(n-r)\bigr)
\end{aligned}

\displaystyle{\frac{\partial}{\partial\theta}}L(\theta)=0なる\thetaを求める。


\begin{aligned}
r(1-\theta)-\theta(n-r)&=0\\
r-r\theta-\theta(n-r)&=0\\
n\theta&=r\\
\theta&=\frac{r}{n}
\end{aligned}

ということで、コイントスを1回行って表が出る確率\theta\displaystyle{\frac{r}{n}}と推定されたので、更に1回コイントスしたとき表が出る確率は\displaystyle{\frac{r}{n}}と考えられる。

Pythonのイテレータで無限ループしてしまった話と解決策3つ

Pythonイテレータって遅延評価で、それは普通いいことなんですけど、うっかり無限ループしてしまいました。

問題

リスト l の各要素に100を足して l にappendするつもりで以下のコードを書きました。

l.extend(map(lambda i: i+100, l))

map()イテレータを作り、 extend() により評価されるたびに第2引数の l (か iter(l) )の次の要素がyieldされるわけですが、 lextend() により長さが増えていくので、いつまでも終わりにたどり着かないわけですね。

解決策

リストをコピーする

extend() により伸びていくリストではなく、それを呼ぶ前のスナップショットをイテレートします。

l.extend(map(lambda i: i+100, l[:]))

イテレータを先に評価する

extend() より先に map() の評価を終わらせます。リスト内包でもいいです。

l.extend(list(map(lambda i: i+100, l)))

イテレータに終わりを設ける

extend() する前の長さで終わりにします。

from itertools import islice

l.extend(map(lambda i: i+100, islice(l, len(l))))