鱼C论坛

 找回密码
 立即注册
查看: 4119|回复: 61

[技术交流] Python:每日一题 202

[复制链接]
发表于 2018-8-23 20:34:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬雪雪冬 于 2018-8-26 20:55 编辑

我们的玩法做了一下改变:

1. 楼主不再提供答案。
2. 请大家先独立思考,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。开始阶段是看不到其他人的回帖的,等答题完成,开始评分时再取消限制。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
随机生成一个由8位的数字组成的字符串,要求各位数字之和等于40。
例如:
54735781
01496488
27392296
......
======================================
本题主要是考察程序的执行效率,如果直接生成8个数字,再看是否之和为40,会做很多无用功。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-23 20:53:46 | 显示全部楼层
本帖最后由 凌九霄 于 2018-8-27 16:47 编辑
  1. import random

  2. while True:
  3.     nums = [ random.randint(0, 9) for i in range(8) ]
  4.     if sum(nums) == 40:
  5.         print(''.join(map(str, nums)), sum(nums))
  6.         break
复制代码

  1. import random

  2. while True:
  3.     nums = random.sample('0123456789' * 8, 8)
  4.     if sum(map(int, nums))== 40:
  5.         print(''.join(nums))
  6.         break
复制代码


稍改下,来个效率高的
  1. import random

  2. nums = [ random.randint(5, 9) for i in range(8) ]
  3. if sum(nums) >= 40:
  4.     x = sum(nums) - 40
  5.     while x:
  6.         i = random.randint(0, 7)
  7.         if nums[ i ] > 0:
  8.             nums[ i ] -= 1
  9.             x -= 1
  10.     print(''.join(map(str, nums)), sum(nums))
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-23 21:43:36 | 显示全部楼层
本帖最后由 塔利班 于 2018-8-23 21:44 编辑
  1. from random import *
  2. def fun202():
  3.     a=[0]*8
  4.     s=40
  5.     while s:
  6.         for i in range(8):
  7.             if s>9-a[i]:
  8.                 t=randint(0,9-a[i])
  9.             else:
  10.                 t=randint(0,s)
  11.             s-=t
  12.             a[i]+=t
  13.     return ''.join(map(str,a))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-23 22:56:08 | 显示全部楼层
  1. import random as r

  2. def fun202(length=8,total=40):
  3.     while True:
  4.         list1 = []
  5.         totals = 0
  6.         for i in range(length):
  7.             temp = r.randint(0,9)
  8.             totals += temp
  9.             list1.append(str(temp))
  10.         if totals == total:
  11.             return ''.join(list1)

  12. if __name__ == '__main__':
  13.     print(fun202())
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-23 23:04:21 | 显示全部楼层
本帖最后由 天圆突破 于 2018-8-24 14:59 编辑
  1. from random import randint
  2. from functools import reduce

  3. class Func201:
  4.     def __init__(self,n):
  5.         self.n = n
  6.         
  7.     def __iter__(self):
  8.         return self
  9.    
  10.     def __next__(self):
  11.         while True:
  12.             lst = [randint(0, 9) for i in range(self.n)]
  13.             if reduce(lambda x, y: x + y, lst) == 40 and int(''.join(map(lambda x: str(x), lst))) > 9999999:
  14.                 return int(''.join(map(lambda x: str(x), lst)))
  15.                
  16. if __name__ == '__main__':               
  17.     f = Func201(8)
  18.     while True:
  19.         print(next(f))
  20.         input(">>: press any key to continue")
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-24 01:04:19 | 显示全部楼层
import random

def test202():
    temp = [0,0,0,0,0,0,0,0]
    while sum(temp)/8 != 5:
        for j in range(8):
            temp[j]=random.randint(0,9)
    for m in range(8):
        temp[m]=str(temp[m])
    return ''.join(temp)   
   

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-24 09:31:34 | 显示全部楼层
本帖最后由 chongchuigu 于 2018-8-24 09:32 编辑
  1. import random
  2. n=random.randint(10000000,99993999)
  3. j=0
  4. for i in range(n,99994001):
  5.     s=i
  6.     while s:
  7.         j+=s%10
  8.         s=s//10
  9.     if j==40:
  10.         print(str(i))
  11.         break
  12.     j=0
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-24 09:57:30 | 显示全部楼层
  1. import random

  2. def output40():
  3.         a1 = random.randint(0,9)
  4.         a2 = random.randint(0,9)
  5.         a3 = random.randint(0,9)
  6.         a4 = random.randint(0,9)
  7.         a5 = random.randint(0,9)
  8.         a6 = random.randint(0,9)
  9.         a7 = random.randint(0,9)
  10.         a8 = random.randint(0,9)
  11.         while a1+a2+a3+a4+a5+a6+a7+a8 != 40:
  12.                 a1 = random.randint(0,9)
  13.                 a2 = random.randint(0,9)
  14.                 a3 = random.randint(0,9)
  15.                 a4 = random.randint(0,9)
  16.                 a5 = random.randint(0,9)
  17.                 a6 = random.randint(0,9)
  18.                 a7 = random.randint(0,9)
  19.                 a8 = random.randint(0,9)
  20.         z = str(a1)+str(a2)+str(a3)+str(a4)+str(a5)+str(a6)+str(a7)+str(a8)       
  21.         print(z)

  22. for i in range(10):
  23.         output40()

  24. #感觉自己的程序越来越粗糙了……
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-24 10:16:47 | 显示全部楼层
  1. import random
  2. running=True
  3. while running:
  4.     num=random.randint(10000000,99999999)
  5.     str_num=str(num)
  6.     list_num=[]
  7.     for each in str_num:
  8.         each=int(each)
  9.         list_num.append(each)
  10.     if sum(list_num)==40:
  11.         running=False
  12. print(num)
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-24 10:47:30 | 显示全部楼层
  1. import random

  2. while True:
  3.     result=''
  4.     num=0
  5.     for i in range(8):
  6.         i=random.randint(0,9)
  7.         num+=i
  8.         result+=str(i)
  9.    
  10.     if num==40:
  11.         print(result)
  12.    


  13.             
