裏 RjpWiki

文字通り,RjpWiki の裏を行きます
R プログラム コンピュータ・サイエンス 統計学

放物線とマス目の関係

2017年03月15日 | ブログラミング

放物線とマス目の関係

締め切りが 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


ジャンル:
ウェブログ
コメント   この記事についてブログを書く
この記事をはてなブックマークに追加
« ホワイトデーのお返しの個数 | トップ | できる人のおちんぎんあっぷ »
最近の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

ブログラミング」カテゴリの最新記事