放物線とマス目の関係
締め切りが 2017/03/15 10:00 AM なので,その 1 分後に投稿されるように予約
【概要】
放物線の方程式とマス目を指定するので、位置関係がどうなっているのかを計算してください。
【詳細】
放物線とマス目の位置関係は下表の5種類があります(以下、y 座標が大きい方向が上、x座標が大きい方向が右、になります):
記号 状況 例
U 完全に放物線より上にある
u マス目の内部は放物線より上にあるが、マス目と放物線に共有点がある。
S マス目を放物線が分断し、放物線より上にも下にも 0 より大きな面積がある
L 完全に放物線より下にある
l マス目の内部は放物線より下にあるが、マス目と放物線に共有点がある。
【入出力】
入力は
1 0 0 0 -3
のようになっています。
空白区切りになっていて、順に a, b, c, X, Y です。
a, b, c は、放物線
y=ax2+bx+c
の係数です。
X, Y はマス目の左下隅の座標です。マス目の大きさは、 1×1 です。
つまり、マス目の領域は
(x,y) = { |x,y| X≦x≦X+1, Y≦y≦Y+1 }
です。
出力は、
L
のような感じです。
U,u,S,L,lのいずれかを出力してください。
【例】
入力 出力
1 0 0 0 -3 L
1 0 -46 7 4 S
【補足】
不正な入力に対処する必要はありません。
a は、-100000 以上 100000 以下のゼロではない整数です。
b, c, X, Y は、-100000 以上 100000 以下の整数です。
分断される場合に出力されるSは、大文字です。ご注意ください。
==========================================================
f = function(par) {
g = function(x) (a*x+b)*x+c
par = as.integer(unlist(strsplit(par, " ")))
a = par[1]
b = par[2]
c = par[3]
x = par[4]
y = par[5]
x1 = x+1
y1 = y+1
top.bottom = c-b^2/4/a
center = -b/2/a
if (a > 0) {
if (x >= center) {
if (y > g(x1)) {
ans = "U"
} else if (y == g(x1)) {
ans = "u"
} else if (y1 == g(x)) {
ans = "l"
} else if (g(x) > y1) {
ans = "L"
} else {
ans = "S"
}
} else if (center >= x1) {
if (y > g(x)) {
ans = "U"
} else if (y == g(x)) {
ans = "u"
} else if (y1 == g(x1)) {
ans = "l"
} else if (g(x1) > y1) {
ans = "L"
} else {
ans = "S"
}
} else {
if (y > g(x) && y > g(x1)) {
ans = "U"
} else if (y == g(x) || y == g(x1)) {
ans = "u"
} else if (y1 == top.bottom) {
ans = "l"
} else if (top.bottom > y1) {
ans = "L"
} else {
ans = "S"
}
}
} else if (a < 0) {
if (x >= center) {
if (y > g(x)) {
ans = "U"
} else if (y == g(x)) {
ans = "u"
} else if (y1 == g(x1)) {
ans = "l"
} else if (g(x1) > y1) {
ans = "L"
} else {
ans = "S"
}
} else if (center >= x1) {
if (y > g(x1)) {
ans = "U"
} else if (y == g(x1)) {
ans = "u"
} else if (y1 == g(x)) {
ans = "l"
} else if (g(x) > y1) {
ans = "L"
} else {
ans = "S"
}
} else {
if (y > top.bottom) {
ans = "U"
} else if (y == top.bottom) {
ans = "u"
} else if (g(x) > y1 && g(x1) > y1) {
ans = "L"
} else if (y1 == g(x) || y1 == g(x1)) {
ans = "l"
} else {
ans = "S"
}
}
}
cat(ans)
}
f("-200 5160 -33275 12 6") # S
f("8 -8 2 0 -1") # l
f("110 -198 90 0 0") # S
f("40 -40 10 0 1") # S
f("10 -5 0 0 2") # S
f("10 -10 0 0 2") # U
f("-8 8 -2 0 1") # U
f("-3 7 4 -2 -6") # u
f("1 -10 25 3 4") # u
f("-200 5160 -33275 12 6") # S
f("4 -4 1 0 0") # S
f("10 -18 9 0 0") # S
f("-1 3 0 1 1") # l
※コメント投稿者のブログIDはブログ作成者のみに通知されます