复制代码

点评

加上个break,否则程序无法结束。  发表于 2018-8-26 21:02

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-24 10:48:21 | 显示全部楼层
  1. import random,sys
  2. while 1:
  3.     a = random.randint(10000000, 99999999)
  4.     b = 0
  5.     for i in str(a):
  6.         b += int(i)
  7.     if b == 40:
  8.         print(a)
  9.         sys.exit()
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2018-8-24 10:49:38 | 显示全部楼层
本帖最后由 graceasyi 于 2018-8-24 11:30 编辑

此方法有局限。

  1. import random


  2. def fun202():
  3.     d8 = random.choices(range(0, 10), k=8)
  4.     while sum(d8) != 40:
  5.         d8 = random.choices(range(0, 10), k=8)

  6.     return ''.join([str(d) for d in d8])


  7. print(fun202())
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-24 11:08:04 | 显示全部楼层
本帖最后由 a641743376 于 2018-8-24 11:09 编辑

import random

while True:
    list1=['0','1','2','3','4','5','6','7','8','9']
    strings=''
    nums=0
    for i in range(8):
        strings+=random.choice(list1)
    for j in strings:
        nums+=int(j)
    if nums==40:
        print(strings)
        break

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-24 11:10:44 | 显示全部楼层
from random import *
def creat_num() :
    flag = True
    while flag:
        k = randint(10000000,99999999)
        a = list(str(k))
        b = [int(i) for i in a]
        if sum(b)== 40:
            print (k)
            flag = False
if __name__ == '__main__':
    creat_num()

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-24 11:46:54 | 显示全部楼层
  1. import random
  2. def getNumber():
  3.     list0 = []
  4.     for i in range(8):
  5.         num0 = random.randint(0,9)
  6.         list0.append(str(num0))
  7.     if eval("+".join(list0)) != 40:
  8.         getNumber()
  9.     else:
  10.         print("".join(list0))
  11. getNumber()
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-24 11:49:51 | 显示全部楼层
本帖最后由 拉了盏灯 于 2018-8-24 15:48 编辑
  1. def fun202():
  2.     l = []
  3.     for i in range(4):
  4.         num =random.randint(5,9)
  5.         l.append(num)
  6.     while len(l) < 8:
  7.         num = random.randint(0,9)
  8.         if sum(l)+num <= 40 and len(l) < 8:
  9.             if 40 - sum(l) > num and 40 - sum(l) < (7-len(l))*9+num:
  10.                 l.append(num)
  11.                 random.shuffle(l)
  12.         else:
  13.             l.append(40-sum(l))
  14.     return ''.join(map(str,l)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-24 12:58:36 | 显示全部楼层
本帖最后由 子沙 于 2018-8-24 13:01 编辑
  1. import random
  2. def fun_202(times):
  3.     i=1
  4.     a=[0]*8
  5.     while i<=times:
  6.         while True:
  7.             for j in range(0,7):
  8.                 a[j]=random.randrange(0,10)
  9.             if sum(a[:7])>30 and sum(a[:7])<=40:
  10.                 a[7]=40-sum(a[:7])
  11.                 string=''
  12.                 for k in range(8):
  13.                     string+=str(a[k])
  14.                 print(string)
  15.                 break
  16.         i+=1
  17. fun_202(10)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-24 12:59:20 | 显示全部楼层
本帖最后由 xyl20180824 于 2018-8-24 13:02 编辑

import random
def  result():
    res = ''
    numres = 0
    for num in range(9):
        i = int(10*random.random())
        numres += i
        num = str(i)
        res += num
    if(numres == 40):
        print(res)
    else:
        result()

if __name__ == '__main__':
    result()


danan.png

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-24 13:24:23 | 显示全部楼层
import random
while 1:
    x=0
    z=''
    for i in range(8):
        y=random.randint(0,9)
        z+=str(y)
        x+=y

    if x==40:
        print(int(z))
        break

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-24 14:28:34 | 显示全部楼层
本帖最后由 Wangzy1025 于 2018-8-24 14:34 编辑
  1. import random as r


  2. def fun202():
  3.     while True:
  4.         n = r.randint(10000000, 99999999)
  5.         if sum([int(x) for x in str(n)]) == 40:
  6.             return str(n)


  7. def fun202_2():
  8.     while True:
  9.         temp_list = []
  10.         for i in range(7):
  11.             if sum(temp_list) <= 40:
  12.                 temp_list.append(r.randint(0, 9))
  13.             else:
  14.                 temp_list = []
  15.                 break
  16.         if 30 < sum(temp_list) <= 40:
  17.             temp_list.append(40 - sum(temp_list))
  18.             return ''.join([str(x) for x in temp_list])
  19.         else:
  20.             continue


  21. print(fun202())
  22. print(fun202_2())
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 13:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表