0
0

ABC367 A~DをRubyで解く

Posted at

概要

Rubyの練習のために実装例を書いてみます

問題の解説を目的とした記事ではありません

A - Shout Everyday

時刻としてありうるのは高々24通りなので、起きている時間をすべて試して問題ないです

# 入力を受け取る
A, B, C = gets.split.map(&:to_i)

# 起きている時間についてループ
t = C
while t != B do
  # 時刻Aで起きていたらYesを出力して終了
  if t == A then
    print "Yes"
    exit
  end

  t = (t + 1) % 24
end

# Noを出力
print "No"

B - Cut .0

文字列として受け取り、最後の'0'を削除します
chopで末尾を削除した文字列を返してくれるみたいです

# 入力を受け取る (改行文字を削除しておく)
X = gets.chomp

ans = X
# 最後の文字が'0'である間、削除し続ける
while ans[-1] == '0' do
  ans = ans.chop
end

# 小数点が残っている場合は削除する
if ans[-1] == '.' then
  ans = ans.chop
end

# 答えを出力
print ans

C - Enumerate Sequences

forで降順ループが書けない(?)みたいなので、downtoというのを使うと良いっぽいです

# 入力を受け取る
N, K = gets.split.map(&:to_i)
*R = gets.split.map(&:to_i)

# 総和を保持しておく
s = N
# 整数列は最初すべて1としておく
p = Array::new(N, 1)

loop do
  # 総和がKの倍数なら整数列を表示する
  if s % K == 0 then
    for n in p do
      print n, " "
    end
    print "\n"
  end

  # 次の整数列を求める
  (N-1).downto(0).each do |i|
    if p[i] + 1 <= R[i] then
      s += 1
      p[i] += 1
      break
    else
      s += 1 - p[i]
      p[i] = 1
    end

    # 最後の整数列なので、終了
    if i == 0 then
      exit
    end
  end
end

D - Pedometer

1回目のforでは普通に、2回目のforでは差分を更新しながら足していきます

# 入力を受け取る
N, M = gets.split.map(&:to_i)
*A = gets.split.map(&:to_i)

# 答えを保持
ans = 0
# 累積和を保持
csum = Array::new(2 * N + 1, 0)
# cnt[i] = Mで割った余りがiである箇所はいくつあるか?
cnt = Array::new(M, 0)

for i in 0...N do
  # 累積和を更新
  csum[i + 1] = csum[i] + A[i]
  # 現在の和をMで割った余りを保持
  m = csum[i + 1] % M
  
  # Mで割った余りが等しい箇所の個数を答えに加算
  ans += cnt[m]

  # 今の箇所の分を足す
  cnt[m] += 1
end

for i in 0...N do
  # 一周前の和をMで割った余りを保持
  pm = csum[i + 1] % M

  # 累積和を更新
  csum[N + i + 1] = csum[N + i] + A[i]
  # 現在の和をMで割った余りを保持
  m = csum[N + i + 1] % M

  # 一周前の分を減らす
  cnt[pm] -= 1

  # Mで割った余りが等しい箇所の個数を答えに加算
  ans += cnt[m]
end

# 答えを出力
print ans
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0