投稿

8月, 2011の投稿を表示しています

神スクリプトの使い方 Codeforces編

神スクリプトのソースとその解説サイトは以下の通り OnlineJudgeHelper PKUやCodeforcesなど5つのオンラインジャッジ対応の神スクリプト LinuxやMac OS Xで利用する場合は、まず最初に改行コードの変更を行う必要があります。 次に、pythonなどのパス設定などを適宜行いますが、Codeforcesで利用する場合は setting.json を作成する必要はありません。 実行例は以下のようになります。 % oj.py --codeforces -i PalindromicTimes.java 108 A ソースファイルは -i で指定します。問題番号については、いつの問題の何番目かを指定します。これらの英数字はURLから判断します。上記の例では、問題文のURLが http://www.codeforces.com/contest/108/problem/A となっているため、contestとproblemの後ろの英数字を引数として与えています。 もし、ソースコードがいい加減で間違えている(入力に"hogehoge"を追加して出力するだけなど)場合は % oj.py --codeforces -i PalindromicTimes.java 108 A compiling... Case #0: 13:31 | 12:21hogehoge Case #1: 00:00 | 23:59hogehoge WrongAnswer (max 0.299582958221s) となり、左に期待される出力、右に間違えた出力がそれぞれ表示されます。 正解だった場合は、 % oj.py --codeforces -i PalindromicTimes.java 108 A compiling... Case #0: 13:31 13:31 Case #1: 00:00 00:00 OK (max 0.301555156708s) となります。 テストを追加する場合は、全ての英数字を連結して引数に与えます。 % oj.py -a 108A Test case templ

丸め誤差対策

C/C++なら #define D2I(a) (int)((a)*(1+1e-15)) Rubyなら class Float def to_ii (self * (1+1.0e-6)).to_i end end puts (0.29*100).to_i puts (0.29*100).to_ii EPSが小さすぎて失敗したというつぶやきをいくつか見かけたが、相対的なEPSを与えることでそのようなミスを回避することができる。 とはいえ、求められる精度や値域を把握した上で、そっとEPSを足してあげる方が正しい姿勢な気がする。 (追記:2011/12/7) どんな時にエラーが発生するのか分からない場合は、以下のrubyコードのようにして実験してみるといいかも知れません。 (1..10).each do |i| (i+1..10).each do |j| a = 0.01*i b = 0.01*j c = i*j d = a*b*10000 puts "#{i} x #{j} = #{c} <-> #{d}" unless c==d end end

気象庁から最高気温を最低気温を取得する

ここ数日は本当に暑い。一体どのくらいの勢いで最高気温を更新してんだよってことで書いてみた。 #!/usr/bin/ruby -Ku # -*- coding: utf-8 -*- # 過去一ヶ月間の最高気温、最低気温を取得する require 'iconv' require 'rubygems' require 'mechanize' require 'hpricot' require 'open-uri' require 'pp' TargetCity = ""  # Ex. TargetCity = "東京" if TargetCity == ""   puts "データを取得したい都市 ( TargetCity ) を設定してください"   exit -1 else   puts TargetCity end a = Mechanize.new (1..30).each do |num|   a.get("http://www.data.jma.go.jp/obd/stats/data/mdrr/synopday/data#{num}.html") do |page|     (page/"tr").each do |tr|       city = (tr/"td.o0").map do |td| Iconv.conv('UTF-8','EUC-JP',td.inner_html) end.first       if city == TargetCity         list = (tr/"td.oR").map do |i| Iconv.conv('UTF-8','EUC-JP',i.inner_html) end         day  = (Time.now-(num-1)*24*3600).day         puts "day=#{day}  max=#{list[3]} min=#{list[4]}&

hpricot

http://tam.qmix.org/wiki/Hpricot.html

ペネトレーションテスト

http://www.backtrack-linux.org/