読者です 読者をやめる 読者になる 読者になる

水面下の夢

競プロやイラストに興味があります.メインブログがここ.ソシャゲの話はこっち(http://ameblo.jp/0n0-yumechi/).ブログアイコンはYaQ(@8_9_00)さんから.

今日の競プロ(2015/05/01)

AtCoder Python Ruby 競技プログラミング

更新が間に合っていない.(昨日は寝ていました)

それと最近ついに時間がなくなってきて,問題を解いて勉強するのも難しくなってきました.困ったもんだ.

ようこそ 天下一プログラマーコンテスト2012 A問題

問題

A: 与えられた数より小さい素数の個数について - 天下一プログラマーコンテスト2012 予選C | AtCoder

回答

Submission #395525 - 天下一プログラマーコンテスト2012 予選C | AtCoder

Submission #395533 - 天下一プログラマーコンテスト2012 予選C | AtCoder

素数を数えるだけ.
nが10000以下なので,適当にループさせてもなんとかなる.

あと,rubyだと素数を取り扱えるライブラリがあるようなので,活用して解いてみました.

参考:

qiita.com

require 'prime'
puts Prime.each(gets.to_i - 1).to_a.length

Prime.each(N)で0~Nの範囲で(N-1ではなく,Nです)素数を持ってくる.
to_aで配列に変換し,lengthで長さを得る…
こうですね.

rubyは殆ど書いたことがないのですが,感覚的にはpythonとそう変わらないかも.結構書きやすい感じがする.

K2PC(Easy) A問題

問題

A: ハンバーガー(Hamburger) - Kyuride Kagamiz Programming Contest (Easy) | AtCoder

回答

(ダメな方)
Submission #395520 - Kyuride Kagamiz Programming Contest (Easy) | AtCoder

(修正版)
Submission #395520 - Kyuride Kagamiz Programming Contest (Easy) | AtCoder

これはひどいので,ソースコード張りながらおはなし.
ハンバーガーの具材で足りないものを求めましょうという問題なのですが…

悪い例です.

a, b, c = map(int, input().split())
N = int(input())
oriA, oriB, oriC = a, b, c
for _ in range(N):
    if a < N:
        a += 1
    if b < N * 2:
        b += 2
        if b > N * 2:
            b -= b % 2
    if c < N * 3:
        c += 3
        if c > N * 3:
            c -= c % 3
print(a - oriA, b - oriB, c - oriC)
  • 問題1:ループの使用

いらないような気がしたんですよね,でも怖いしな~
※ループ使っているとそれだけ処理時間が長くなりがちですし,ループ回数が多いと落ちちゃうゾ… 今回は最大でも1000程度だからなんとかなるけど.

  • 問題2:似たような処理の重複

簡単に出来るよなあ…
※変数が増えるたびに同じようなことやってたらキリがないゾ…

というわけで,修正したのがこちら.

a, b, c = map(int, input().split())
N = int(input())
calc = lambda mult, x: N * mult - x if N * mult > x else 0
print(calc(1, a), calc(2, b), calc(3, c))

普通に計算式立てたら,N * mult - x で最終的な値が出ることに気が付いたので,これをラムダ式に.そして計算するだけ….(multっていうのは,ハンバーガ一つにかかる具材の必要数ですよ,うん.ハンバーガ一つにつき肉が1,パンが2,具材が3だったかな)

計算式に落とせるならもちろん計算式にしたほうがいいですね(反省)


さて,今回は初めてruby書きましたが,結構短く書けて便利そうなので,今後も機会があれば活用しようかなあと思います.便利なライブラリがあるなら活用すべしでしょうね.