堕(惰)プログラマ開発記録 このページをアンテナに追加 RSSフィード Twitter

2012-01-01 あけましておめでとうございますー

C81

タイトル通りです,はい.C81の1日目・2日目に行って来ました.

初の2日間参加です.FC(小説)のラノベアニメが日程別れたので.

よって,1日目は西1,2日目は東5を回りました.


適当に買ってきたもの晒しますよー


続きを読む

2011-12-25 遅いですが,日付偽造しておきます

高専プロコン2011 in 舞鶴

さて,遅くなりましたが,ご報告.どう見ても良い結果ではありませんですが.


高専プロコンについてはご存知*1かと思いますが,

競技部門では各高専がある物事を競争し,自由部門・課題部門ではそれぞれのチームの成果を

プレゼン及びデモで発表の後審査されます.


私はこのうち,競技部門に属しており,競技用のアルゴリズムを組んでいたのですが,

前日になっても成果が上がらず,当日までの徹夜である程度のアルゴリズムを動作させました.


アルゴリズムは他のメンバの人のものとマルチスレッドで動かし,

良いものを送信するプログラムにしたのですが,初日の一回戦目は4位であと一歩足らず負け,

次の敗者復活戦では周りが強くなりすぎて6位で敗退しました.


以下,適当にルールで流しておきます.


続きを読む

*1:知らなければhttp://www.procon.gr.jp/を参照

2011-12-18 今週は高専プロコンのために舞鶴まで行ってきます

JOI 2011/2012

自分で解けたと思われるコードおいておきます.ですから問4以降のコードはノーコメント.

間違ってたり,桁あふれて,Wrong Answerもらう確率大です.くれぐれも参考程度で.


というわけで,以下,問1〜3のコードです.

すべてC++で書かれています.


問題1

問1はパスタとジュースのセット(合計金額-50)の最安値を出す問題です。

1行目〜3行目:パスタの値段

4行目〜5行目:ジュースの値段

//問1
#include <iostream>

int main()
{
  int pasta=10000,juice=10000,tmp;
  for(int i=0;i<3;++i)
  {
    std::cin >> tmp;
    pasta = std::min(tmp,pasta);    
  }
  for(int i=0;i<2;++i)
  {
    std::cin >> tmp;
    juice = std::min(tmp,juice);    
  }
  std::cout << pasta+juice-50 << std::endl;

  return 0;
}

問題2

問2はサッカーのチーム数と総当たりの結果から勝ち点を比較し、チーム番号順に順位を出力します。

一行目:チーム数

二行目以降:A B C Dのスペース区切り(A,Bの点数はそれぞれC,D点)

ただし勝ち点は勝ち3点、引き分け1点、負け0点とする。

//問2
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

struct team_result{
  team_result(int n)
  {
    name = n;
    result = 0;
  }
  int name;
  int result;
  int number;
};

bool sort(const team_result& lv,const team_result& rv)
{
  return lv.result > rv.result;
}

int main()
{
  std::vector<team_result> match;
  int team;
  std::ifstream is("q.txt");
  is >> team;

  for(int i=1;i<=team;++i)
  {
    match.push_back(team_result(i));
  }

  std::vector<team_result> sorted(match);

  team = team * (team - 1) / 2;

  int A,B,C,D;
  for(int i=0;i<team;++i)
  {
    is >> A >> B >> C >> D;
    if(C == D)
    {
      ++match.at(A-1).result;
      ++match.at(B-1).result;
    }
    else if(C > D) match.at(A-1).result += 3;
    else if(D > C) match.at(B-1).result += 3;
  }

  std::sort(match.begin(),match.end(),sort);
  
  int now = 500;
  int now_num = 0;
  for(std::vector<team_result>::iterator it = match.begin();it != match.end();++it)
  {
    if(it->result == now) sorted.at(it->name-1).number = now_num;
    else
    {
      sorted.at(it->name-1).number = ++now_num;
      now = it->result;
    }
  }

  std::ofstream os("ans.txt");
  for(std::vector<team_result>::iterator it = sorted.begin();it != sorted.end();++it)
  {

    os << it->number << "\r\n" << std::flush;
  }
  os.close();

  return 0;
}

問題3

問3はピザの生地とトッピングの値段、ピザ生地のカロリーとそれぞれのトッピングの値段を渡されます。

値段に対してのカロリーが最大の結果を出力します。

1行目:トッピングの数

2行目:生地とトッピング値段がスペース区切り

3行目:生地のカロリー

4行目〜:トッピングの数数だけのカロリー列挙

//問3
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

bool sort(const int lv,const int rv)
{
  return lv>rv;
}

