【问题标题】:Puzzle in R with for loopsR中的难题与for循环
【发布时间】:2017-11-19 19:19:16
【问题描述】:

我有以下任务要解决:我从 1 到 100 连续有 100 扇门。我把10个人一个接一个地送进了一排门。门最初是打开的。 第一个人每 5 扇门打开一次;; 5、10、15、20...100 第二个人每 10 扇门打开一次; 10, 20, 30 40, 100 第三个人每 15 扇门打开一次; 15,30 45... 100 这种模式一直持续到最后一个人打开门 nr:50 和 100(第 50 扇门)。

每个人都通过后哪些门会关闭?它应该输出特定的门数,(例如,5,70,75,96,100)。

我已经用下面显示的代码解决了 Java 中的问题。我现在正试图在 R 中解决它,但是我遇到了 for 循环的问题,我没有得到正确的答案(我必须使用 for 循环语句)。任何人有一些建议如何解决它?

enter code here

int personer = 10;
        boolean[] doorOpen = new boolean [100];
        int startPosition;

for(int start = 5; start < 51; start +=5) {


            for(int i = start-1; i < doorOpen.length;  i = i + start) {

                if ( doorOpen [i] == false ) {
                    doorOpen[i] = true;
                    //System.out.println("endret d¯r nr: " + (i+1) + "  --------  " +" D¯r lukket : " + doorOpen[i] );

                } else {
                    doorOpen[i] = false;
                    //System.out.println("endret d¯r nr: " + (i+1) + "  --------  " +" D¯r lukket : " + doorOpen[i] );
                }
            }
            System.out.println();


        } 
for (int i = 0; i < doorOpen.length; i++) {

             if(doorOpen[i] == true) {
                 System.out.print((i+1) + "  ");
             }
         }  

    } // main slutt

我的 R 代码开头如下:

enter code here


door_game <- function(total_doors=100,passes=10) {
doors <- rep(FALSE,total_doors)

for ....


return (which(doors==true))

door_game()

【问题讨论】:

  • "但是我的 for 循环有问题" => 到底是什么问题?
  • 我不知道如何创建它。我只知道如果它用一扇门跳跃时如何创建它。在这种情况下,它是 5。我在 R 方面的经验有限。

标签: java r


【解决方案1】:

如果不限于 100 个门,您可以使用外部运算符来计算每个人会打开哪些门。 (想想乘法表)

no_limit <- seq(5,50,5) %o% 1:20
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
 [1,]    5   10   15   20   25   30   35   40   45    50    55    60    65    70    75    80    85    90    95   100
 [2,]   10   20   30   40   50   60   70   80   90   100   110   120   130   140   150   160   170   180   190   200
 [3,]   15   30   45   60   75   90  105  120  135   150   165   180   195   210   225   240   255   270   285   300
 [4,]   20   40   60   80  100  120  140  160  180   200   220   240   260   280   300   320   340   360   380   400
 [5,]   25   50   75  100  125  150  175  200  225   250   275   300   325   350   375   400   425   450   475   500
 [6,]   30   60   90  120  150  180  210  240  270   300   330   360   390   420   450   480   510   540   570   600
 [7,]   35   70  105  140  175  210  245  280  315   350   385   420   455   490   525   560   595   630   665   700
 [8,]   40   80  120  160  200  240  280  320  360   400   440   480   520   560   600   640   680   720   760   800
 [9,]   45   90  135  180  225  270  315  360  405   450   495   540   585   630   675   720   765   810   855   900
[10,]   50  100  150  200  250  300  350  400  450   500   550   600   650   700   750   800   850   900   950  1000

然后您可以使用

setdiff(1:100,no_limit[no_limit<=100])
 [1]  1  2  3  4  6  7  8  9 11 12 13 14 16 17 18 19 21 22 23 24 26 27 28 29 31 32 33 34 36 37 38 39 41 42 43 44 46 47 48 49 51 52 53 54 56 57 58 59 61
[50] 62 63 64 66 67 68 69 71 72 73 74 76 77 78 79 81 82 83 84 86 87 88 89 91 92 93 94 96 97 98 99

知道所有打开的门都是 5 的倍数,您还可以使用模函数 (%%):

c(1:100)[1:100%%5!=0]
 [1]  1  2  3  4  6  7  8  9 11 12 13 14 16 17 18 19 21 22 23 24 26 27 28 29 31 32 33 34 36 37 38 39 41 42 43 44 46 47 48 49 51 52 53 54 56 57 58 59 61
[50] 62 63 64 66 67 68 69 71 72 73 74 76 77 78 79 81 82 83 84 86 87 88 89 91 92 93 94 96 97 98 99

【讨论】:

  • @Meg 循环在 R 中不是最优的。最好的解决方案通常是向量化的。
【解决方案2】:

以下是使用循环的方法:

number_of_persons <- 10
total_doors <- 100
open_doors <- seq(5,number_of_persons*5,5)

opened_result <- NULL
for (i in open_doors){
  opened <- seq(i,total_doors,i)
  opened_result <- unique(c(opened_result,opened))
}

not_opened <- setdiff(1:total_doors,opened_result)

【讨论】:

  • 谢谢!如果我把它复制进去,我不会得到任何答案。缺少什么?
  • 数据在我们创建的对象中。如果您在控制台中输入 not_opened 并按 go,您应该会看到未打开的门。
  • @Meg 将您的预期回报添加到问题中。您提供了一个示例所需的结果,但它没有任何意义。 5 号门将首先打开。
  • 正确答案应该是:5, 20, 45, 55, 60, 65, 70, 75, 85, 90, 95, 100
  • @Meg,但是 2 号人打开了 10 号门,为什么它不在里面?
猜你喜欢
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
相关资源
最近更新 更多