名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。アクセス解析のためGAを利用、Googleに情報を送信しています。商品紹介のためAmazonアフィリエイトを利用、Amazonに情報を送信しています。記事に関しては私が書いていない引用文を除いて自由にご利用ください。

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

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

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

ようこそ 天下一プログラマーコンテスト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書きましたが,結構短く書けて便利そうなので,今後も機会があれば活用しようかなあと思います.便利なライブラリがあるなら活用すべしでしょうね.