裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

放物線とマス目の関係

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


コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

HTMLをスクレイプしてCSVに変換

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

HTMLをスクレイプしてCSVに変換

締め切りが 2017/03/15 10:00 AM なので,その 1 分後に投稿されるように予約

設問

Webページに含まれるテーブルの中身をスクレイプして、Excelなどで集計がしやすいようCSVファイルに変換する。
定期的に行う必要があるため、手作業で行うのではなく自動化したい。

求められるプログラムの仕様は、以下の通り。


    標準入力から、HTML準拠(Wikipedia参照)のテキストデータが送られる
    入力されるHTMLはフォーマットが正しい、具体的にはW3Cの構文検証サイトでエラーがないことを前提とする
    また、HTMLはUTF-8でエンコーディングされ、多バイト文字は含まれないものとする
    HTMLには、tableタグが1つだけ含まれる(テーブルは単体である)
    テーブル内のセルはtr, th, tdタグで構成され、セルが連結されることはない
    HTML内のテーブルを表形式として抽出し、CSVフォーマット(Wikipedia参照)で標準出力に返すこと
    出力するCSVはコンマ「,」(U+002C) 区切りで、すべてのフィールドをダブルクォート「"」(U+0022)で囲むこと
    CSVのフィールドとして出力される文字列は、thまたはtdタグ内のテキストに限定すること
    thおよびtdタグの扱いは、CSV出力時において変える必要はない
    thおよびtdタグ内に、さらにタグが含まれる場合、タグ自体は除去し配下のテキストだけを抽出すること
    文字列フィールドは文字実体参照(Wikipedia参照)を用いてアンエスケープ処理をすること
    ただし、(大なり記号)、&(アンパサンド)のみの対応でよいものとする

【問題】
標準入力から、HTMLフォーマットのテキストが送られます。
このHTMLからtableタグで囲まれた領域をスクレイプし、CSVに変換した上で、その結果を標準出力に返してください。
なお、アンエスケープ処理も忘れずに。

=================================================

f = function(s) {
    ncol = sum(grepl("", s))
    s = gsub("", "", s)
    s = gsub("title", "", s)
    s = gsub("&", "&", s)
    s = gsub("<", "    s = gsub(">", ">", s)
    s = (s[s != ""])[-1] # テストシステムでは先頭に 1 個の NULL が付いてしまっている
    apply(matrix(s, byrow=TRUE, ncol=ncol), 1, function(x) cat('"', paste(x, collapse='","'), '"\n', sep=""))
}
cat(f(readLines(file("stdin", "r"))))

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村