2015年06月19日

競技プログラミングを始めてみました。
プログラミングの能力を競うもののように聞こえますがプログラミングという範囲でパズルを解く様な感覚に近いです。パズルが好きなので結構楽しくやっています。
パズルが好きなら結構おすすめです。
レベルを上げてアイテムを集めてアイテムや魔法の使い方を考えてボスを倒していくようなゲームと似た楽しさもあります。

今まではRubyとC#がプログラミングのほとんどでしたがなんとなくC++でやっています。
理由は勉強の為とRubyだと簡単すぎる問題もあったりするからです。Rubyだと場合によっては簡単に答えが出せてしまうものもあるのである程度手ごたえがあった方が楽しいです。C++だと細かいことは何も考えなくていい現代的な言語と違って、使って行くとコンピュータがどう動いているかもイメージできるようになってくるような気がします。昔コンピュータの動く仕組みを勉強しましたが今更なるほどなぁとか思ってます。
あとビット演算で変数を振り回したり弱い型付けを利用して違う方のデータを計算したり他ではあまりできない(少なくとも自分が使った言語では)のでそういうので遊んだりうまく使えたりするのも楽しいですね。
よく使う例だと文字から数を引いたりbool以外の変数をif文の条件に使ったりできます。


//0が入力されるまでループ
int n;
scanf("%d", &n);
while(n){
//なんかの処理
scanf("%d", &n);
}


//改行が入力されるまでループ
char c;
scanf("%c", &c);
while(c - 10){
//なんかの処理
scanf("%c", &c);
}


//ファイルの終わりまでループ
int n;
while(scanf("%d", &n) + 1){
//なんかの処理
}

とかでしょうか。開発とかだとあまり良くない書き方とされそうですがまあこういう書き方のが楽しいのでこんな感じで書いています。
あとビット演算とかも面白いですね。最後のファイルの終わりまで読み込むループではビット反転の演算子を使って~scanf()としてもいいみたいです。


競技プログラミングを始めたところで面白い問題を見つけました。こちら
最初の問題じゃなくてちょっと進んだところ(16番)の本題です。
数学的に解ける問題らしい(読んでません)ですがちょうどいい機会(競技プログラミングの問題として扱えそう)だったのでプログラムで解いてみました。
適当な範囲で数列を作ってから条件を満たすNを順番に探していく方法で解けました。予想以上に答えが大きい数字で最初はエラーになりましたがそこそこ楽しかったです。


(00:36)

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