裏 RjpWiki

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

撤去作業の果てに現れる数列

2017年01月27日 | ブログラミング

撤去作業の果てに現れる数列
締め切りが 2017/01/27 10:00 AM なので,その 1 分後に投稿されるように予約

【概要】
0から始まる無限に続く整数の列がスタートです。
その列から「素数の ni 個前を撤去する」という操作を繰り返します。
操作の結果得られる列の、最初の10項をコンマ区切りで出力してください。

【詳細】
{ ni } を表す文字列が3 2 3のように標準入力からやってきます。空白区切りの 10進数 です。
この入力の場合は、下表のように列は変化します:

0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,...
↓ n1=3 なので、0,2,4,8,10,14,16,20,26,28,...などを撤去する。
1,3,5,6,7,9,11,12,13,15,17,18,19,21,22,23,24,25,27,29,...
↓ n2=2 なので、1,5,7,11,13,17,21,25,29,35,37,41,...などを撤去する。
3,6,9,12,15,18,19,22,23,24,27,30,31,32,33,36,39,42,43,46,...
↓ n3=3 なので、12,18,24,36,42,48,54,...などを撤去する。
3,6,9,15,19,22,23,27,30,31,32,33,39,43,46,47,49,52,53,57,...

結果、最初の 10項は
3,6,9,15,19,22,23,27,30,31
となるので、これを出力すればよいというわけです。

【例】
入力    出力
3 2 3   3,6,9,15,19,22,23,27,30,31
2 3    4,6,7,10,12,13,16,18,20,22

【補足】
 • 不正な入力に対処する必要はありません。
 • 入力に含まれる数は、1〜100 の整数です。
 • 入力に含まれる数字の数は、1〜20個 です。
 • 素数の判定は、ライブラリがあればそれを利用して構いません。

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

f = function(x) {
    mx = 1e+05 # 十分に広い範囲の素数表を作る(プログラムは十分に速いので大きくても心配ない)
    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 != 0] # 素数表
    a = 0:max(prime)      # 0 から素数表の最大素数までの整数列
    for (n in x) {        # 入力されるそれぞれの ni について
        b = a %in% prime  # 整数列中の素数がある位置
        s = which(b) - n  # 位置の n 個前
        s = s[s > 0]      # 位置を範囲内に限る
        a = a[-s]         # n 個前の数を除いた物を新たな整数列とし,次の n での処理に廻す
    }
    cat(a[1:10], sep=",")
}
x = c(3, 2, 3)
f(x) # 3,6,9,15,19,22,23,27,30,31
f(c(1,4,2,2,2,4,2,1,3,3,1,1,2,2,2,1,3,4,3,2)) # 0,1260,1327,1328,1329,1330,1331,1332,1333,1339
f(c(3,3,6,4,3,2,3,1,1,2,2,3,6,5,4,3,3,3,4,3)) # 1,1307,1313,1327,1328,1329,1330,1331,1332,1333
f(c(2,1,1,2,1,2,2,3,2,1,2,2,1,1,1,2,1,1,2,2)) # 2,1129,1130,1131,1134,1327,1328,1329,1330,1331
f(c(1,3,2,1,1,2,5,4,3,5,4,4,4,3,2,2,2,5,3,3)) # 3,61,1123,1328,1330,1916,2287,2470,2477,2480
f(c(1,4,2,1,1,3,2,1,3,4,1,1,3,1,4,2,2,2,4,2)) # 892,1262,1327,1332,1381,2447,2477,2478,2971,3023
f(c(5,2,2,1,3,4,2,4,4,1,5,2,5,2,2,5,5,3,4,1)) # 1669,2166,2557,2971,2973,3271,3739,3745,3787,3953
f(c(5,2,2,1,1,4,2,4,6,5,7,7,3,2,3,2,4,2,1,3)) # 513,1327,1329,1381,1382,1385,1631,1675,2171,3271
f(c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)) # 1129,1130,1327,1328,1329,1330,1331,1332,1333,1334
f(c(1,100,1,100,1,100,1,100,1,100,1,100,1,100,1,100,1,100,1,100)) # 169,200,204,209,214,354,356,701,702,763
f(c(100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100)) # 2,28,41,94,145,166,167,184,187,209
f(c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)) # 327,480,711,993,1263,1382,1735,2477,2499,3313
f(c(20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)) # 85,224,271,272,274,275,292,294,295,296

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

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

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