• 算法学习(六)


    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

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

  • 相关阅读:
    PowerDesigner快捷键
    Android 的开源电话/通讯/IM聊天项目全集
    Android ContentProvider完整案例
    Android中观察者模式的升入理解
    Android中Socket大文件断点上传
    Storm概念学习系列之Tuple元组(数据载体)
    开始使用storm
    Storm概念学习系列之storm的功能和三大应用
    Storm概念学习系列之storm的特性
    Storm概念学习系列之storm核心组件
  • 原文地址:https://www.cnblogs.com/zt19994/p/7383972.html
Copyright © 2020-2023  润新知