DevFest 2010 Japan参加基準クリア

なんとかクリアできた。詳細は以下の通り。

配点詳細

ウォーミングアップ : 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日が楽しみだな。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください