【AtCoder:5回目】AtCoder Grand Contest 034の振り返り(Ruby)

【目次】

【本題】

振り返り

今回は 6/2(日)に開催されたAtCoder Grand Contest 034の振り返りを行います。

AtCoder Grand Contest 034 - AtCoder

今回は、一番簡単な問題も配点400点という事もあり、一問も解けませんでした・・・

それでもレートは上がるんですね・・・

A - Kenken Race

問題文 N 個の一列に並んだマス目があり、左から順に番号 1 , 2 , . . . , N がついています。長さ N の ., # からなる文字列 S が与えられ、 S の i 文字目が # のときマス目 i には岩が置かれており、 S の i 文字目が . のときマス目 i には何も置かれていません。

最初、マス目 A にすぬけ君、 B にふぬけ君がいます。

あなたは以下の操作を好きなだけ繰り返すことができます。

すぬけ君かふぬけ君を選び、 1 マス右か 2 マス右にジャンプさせる。このときジャンプ先にマスが存在しなければならず、またそのマスに岩が置かれていたりもう一人がいてはならない。 あなたはこの操作を繰り返し、マス目 C にすぬけ君が、 D にふぬけ君がいるようにしたいです。

このようなことが可能かどうかを判定してください。

途中まで書いたコードはこちらです

n,a,b,c,d = gets.split(" ").map &:to_i
s = gets.split("")

blocks = [n+1, n+2]

s.each.with_index(1) do |block, i|
  blocks << i if block == '#'
end

while !( a == c && b == d ) || !( blocks.include?(a+1) && blocks.include?(a+2) && blocks.include?(b+1) && blocks.include?(b+2) )
  if a != c
    if !blocks.include?(a+1) && !(a+1 == b)
      a += 1
    elsif !blocks.include?(a+2)
      a += 2
    end
  end

  if b != d
    if !blocks.include?(b+1)
      b += 1
    elsif !blocks.include?(b+2)
      b += 2
    end
  end
end

if a == c && b == d
  puts 'Yes'
else
  puts 'No'
end

ポイントは、下記の2点です。

・目的地までの途中で、岩が2個連続で続くと移動不可

・C > Dの時は、追い抜く為に3マスの空きが必要

これで作り変えたのが、下記のコードです

n, a, b, c, d = gets.chomp.split(' ').map(&:to_i)
s = gets.chomp
 
block_a = s[(a-1)..(c-1)]
block_b = s[(b-1)..(d-1)]
 
if c > d
  block = s[(b-2)..d]
  unless block.include?('...')
    puts 'No'
    exit
  end
end
 
if block_a.include?('##') || block_b.include?('##')
  puts 'No'
else
  puts 'Yes'
end