int main()
{
  int topi,A,B,C;
  std::vector<int> v;
  std::ifstream is("q.txt");
  is >> topi;
  is >> A >> B;
  is >> C;
  for(int tmp,i=0;i<topi;++i)
  {
    is >> tmp;
    v.push_back(tmp);
  }
  std::sort(v.begin(),v.end(),sort);

  int now_d=A,now_c=C;
  int now_r = now_c / now_d;
  int tmp_c,tmp_d,tmp_r;
  for(std::vector<int>::iterator it = v.begin();it != v.end();++it)
  {
    tmp_c = now_c+*it;
    tmp_d = now_d+B;
    tmp_r = tmp_c / tmp_d;
    if(tmp_r > now_r)
    {
      now_c = tmp_c;
      now_d = tmp_d;
      now_r = tmp_r;
    }
    else break;
  }

  std::cout << now_r << std::endl;
  return 0;
}

最後に

予選落ちましたねっ!

というかストリームcloseし忘れちゃった(てへぺろ

2011-12-07 今季はC3,ギルティ,Fate/Zeroですね!

駆け出しBoost.Spirit.Qi

Boost.SpiritBoost Advent Calendar 2011 - [PARTAKE]で取り上げられそうなので,ちょっと予習がてらBoost.Spirit.Qi,弄ってみました.

とりあえずHTTPレスポンスのパーサを.

#include <map>
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/std_pair.hpp>
#include <boost/foreach.hpp>

typedef std::map<std::string,std::string> header_type;

bool read(
  std::string const &response,
  std::string &http_version,
  int &status_code,
  std::string &status_message,
  header_type &response_header
  )
{
  namespace qi = boost::spirit::qi;
  std::string::const_iterator it = response.begin();
  auto header_rule = 
    "HTTP/" >> +(qi::char_ - " ") >> " " >> qi::int_ >> " " >> +(qi::char_ - "\r\n") >> ("\r\n") //一行目
    >> *(+(qi::char_ - ": ") >> ": " >> +(qi::char_ - "\r\n") >> "\r\n") //二行目をmapに
    >> *("\r\n") >> *qi::eol; //改行が残ってたら全部スルー
  
  bool r = qi::parse(it,response.end(),header_rule,http_version,status_code,status_message,response_header);
  if (it != response.end()) return false;

  return r;
}

int main()
{
  std::string http_version,status_message;
  int status_code;
  header_type header;

  const std::string response = "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8; charset=\"utf-8\"\r\nContent-Length: 256\r\n\r\n";
  read(response,http_version,status_code,status_message,header);
  
  std::pair<std::string,std::string> p;
  std::cout << "  HTTP Version: " << http_version << "\n";
  std::cout << "   Status Code: " << status_code << "\n";
  std::cout << "Status Message: " << status_message << "\n";

  std::cout << "\n<Response Header>\n";
  BOOST_FOREACH(p,header) std::cout << p.first << ": " << p.second << "\n";
  std::cout << std::flush;
  
  return 0;
}

こんな感じで実行すると,一応readからtrueが帰ってきて各情報は出力されます.

autoになってますが,header_ruleにパース設定が入ってるようです.const std::string responseと比べてもこのまんまで,とても解りやすいのではないかと思いました.

コンパイル時に私のPCでは20秒ほどかかるのが難点ですが….

2011-10-03 フィアが可愛すぎて萌え死にそう

U-20プログラミング・コンテストの結果報告

今頃ですが、U-20プログラミングコンテストの結果を報告します。

もう一週間たってしまってますが。


結果から言うと、経済産業省商務情報政策局長賞でした。

つまり経済産業大臣賞に届かなかったわけですね。


当日、UDXの下で「電撃 秋の祭典」を行なってまして、正直そっちにも行きたかったです。

最初のイベントが始まることから最後のイベントが終わるまでずっとUDXに籠りっぱなしで…


まあ、プレゼンはそれなりに審査委員の人に受けたようでよかったですがね。

質問タイムで、特に困るような質問はなく、答えられたのではないかと思います。

最後の質問では「公表する前に特許をとっておいたほうがいい」なんて言われまして、

Window Changerってそこまでのものだろうかとビックリしましたが。


ビックリしたものといえば、過去にこのブログにコメントしてくれた、

hahaue2009さんの息子さんのソフトウェア「XTBook」。

なんとレンタリングエンジンまで自分で作っちゃったそうですから、私達とのレベルの違いがよくわかります。

というか、文句なしの経済産業大臣賞です。

しかも、史上初の2年連続…。普通に凄いです。


さて、そんなこんなで、何人かの人と名刺やら連絡先やら交換してきましたので、

いつでも連絡を取れそうです。


最後に、U-20プログラミングコンテスト関係者の皆さん、お疲れ様でしたっ!