なんとかクリアできた。詳細は以下の通り。
配点詳細
ウォーミングアップ : 1.0 点
HTTP ステータスコード : 2.0 点
Google Code Discussion Group : 3.0 点
暗号通信 : 4.0 点
パッチワーク : 5.0 点
Issue Tracker : 0.0 点
Hackathon : 0.0 点
Android アプリケーション : 0.0 点
Chrome Extensions : 0.0 点
漢字変換サーバ : 7.0 点合計 : 22.0 点
twitterなど見てるとどうも20点前後がボーダーっぽい。クイズ系全部回答しておいてよかったー。結果も出たので自分の解答例も晒しておく。
まずは暗号通信。これは rot13みたいなやつね、と思い trで変換。JSONはあまり使ったことなくよくわからなかったのでライブラリを使用した。
#!/usr/bin/ruby
require 'net/http'
require 'json'
Net::HTTP.version_1_2
host=devquiz.appspot.com"
KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
EMAIL="xxxx@xxxxx.xxx"
CRYPT_EMAIL = EMAIL.tr('abcdefghijklmnopqrstuvwxyz', 'efghijklmnopqrstuvwxyzabcd')
json = {"key"=>KEY,
"pass"=>CRYPT_EMAIL}.to_json
req = Net::HTTP::Post.new("/personalpost", initheader = {'Content-Type' => 'text/plain'})
req.body = json
response = Net::HTTP.new(host, 80).start{|http| http.request(req)}
次はパッチワーク。これは単純に 1つずつ座標をずらして調べていけばいいだけ、と思いきや、2つ以上の枝に分岐する線が出た場合、単純にスキャン済みリストに加えてしまうと、最長の枝をカウントし損ねるパターンがありそうなことに気がついて、普通に600×600全点でスキャンすることにした。おかげで計算に約1時間かかった。
#!/usr/bin/ruby
map = []
checked = []
sx,sy = 0,0
# read map
body = File.read(ARGV[0])
body.each_line{|line|
map << line.chomp.split(//)
}
# initilized checked
checked = map.map{|x|
x.map{|y| 0}
}
def search_route(i, j, char, map, result, checked)
[[1,0],[0,1],[-1,0],[0,-1]].each{|s|
px = i + s[0]
py = j + s[1]
next if px < 0 or py < 0
next if px >= map[0].size or py >= map.size
next if checked[px][py] == 1 or result.include?([px, py])
if map[px][py] == char
result = result << [px,py]
search_route(px, py, char, map, result, checked)
end
}
return result
end
#
result = []
rr = []
max_len = 1
map.each_index{|i|
map[i].each_index{|j|
checked[i][j] = 1
char = map[i][j]
result[i * map.size + j] = [[i,j]]
rtmp = search_route(i, j, char, map, result[i * map.size + j], checked)
if rtmp.size > max_len
rr.clear
rr << rtmp
max_len = rtmp.size
elsif rtmp.size == max_len
rr << rtmp
end
}
}
# initilized result
result = map.map{|x|
x.map{|y| 0}
}
rr.each{|i|
i.each{|j|
result[j[0]][j[1]] = 1
}
}
# print result
fp = File.open("result.txt", "w")
result.each{|i|
fp.write(i.select{|x| x == 1}.size)
fp.write("\n")
}
fp.close
最後の漢字変換サーバ。すっきりしたロジックが思いつかず、完全にやっつけになってしまった。ただ難易度自体はパッチワークのほうが上だと思うんだよな。こちらのほうが配点が高いのは謎。
#!/usr/local/bin/ruby
require 'cgi'
cgi = CGI.new
num = cgi["n"]
def to_k(i ,numx)
c = numx[i]
a = ""
case i % 13
when 4
if numx[4,4] == ["0", "0", "0", "0"]
elsif
a << "Q"
end
when 8
if numx[8,4] == ["0", "0", "0", "0"]
elsif
a << "N"
end
when 12
a << "G"
end
case i % 4
when 1
a << "X"
when 2
a << "U"
when 3
a << "F"
end
case c
when "0"
if i % 4 == 0
else
a = ""
end
when "1"
if i % 4 == 0
a << "B"
end
when "2"
a << "E"
when "3"
a << "P"
when "4"
a << "L"
when "5"
a << "Z"
when "6"
a << "M"
when "7"
a << "K"
when "8"
a << "A"
when "9"
a << "R"
end
if numx.size == 1 and c == "0"
a << "J"
end
return a
end
numx = num.split(//).reverse
result = ""
numx.each_index{|i|
result << to_k(i, numx)
}
ans = result.reverse
print "Content-Type: text/plain\n"
print "\n"
print "#{ans}\n"
11日が楽しみだな。