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

torus711 のアレ

主に競技プログラミングの問題について書きます

Codeforces #231, A : Counting Sticks

概要

  • [ A ] + [ B ] = [ C ]

という形式で数式が与えられる。A, B, C はそこに含まれるバーティカルバー( '|' )の本数に対応する値を表す。
 A, B, C 間で棒を動かす操作が一回まで許される。等式を成立させることができるならば、そのような数式を(入力と同じ形式で)一つ表示せよ。不可能な場合は "Impossible" を印字せよ。

解法

 最初から等しくなっている場合を除くと、右辺と左辺の差が 2 であるときに限り、適当に動かせば両辺を等しくすることができます。左辺から右辺に動かすとき、A, B のいずれかが 0 にならないようにする必要があります。

コード

a, b, c = gets.strip.split( /[+=]/ ).map( &:length )

if a + b + 2 == c then
	a = a + 1
	c = c - 1
elsif a + b == c + 2 then
	if 2 <= a then
		a = a - 1
	else
		b = b - 1
	end
	c = c + 1
elsif a + b != c
	a = -1
end

if a == -1 then
	print "Impossible"
else
	print "|" * a + "+" + "|" * b + "=" + "|" * c
end