Bonus問題。といっても簡単なわけではない。本編との違いは問題が選べるところかな。
言われたとおりにファイルを処理すればいい。
Where theres a difference, in one, move after and XOR.
暗号化はきっと、適当に選んだ数バイトとメッセージをXOR演算し、 さらに各位置の一つ前の1バイトを結果で置き換えたのだろう。
関数MT(seed)について、下の作業を一サイクルとする。
このサイクルを13回繰り返し、それぞれの数のmod 6をとった数列が与えられたとき、一番初めのseedを 求めよ。
function MT(seed)
{
s1 = seed
s1 ^= (s1 >> 11)
s1 ^= (s1 << 7 ) & 0x9d2c5680U
s1 ^= (s1 << 15) & 0xefc60000U
s1 ^= (s1 >> 18)
return s1
}
seedは大きな数字になるので、unsigned long intを使う。
また、与えられた数列になるseedは複数ある。1つ目でダメなら2つ目、3つ目を試す。
RubyはBignumに対応している。しかも、基数を指定した文字列→整数変換もできる。 あとは結果を眺めるだけ。
1 11 21 1211 111221 ...
44番目の数列の数をすべて足した値を求めよ。 各数列は、前の数列で、ある数字が何個連続しているかを表している。 たとえば、1211は1個の1、1個の2、2個の1なので111221となる。
少し考えると分かるように、1からはじめると、3より大きい数(4,5,6,..)は出てこないので、 左から順に数字が1個の場合、2個の場合、3個の場合に場合分けして考えたらいい。
MD5.dllを使うと楽。
文字列の生成は、forループを重ねてもよいし、再帰関数でつくってもいい。 文字数もそれほど多くはないし。
ある場所にはいくつかの木があって、それぞれの木には二羽以上の鳥がいるのだという。 しかも、それぞれの木の鳥の数はみんな同じと言うけったいな状況。さらに、そこにい る鳥の総数を聞けば、木が何本生えているか分かるらしい。鳥の数は200から300の間。 さあ、鳥の総数は何羽?
[鳥の総数] = [木の本数] * [それぞれの木にいる鳥の数]
ふつうなら、鳥の総数が分かっても、それぞれの木にいる鳥の数が分からなければ、木の本数は分からないはず。それが分かるということは?木の本数が一通りに決まることに注意!
熱いお湯の蛇口だけ出すと、4分でお風呂がいっぱいになる。冷たい蛇口だけ出すと5分かかる。 また、いっぱいの状態で栓を抜くと、10分で空になる。
では、栓を抜いた状態で、両方の蛇口から水を出すと、いっぱいになるのに何分何秒かかるだろう?
1分あたり、どれだけ水が溜まるのかを考える。
問題は難しくないのだけれど、答え方で戸惑うかも。
まずは、元の円の半径を1、円錐の半径をrとして体積を求める式を書くと楽。 あとは、最大値をとるrを計算して、角度に直すだけ。rは数値計算でないと出ない。
ちなみに、答えは小数点以上を含めて4桁に丸める。(e.g. 123.45 => 123.5)
Your answer should be rounded to four significant figures
2から10までの数字の書かれた9枚のカードが3行3列に並べてある。
ABC DEF GHI
それぞれのカードの場所について、以下のことが分かっている。
同じ数はないはずだから、2から10の順列をつくって確認すればいい。