Puzzle:[OpenSource Institute 攻略 Geek Challenge編]

OpenSource Institute の攻略。

Challenge.1 Face Value

いくつかの解釈が考えられる良問だろう。

The solution to this level is 599+(123*6)

単純に計算すれば1337。これはleet(ハッカー語 by Wikipedia)を意味するのだろうか? その前に試していないことはないか?

Challenge.2 The Power of the Program

手計算でもできないことはないかな。

x * y = 133745639

上の式を満たす[x,y]: x,y > 1を見つけ、x+yの値を入力する。

Challenge.3 The Growing Crystal

フラクタルで有名なコッホ曲線を使った問題。

はじめ、1辺の長さが1の正三角形がある。1分後に各辺を三分割した真ん中の辺を1辺とした正三角形が、それぞれの辺にくっつく。これを続けていくと、氷の結晶のような図形ができあがる。

1時間33分後に図形の周囲の長さがいくつになっているかを答える。

簡単のために1辺だけについて考える。まず、辺の数は1分後に4本に増え、2分後には4本からそれぞれ4本ずつに増える。同様にして、i分後には4のi乗本になる。次に、辺の長さは1分後に1/3になり、2分後、3分後はさらに1/3になるので、i分後には1/3のi乗になる。

あとは計算するだけ。四捨五入して整数で答えることに注意。

Challenge.4 Low level stuff

計算するん?

求められている方法をとるなら、ファイルの各バイトごとに+,xor,and演算をするような プログラムを組めばいい。A XOR Aの結果を考えた方が早いけれど。

出た数字の後に_solutionをくっつけて答える。

Challenge.5 Xor Encryption

XOR演算で置き換えられたJPEGファイルを修復する問題。

一般的なJPEGヘッダーのはじめ9バイトは下のようになっている。

FF D8 FF E0 00 10 4A 46 49 46 : .リ....JFIF

XOR演算にはA xor B = C ならC xor A = B、C xor B = Aという関係があるから、 与えられたファイルの先頭とXORの値を計算すると、置換に使われた数列が得られる。

最後に、数字のペアを交換する。

 0 <-> 23
78 <-> 66
36 <-> 144

これらを行うプログラムを組めばいい。

Challenge.6 Sandorf Cypher

ジュール・ヴェルヌの小説「アドリア海の復讐」(原題: Mathias Sandorf)で使われた暗号で、回転グリル暗号というらしい。グリル暗号では、鍵になる穴の開いた紙を暗号文の上に置き、穴の位置の文字を読み取って解読する。回転グリル暗号では、さらに鍵を90度ずつ回転させながら文字を読み取る。つまり、36文字ずつの転置式暗号になっている。

この問題では36文字になるように足りない文字数を#で補い、さらに文章を逆転させる。

Sandorf Cypher
-> ###########Example of Sandorf Cypher
-> rehpyC frodnaS fo elpmaxE###########

はじめの穴の位置を左上から右下に書き下すと下のようになる。 これを90度ずつ回転させたものを用意して、順に読んでいけばいい。

0 :  xoxoxoxxxxoxxxoxxxxoxxoxxxxxxoxxxoxx
90:  xxxxxxxxoxxoxxxoxxoxxxxoxxoxoxxoxxxo
180: xxoxxxoxxxxxxoxxoxxxxoxxxoxxxxoxoxox
270: oxxxoxxoxoxxoxxxxoxxoxxxoxxoxxxxxxxx

全体の文字列は、逆転していることに注意する。

文章を注意深く読む。大量の英語に眠くなってもひたすら読む。 Geek Challengeに関係のあるような文に答えが隠されている。

Challenge.7 The Skyline

各長方形の左端、高さと右端の三つ組が与えられたときに、図形の輪郭を知りたい。

輪郭は、上下の変化の位置と変化した後の高さのペアであらわす。 例として出されている"1,11,3,13..."は、位置1で高さ11まで上がり、位置3で高さ13まで上がる...という意味。

幅の最小値は1なので、1つごとに変化する場合を知るために、幅を2倍にしてしまうと考えやすい。

うまく輪郭が得られたら、次はそれを数値に変換しなければならない。

  1. checksum の初期値は4294967295U
  2. checksum を1つ右シフト
  3. 輪郭の位置xと高さhのペアを取ってくる
  4. x*hをchecksumの上位16bitとXORをとる
  5. 結果を新しいchecksumとして(2)に戻る

輪郭を得るときは、原則、最も高いところを輪郭と見なせばいい。 下がる部分は、その次と比較して変化があるかを見ればいい。 ただ、幅の最小値は1なので、1つごとに変化した場合に見逃してしまう。そのために、幅を2倍にして考えると考えやすい。

戻る

2007-07-21 公開 2007-09-06 更新 Copyright(C) 2007 tar0t All rights reserved.