- 更新日: 2014年12月18日
- Ruby
ゆるふわな競技プログラミングWEBサービス yukicoder に挑戦してみた
昨日読んだ以下のエントリーがとても興味深かった。例で出されていた電卓のクイズが面白くて、ついつい惹き込まれて読んじゃいました。
社会人10年目から始める競技プログラミングのすすめ – kuuso1のブログ
それで、このエントリーの最後のほうで競技プログラミングのWEBサービスがいくつか紹介されていたのですけど、その中で yukicoder というWEBサービスを見つけまして、このサービスが日本語だし面白そう。
yukicoderへようこそ!
yukicoderは競技プログラミング・アルゴリズムをゆるふわに練習する目的で運営されています。
topcoder 等は英語ですしガチすぎる印象で及び腰なのですけど、yukicoder は日本語だしとっつきやすそうだったのでちょっと挑戦してみた次第です。初めて挑戦してみた問題はこれ↓。★1つなので一番簡単なレベルの問題です。
解答コード
2通りの解答用コードを書いてみました。最初おもいっきり間違えちゃったのですけどねw
解答1(no_29_1.rb)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
h = Hash.new(0) n = gets.chomp.to_i n.times do gets.split.map(&:to_i).each do |i| h[i] += 1 end end count = 0 rest = 0 1.upto(10) do |j| count += h[j] / 2 rest += 1 if h[j] % 2 == 1 end count += rest/4 puts count |
#6688 No.29 パワーアップ – yukicoder
解答2(no_29_2.rb)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
n = gets.chomp.to_i items = [] n.times do gets.split.map(&:to_i).each do |i| items << i end end items.sort! flags = Array.new(n * 3){ false } count = 0 prev = items[0] 1.upto(n * 3) do |i| if prev == items[i] && !flags[i-1] && !flags[i] count += 1 flags[i-1] = true flags[i] = true end prev = items[i] end count += flags.select{|i| !i}.size/4 puts count |
#6690 No.29 パワーアップ – yukicoder
ローカルで試す場合
ページ最下部の「テストケース一括ダウンロード」から、テスト用のファイル一覧をダウンロードできます。以下のように配置しました。
1 2 3 4 5 6 7 8 9 |
$ tree -L 2 . ├── no_29_1.rb ├── no_29_2.rb └── testcase ├── test_in └── test_out |
testcase/test_in 以下が入力用ファイル、testcase/test_out 以下が出力(解答)のファイルです。
書いたコードは、ローカルで以下のように実行できます。
1 2 3 4 |
$ ls ./testcase/test_in | sort -n | ruby -n -e 'print "./testcase/test_in/#{$_}"' | xargs -n 1 ruby ./no_29_1.rb $ ls ./testcase/test_in | sort -n | ruby -n -e 'print "./testcase/test_in/#{$_}"' | xargs -n 1 ruby ./no_29_2.rb |
ファイル名の一覧を数値順でソートするのに苦労しました… find でできなかったので、結局 ls と sort -n を使った。あと、xargs は “-n 1” のオプションで引数を1つずつ処理できるのですね、初めて知った。
初級Linuxプログラミング xargsで1個ずつ処理
xargs でコマンドに引数をひとつずつ渡す方法 – ablog
以上のコマンドで、test_in 以下の入力用ファイルを1つずつ読み込んで、Rubyコード(./no_29_1.rb, ./no_29_2.rb)に、test_in 以下の入力用ファイルを1つずつ渡して、それぞれの出力を確認できます。出力を testcase/test_out 以下のファイルの解答と答え合わせすればOK。
アルゴリズム強くなりたいですし、yukicoder 面白いですので、時間がある時にぼちぼちトライしてみようと思います。
- Ruby の関連記事
- Gemの作り方(Ruby Gem)
- ローカル開発中のgemをGemfileに書いてインストール
- 熊本地震の余震が夜に多いのは本当か?Rubyプログラムで検証してみた
- El Capitanでgemのnative extensionビルド失敗に対応
- Rubyで親クラスから子クラスの定数を参照
- MacabをRubyで使う
- rbenv/ruby-buildでRuby最新バージョンをインストール
- Rubyでクラスインスタンス変数にインスタンスメソッドからアクセス
- 距離1kmあたりの緯度・経度の度数を計算(日本・北緯35度)
- Google Maps Geocoding APIで住所から緯度・経度を取得するRubyコード
Leave Your Message!