算法学习(六)

1.Rock Paper Scissors(剪刀 石头 布)

说明:在计算机科学中有一种特别重要的游戏,因为它本身很简单,可以用来创建非常狡猾的人工智能算法来对抗人类(或彼此),预测对手的行为。

这个古老的游戏是在两个参与者之间进行的,他们同时用他们的手势——石头,纸或者剪刀。如果两人都投了相同的手势,那一轮就被认为是平局。否则,下列规则适用:

Rock beats Scissors (by blunting them)
Scissors beat Paper (by cutting it)
Paper beats Rock (by covering it)

通常比赛是在楼梯上玩的。赢得回合的球员向前一步。先到达楼梯尽头的人是赢家。

你将会得到几个游戏的记录。你要告诉他们谁赢了。

Input data 将包含第一行中播放的匹配数量。然后匹配描述是用单独的行写的。

每一行都有几对字母,比如PR(第一次扔纸,第二次扔石头),或者是SS(都是剪刀),和空格分开。

Answer 每个匹配的答案应该指定第一个玩家是否获胜(值1)或秒(值2),没有平局。

例子:

input data:
3
SS PR
PR RS PS PP SP
PS RR PS RP

answer:
1 1 2

代码如下:

 1 condition = [['SS', 'RS', 'PP', 'PP', 'SP', 'PS', 'RP', 'PP', 'RR', 'PP', 'SR', 'PP', 'PS', 'PS'],
 2 ['SP', 'RP', 'SS', 'RP', 'PP', 'RS', 'RR', 'RP'],
 3 ['PS', 'PR', 'PP', 'RS', 'SS', 'SR', 'SR', 'SP', 'RP', 'RR', 'PP', 'PR', 'SR'],
 4 ['SR', 'SP', 'SS', 'SS', 'RR', 'RR', 'SR', 'SR', 'SS', 'RP'],
 5 ['SS', 'RR', 'PS', 'PR', 'RS', 'RP', 'PP', 'RP']]
 6 
 7 for i in range(len(condition)):
 8     win1 = 0
 9     win2 = 0
10     for n in range(len(condition[i])):
11         if condition[i][n][0] == condition[i][n][1]:
12             continue
13         elif condition[i][n][0] is 'S' and condition[i][n][1] is 'P':
14             win1 += 1
15         elif condition[i][n][0] is 'R' and condition[i][n][1] is 'S':
16             win1 += 1
17         elif condition[i][n][0] is 'P' and condition[i][n][1] is 'R':
18             win1 += 1
19         else:
20             win2 += 1
21     if win1 > win2:
22         print('1', end=' ')
23     else:
24         print('2', end=' ')
25 
26 输出:2 2 2 2 2 

  自己的解法不是最优解,可以直接定义 draw = ['SS', 'PP', 'RR]  win1 = ['SP', 'RS', 'PR'] win2 = ['PS, 'SR', RP'] 比较字符在哪个列表中。

 

2.Prime Numbers Generation(求素数)

说明:在这个任务中,我们要实现素数生成器。素数是正整数,除1和它本身之外没有其他因数。你可以在维基的文章中读到更多。最流行的算法是Sieve of EratostheneTrial division

因此,让我们以升序来创建质数数组(或列表),即

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, ...]

素数不被2, 3 , 5,7 整除。

然后输出与输入数据中给定的索引相对应的素数。

Input data 将包含在第一行中打印的素数。

下一行将包含用于打印值的素数数组的索引。它们的范围从1到20万不等。

Answer 应该包含与数组中指定位置相对应的素数。

注意,对于这个任务,我们开始从1而不是0开始索引一个数组(这可能帮助您检查您的程序,并有许多可以在网上找到的素数列表)。

input data:
4
7 1 199999 4

answer:
17 2 2750131 7

代码如下:

 1 nums = [182894, 136660, 173358, 132410, 199128, 151979, 102865, 180622, 150340, 163151]
 2 
 3 def eladuosai(n): # 厄拉多塞筛法
 4     l = list(range(1, n+1))
 5     l[0] = 0
 6     for i in range(2, n+1):
 7         if l[i-1] != 0:
 8             for j in range(i*2, n+1, i):
 9                 l[j-1] = 0
10     result = [x for x in l if x != 0]
11     return result
12 
13 s = eladuosai(3000000)
14 for n in nums:
15     print(s[n-1], end=' ')
16 
17 输出:2497423 1823051 2357119 1761883 2737129 2043817 1340153 2463763 2020181 2207039

  当素数索引位置数很大时,使用厄拉多塞筛法算法的效率更高。

 

posted @ 2017-08-17 19:29  ZT1994  阅读(337)  评论(0编辑  收藏  举报