2017/08/25

Android 7 でのイースターエッグで表示されるねこの種類 (2)

前回は、"ねこの色などを決めている乱数のシードを0~231-1まで変えて種類を数えるしかない" となり、種類を数え切れていなかったので、今回はシードを0~2,147,483,647まで変えて数えました。

以下のような結果になりました。

まずは前回、選択可能なパターンで何種類いるか見た定義されている11色。

出現回数 種類
0xFF212121
386,547,201
2,048
0xFFFFFFFF
386,547,151
3,072
0xFF616161
300,647,462
3,072
0xFF795548
300,647,869
3,072
0xFF90A4AE
214,748,370
3,072
0xFFFFF9C4
214,748,365
3,072
0xFFFF8F00
214,748,377
3,072
0xFF29B6F6
10,737,323
3,044
0xFFFFCDD2
10,737,350
3,046
0xFFCE93D8
10,737,557
3,042
0xFF43A047
8,589,885
3,035
合計
2,059,436,909
30,599

0xFF212121 ~ 0xFFFF8F00 の色のねこは全種類出現していました。
0xFF29B6F6 ~ 0xFF43A047 の色のねこは出現回数が減るため、全種類は出ないようです。


続いて定義されている11色以外となるねこは

2,147,483,647 - 2,059,436,909 = 88,046,738 回

出現し、種類は結果だけを書くと 85,516,367 種類となりました。

このうち、定義されている11色と被る種類が、
  0xFF8F00 で 2種類
  0x29B6F6 で 3種類
  0x43A047 で 21種類
いたので、定義されている11色以外のねこは

85,516,367 - 2 - 3 - 21 = 85,516,341 種類

となります。

以上からねこの種類は

30,599 + 85,516,341 = 85,546,940 種類

となります。(書いたプログラムが合っていればですが…)

2017/08/21

Android 7 でのイースターエッグで表示されるねこの種類 (1)

先に結論を書いておくと、数え切れてません。

Android 7でのイースターエッグのねこの体の色は、定義されている11色以外に多くの色を取り得ること、各部位の色の全てのパターンが現れるとも限らないので、ねこの色などを決めている乱数のシードを0~231-1まで変えて種類を数えるしかないと思います。

2017/08/25 追記: シードを0~2,147,483,647まで変えて数えました → Android 7 でのイースターエッグで表示されるねこの種類 (2)

ひとまず、選択可能なパターンでねこが何種類いるかソースを見ながら計算してみる。
(体の色が定義されている11色以外の色があるが、今回は考えない。)




2. 目、口、鼻

https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#158

体の色が暗いか(isDark(mBodyColor))どうかで決まる。
体の色が暗いなら白、そうでなければそのまま(黒)。



3. 耳の内側

https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#161

目、口、鼻と同様に体の色が暗いかどうかで決まる。
暗ければ 0xFFEF9A9A、そうでなければ 0x20D50000。画像は"2. 目、口、鼻"と同じ。


4. 腹

https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#163,
https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#108
より、0(透明、つまり体の色と同じ)か0xFFFFFFFF(白)の2通り



5. 顔の色(というか鼻と口周り)

https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#165

腹と同じで0(透明、つまり体の色と同じ)か0xFFFFFFFF(白)の 2通り
Cat.java の167行目では顔の色が明るければ(!isDark(faceColor))口と鼻を黒くする。


顔の色が明るくなったので、口と鼻が黒くなる(右)



6. つま先

https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#172
Cat.javaの172行目からどのつま先を白くするかの処理。
174行目、4本とも白。
178行目、前足2本(Android 7.0の場合は右前足、右後ろ足)が白。
181行目、後ろ足2本(Android 7.0の場合は左前足、左後ろ足)が白。
184行目、4本のうちどれか1本が白。
172, 176, 179, 182行目の各条件を満たさない場合は、白くならない。
全部で 1 + 1 + 1 + 4 + 1= 8通り



7. しっぽの先

https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#188
白か体の色と同じになるので 2通り



8. 頭

https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#190,
https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#119,
https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#113

体の色が暗ければ(isDark(mBodyColor))、P_LIGHT_SPOT_COLORS、暗くなければP_DARK_SPOT_COLORS の各配列の中から選択。
P_LIGHT_SPOT_COLORS は Cat.java の119行目で0(透明、つまり体の色と同じ)か0xFFFFFFFF (白) の2通り。
P_DARK_SPOT_COLORS は Cat.java の113行目で0(透明、つまり体の色と同じ)、0xFF212121、0xFF6D4C41 の3通り。
暗いか暗くないかで2通り、または3通りになる。
1.の体の色では、黒いねこ(色は0xFF212121)のみisDarkがtrueになる。

体の色が暗い場合

体の色が明るい場合


9.襟

https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#194,
https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#97

P_COLLAR_COLORSで、定義されている8色
0xFFFFFFFF, 0xFF000000, 0xFFF44336, 0xFF1976D2, 0xFFFDD835, 0xFFFB8C00, 0xFFF48FB1, 0xFF4CAF50



10.蝶ネクタイ

https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#196
Cat.java の196~197行目。
0(透明、つまり蝶ネクタイを描画しない)か襟と同じ色の2通り



以上から、
1. 体の色
4. 腹
5. 顔の色(というか鼻と口周り)
6. つま先
7. しっぽの先
8. 頭
9.襟
10.蝶ネクタイ
が変わる。

黒いねこ(色は0xFF212121)の場合、
1 x 2 x 2 x 8 x 2 x 2 x 8 x 2 = 2,048 通り
それ以外のねこの場合、
10 x 2 x 2 x 8 x 2 x 3 x 8 x 2 = 30,720 通り
合計 32,768 通り

定義されている体の色だけで、これだけのパターンが考えられるので、えさを置いてねこが来て、では全部集めるのは厳しい。


おまけ: 背中

https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#164

背中も腹と同様に0(透明、つまり体の色と同じ)か0xFFFFFFFF(白)の2通りあるのですが、
https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#411
での戻り値の配列に back が抜けているため、描画されません。
backを描画するとこんなねこになります。