負けず嫌い

負けず嫌いなので86世代のid:suztomoTopCoderをやっているのを見て自分もやりたくなりましたとさ。

http://d.hatena.ne.jp/suztomo/searchdiary?word=topcoder

http://d.hatena.ne.jp/y_yanbe/20080106/1199566667

登録の所にあったPurchasing Roleがいまいちよくわからない。適当に入れて登録した。



http://www.topcoder.com/tc?module=Static&d1=dev&d2=support&d3=devGettingStarted

これを読めばいいらしい。違う、それはcomponent competitionsで僕がやりたかったのはalgorithm competitions (held weekly)だ、たぶん。



http://www.topcoder.com/tc?module=Static&d1=calendar&d2=thisMonth

これが週1回あるイベントのスケジュールらしい。青いの。来週の水曜の夜9時からだなー。どれくらいの時間で終わるんだろう。1時間半って聞いた気がするから会社でやって終わってから帰れるな。って違う。「All times are Eastern Time unless stated otherwise」だって。登録の時にタイムゾーンを聞かれたから当然変換していると思ったのに。東部標準時で夜の9時ってことは…えっと…翌日の朝11時かな?

http://www.topcoder.com/tc?module=Static&d1=help&d2=getStarted#whatisarena

とかを読む。左のメニューに出ているLaunch Arenaを押すとJWSでプログラムが立ち上がる。とりあえずかっこいい画面が立ち上がった。ログインできた。

名前をダブルクリックするとアルゼンチンの学生でC++使いだ、とかわかる。Quoteに入れた内容が1行プロフィールとして表示される。Pythonistaとか書くか。


適当にSummaryとか押したら他人のソースコードがみれた。1000点問題のソースなのに200行ないな。そんな程度の問題なのか。とりあえずJavaでやるか、C++の勉強のためにC++でやるか。

ちなみにみなさんの想像に反して僕はC++をまったく知りません。#includeがSTLに関するものだと今覚えた。何で勉強するのがいいのかのう。



http://gulfweed.starlancer.org/d/index.php?itemid=10

これを見て必要なツールをインストールする。

        • -

ブラウザ再起動。
この前の大会の250点問題を読んでみる。
解いてみる。(Pythonで)

>>> def foo(A0, X, Y, M, n):
	buf = [A0]
	minDist = 10000
	for i in range(1, n):
		v = (buf[-1] * X + Y) % M
		minDist = min(minDist, min(x - v for x in buf))
		buf.append(v)
	return minDist

>>> foo(3, 7, 1, 101, 5)  # miss
-73
>>> def foo(A0, X, Y, M, n):
	buf = [A0]
	minDist = 10000
	for i in range(1, n):
		v = (buf[-1] * X + Y) % M
		minDist = min(minDist,
			      min(abs(x - v) for x in buf))
		buf.append(v)
	return minDist

>>> foo(3, 7, 1, 101, 5)
6
>>> foo(3, 9, 8, 32, 8)
0
>>> foo(67, 13, 17, 4003, 23)
14
>>> foo(1, 1221, 3553, 9889, 11)
275
>>> foo(1, 1, 1, 2, 10000)  # たぶんタイムアウトになる
0

ふむふむ。
C++でも試してみる。問題を開くとローカルに*.cppができている。開く。適当に書く。保存する。TopCoderのアプリでSave, Compile, Testとやって、テストケースの1番を選んでみる。おお、パスした。

#line 96 "MinDifference.cpp"
#include <string>
#include <vector>
class MinDifference {
	public:
	int closestElements(int A0, int X, int Y, int M, int n) {
	  return 6;
	}
};

submitしてみた。209点入った。ふむふむ。これで他の人にChallengeされなければいいのか。それってテストケースを入れるとそのテストケースだけに正解できる難読化したコードを生成するようなプログラムを用意しておいたらどうなるんだろう。Challenge失敗に罰はないのかな。ならとりあえずそういう変なことしているコードには適当にChallengeするかな…。

        • -

STL
http://www005.upp.so-net.ne.jp/episteme/html/stlprog/

        • -

他人の(特にRedCoderの)コードを読んで勉強しようと思ったのだけど、コピペできないのね。

http://www.umechando.com/software/
>「コピット!」はダイアログボックス上の説明文や、リストボックス内の選択行など普通の方法ではコピーできない文字列をコピーするための簡易ツールです。

むう、つかえない。

        • -
>nslookup topcoder.org
Non-authoritative answer:
Name:    topcoder.com
Address:  66.37.210.86

EatherealでキャプチャしてPythonに貼り付け。

>>> data = """
0160  7a 02 03 7a 23 69 6e 63  6c 75 64 65 20 3c 76 65   z..z#inc lude <ve
0170  63 74 6f 72 3e 0a 23 69  6e 63 6c 75 64 65 20 3c   ctor>.#i nclude <
0180  6c 69 73 74 3e 0a 23 69  6e 63 6c 75 64 65 20 3c   list>.#i nclude <
(中略)
"""
>>> data = data.strip()
>>> data = data.split("\n")
>>> data[0]
'0160  7a 02 03 7a 23 69 6e 63  6c 75 64 65 20 3c 76 65   z..z#inc lude <ve'
>>> data[0][6:-20]
'7a 02 03 7a 23 69 6e 63  6c 75 64 65 20 3c 76 65'
>>> [chr(int(x, 16)) for x in data[0][6:-20].split()]
['z', '\x02', '\x03', 'z', '#', 'i', 'n', 'c', 'l', 'u', 'd', 'e', ' ', '<', 'v', 'e']
>>> [[fo.write(chr(int(x, 16))) for x in line[6:-20].split()] for line in data]  # miss
(省略)
>>> fo.close()

で、保存したファイルを開いて前後のいらない文字を消す。できた。

でもこれ自動化したいねー。HTTPならまだわかるんだけどTCPでバイナリでクエリを送信しているので解析するのは面倒だなぁ。帰ってくるパケットの中で#includeって文字列があったら次のヌル文字までを切り出して保存するようなプログラムを作ればいいのかなー。

http://d.hatena.ne.jp/Voluntas/20071231/1199109958

これをエコーじゃなくてクライアントが送ったのをサーバに、サーバが送ったのをクライアントに投げるような感じにすればいいのかな〜?

今日はもうタイムアップ。遅刻をしかられて3日間僕もamachangも遅刻しなかったけど。徐々に来る時間と帰る時間が後ろにずれていって23時現在やっぱり二人が残っている。これは明日どちらかが遅刻するフラグではないか。