裏 RjpWiki

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

140問目!素数列から抜き出してつぶやこう?

2017年05月02日 | ブログラミング

140問目!素数列から抜き出してつぶやこう?

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

設問

今週のアルゴリズムも140問目!
「140」といえばTwitterにおけるつぶやきの文字数の上限です。

m 以上 n 以下の素数を一列に並べ、その中から連続した数字列を最長140文字で抜き出したとき、最初と最後の数字が同じで、含まれる数の和が最大になるものを求め、その和を出力してください。

例えば、m = 5, n = 30 のとき、

57111317192329

という数字列の中から、最初と最後の数字が同じで、長いものを抜き出すと、含まれる数の和は

 7111317       -> 21
  1113171      -> 15
     3171923   -> 26
         92329 -> 25
          232  -> 7

となりますので、最大なのは26です。

標準入力から m と n がスペース区切りで与えられるとき、和の最大値を求め、標準出力に出力してください。
なお、m と n は 1 < m < n < 100000を満たす整数とします。

【入出力サンプル】
標準入力
5 30

標準出力
26

−−−−−−−−−−

素直にプログラムし,なんの最適化もしなかったが,計算時間も制限内に収まっていた

f = function(m, n) {
    mx = n # エラトステネスの篩で素数列生成
    tbl = 1:mx
    tbl[1] = 0
    for (i in 2:floor(sqrt(mx))) {
        if (tbl[i]) {
            mx2 = mx %/% i
            tbl[2:mx2*i] = 0
        }
    }
    prime <- tbl[tbl >= m] # m 以上,n 以下の素数
    x = as.integer(unlist(strsplit(paste(prime, collapse=""), ""))) # 繋いでばらす
    maxSum = 0
    for (i in seq_along(x)) {
        y = x[i:min(i+139, length(x))] # i 番目から 140 個以内の数字列
        z = which(y == x[i]) # 最初と同じ数字のある場所
        s = sum(y[1:max(z)]) #  最初から最後の位置までの数字の和
        maxSum = max(s, maxSum) # 最大のものを記録
    }
    cat(maxSum)
}

# s = scan(file("stdin", "r"), quiet=TRUE)
# f(s[1], s[2])

f(5, 30) # 26
f(2, 100) # 204
f(100, 10000) # 930
f(10000, 50000) # 860
f(2, 99999) # 1019



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

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

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