λx. x K S K @はてな

このブログ内に記載された文章およびコードの著作権は,すべて Keisuke Nakano に帰属します.

3 進数を侵略しようではなイカ


この記事は Functional Ikamusume Advent Calendar jp 2010 によって侵略されたでゲソ.

2 進数の国の関数型イカ*1 が 3 進数を侵略するという話をしようではなイカ

イカの国にはメスとオスがいるでゲソ. イカのメスとオスは,胴の斑点が丸状か線状かで見分けられるから, メスは =0> ,オスは =1> と書こうではなイカ

メスは戦闘タイプで,オスはとても弱いでゲソ. たとえば,3 進数のキャラ 0, 1, 2 ( 0 が一番弱くて 2 が一番強い) が現れたら,

  • メスは強いので相手を 1 つ弱くするでゲソ ( 0 はそのまま ).
  • オスはバカなので相手を 1 つ強くしてしまうでゲソ ( 2 はそのまま ).
というルールで戦闘するでゲソ. でも,戦闘相手が 1 の時は我々は性転換してしまうという特徴があるでゲソ. そして,一度闘った相手は背後に回るので,後続の仲間に闘ってもらうでゲソ. つまり,我々が左から右に攻めるとするなら,イカのようなルールで闘うことになるのではなイカ
  1. =0> 0 なら,0 =0> ( 0 なのでそのままではなイカ.相手は背後 (左) に回るでゲソ.)
  2. =0> 1 なら,0 =1> ( 1 なので 1 つ弱くして 0 にするけど,性転換してオスになるでゲソ.)
  3. =0> 2 なら,1 =0> ( 2 なので 1 つ弱くして 1 にするでゲソ.)
  4. =1> 0 なら,1 =1> ( 0 なので 1 つ強くして 2 にするでゲソ.)
  5. =1> 1 なら,2 =0> ( 1 なので 1 つ強くして 2 にするけど,性転換してメスになるでゲソ.)
  6. =1> 2 なら,2 =1> ( 2 なのでそのままではなイカ.)
0 は無害だから,3 進数のキャラを全部 0 にしたら侵略成功でゲソ. でも,やっぱりオスはバカだから相手が 0 でも目の前にいたら闘ってしまって,相手を強くしてしまうでゲソ. だから,なるべくメスが闘うことにしようではなイカ

何言ってるか分からなイカもしれなイカら,実際に 1102 という 3 進数を侵略してみるでゲソ.

まずメスが闘うでゲソ.
=0> 1 1 0 2
上のルールに従って闘うでゲソ.
0 =1> 1 0 2
目の前の相手にダメージを与えたけど,相手が 1 なのでオスになったではなイカ
バカなオスが闘うでゲソ.
0 2 =0> 0 2
相手を強くしてしまったではなイカ.でも相手が 1 だったのでメスになったでゲソ.
背後に回った敵は後続の仲間が闘ってくれるでゲソ.いないときはメスが出てきてくれるでゲソ.
=0> 0 2 =0> 0 2
それぞれのイカが闘うでゲソ.
0 =0> 2 0 =0> 2
0 1 =0> 0 1 =0>
1 が背後に回ってしまったのでメスをつイカ
それぞれ闘うでゲソ.
=0> 0 1 =0> 0 1 =0>
0 =0> 1 0 =0> 1 =0>
0 0 =1> 0 0 =1> =0>
0 0 1 =1> 0 =1> =0>
せっかく全部 0 にしたのに,バカなオスが目の前の 0 を 1 にしてしまったではなイカ
1 が背後に回ってしまったのでメスをつイカして闘いを続けるでゲソ.
=0> 0 0 1 =1> 0 =1> =0>
0 =0> 0 1 1 =1> =1> =0>
0 0 =0> 1 1 =1> =1> =0>
0 0 0 =1> 1 =1> =1> =0>
0 0 0 2 =0> =1> =1> =0>
オスが相手を 2 にしてしまったでゲソ.メスをつイカして闘うでゲソ.
=0> 0 0 0 2 =0> =1> =1> =0>
0 =0> 0 0 2 =0> =1> =1> =0>
0 0 =0> 0 2 =0> =1> =1> =0>
0 0 0 =0> 2 =0> =1> =1> =0>
0 0 0 1 =0> =0> =1> =1> =0>
1 が背後に回ってしまったのでメスをつイカ
=0> 0 0 0 1 =0> =0> =1> =1> =0>
0 =0> 0 0 1 =0> =0> =1> =1> =0>
0 0 =0> 0 1 =0> =0> =1> =1> =0>
0 0 0 =0> 1 =0> =0> =1> =1> =0>
0 0 0 0 =1> =0> =0> =1> =1> =0>
これ以上メスをつイカしても 0 以外は増えなイカら,これで侵略成功でゲソ. 戦闘を終えてみたら我々は 1 0 0 1 1 0 と列んでいるでゲソ. これは 3 進数の 1102 の 2 進表記ではなイカイカなる 3 進数と闘っても同じことが言えるでゲソ!

どこが関数型なのかってのは,戦闘ルールの適用の仕方にあるでゲソ. それぞれのイカイカなる順序で目の前の敵と闘っても同じ結果になることが分からなイカ? たとえば,先頭のイカが相手がいなくなるまで先に闘っても, 後ろのイカが先に闘っても,上の例のように同時に闘っても, 結果は同じになるのでゲソ. 評価順序によらなイカら関数型ではなイカ (むりヤリ)! m 進数の国のイカが n 進数を侵略するときも同じようにルールを作れることが既に分かっているでゲソ.

余談だけど 3 進数の後ろに X というキャラが次から次へ追加されるような戦闘だと面白いことが分かるでゲソ. 相手が X の場合,メスでは太刀打ちできないが, オスなら何故か 2 に変更させることができて,自分はメスになるでゲソ. つまり,イカのルールがつイカされることになるのではなイカ

  1. =0> X なら,X =0>
  2. =1> X なら,2 =0>
このルールで闘うと,イカなる 3 進数でも 1 と 2 が 1 つずつ残って,オスが一匹だけいる形にたどり着くのではなイカ? この問題は,人間界では 3n+1 問題とかコラッツ予想とか角谷予想とかシラキュース予想とか言われているでゲソ. [twitter:@ksknac] の背景に潜んでいるジグソーパズルはそれを図示したものだとかいうではなイカ. たぶん小さすぎて分からないでゲソ.( 12/19 追記 : つイカしたルールに間違いがあったので修正したでゲソ )

*1:実はよくわかっていないので偽物のイカ娘かもしれないでゲソ.取りあえず,語尾にゲソとかイカとかつけて侵略という言葉をちりばめればそれっぽくなると解釈したでゲソ.