【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