鱼C论坛

 找回密码
 立即注册
楼主: zltzlt

[已解决]Python:每日一题 323

[复制链接]
发表于 2020-2-4 19:57:35 | 显示全部楼层
William4869 发表于 2020-2-4 19:56
def f323(s):
    lenth=len(s)//2+1
    for i in range(1,lenth):

多了几个print.....
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-4 19:58:26 | 显示全部楼层
def f323(s):
    lenth=len(s)//2+1
    for i in range(1,lenth):
        s0=s[:i]
        for j in range(1,lenth):
            s1=s[i:i+j]
            news=s[i+j:]
            sum=0
            while len(news)>=len(str(int(s0)+int(s1)))and news[:len(str(int(s0)+int(s1)))]==str(int(s0)+int(s1)):
                news=news[len(str(int(s0)+int(s1))):]
                s0,s1=s1,str(int(s0)+int(s1))
                sum+=1
            if len(news)==0 and sum>0:
                return True
    return False
print(f323("000"))
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-4 20:04:40 | 显示全部楼层
本帖最后由 William4869 于 2020-2-5 18:18 编辑
  1. def f323(s):
  2.     lenth=len(s)//2+1
  3.     for i in range(1,lenth):
  4.         for j in range(1,len(s)//3*2-lenth+10):
  5.             s0=s[:i]
  6.             s1=s[i:i+j]
  7.             news=s[i+j:]
  8.             sum=0
  9.             while len(news)>=len(str(int(s0)+int(s1)))and news[:len(str(int(s0)+int(s1)))]==str(int(s0)+int(s1)):
  10.                 if (len(s0)>1 and s0[0]=='0')or (len(s1)>1 and s1[0]=='0'):
  11.                     break
  12.                 news=news[len(str(int(s0)+int(s1))):]
  13.                 s0,s1=s1,str(int(s0)+int(s1))
  14.                 sum+=1
  15.             if len(news)==0 and sum>0:
  16.                 return True
  17.     return False
  18. print(f323("111122335588"))
复制代码



评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
zltzlt + 1 + 1

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-4 20:32:07 | 显示全部楼层
本帖最后由 阴阳神万物主 于 2020-2-4 20:33 编辑

101应该也算对吧?
0 不就是以 0 开头的吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-4 21:00:23 | 显示全部楼层
本帖最后由 阴阳神万物主 于 2020-2-4 21:07 编辑

从格式上与他人做区别。
  1. def solve(s:'str of int')->bool:
  2.     def num(a,b):
  3.         while True:
  4.             yield a+b
  5.             a,b = b,a+b
  6.     le = len(s)
  7.     for l in range(1,(le//2)+1):
  8.         for r in range(1,le-l):
  9.             if r>1 and s[l] == '0':
  10.                 break
  11.             n = iter(num(int(s[:l]),int(s[l:l+r])))
  12.             get = s[:l+r]
  13.             t = 2
  14.             while len(get)<=le:
  15.                 if get == s and t>=3:
  16.                     return True
  17.                 get += str(next(n))
  18.                 t += 1
  19.     return False
  20. if __name__ == '__main__':
  21.     print('示例1 输出:',solve('112358'))
  22.     print('示例2 输出:',solve('199100199'))
  23.     print('别人错的 11#',solve('1023'))
复制代码
没有更改,减少一下行数。
  1. def solve(s:'str of int')->bool:
  2.     def num(a,b):
  3.         while True:
  4.             yield a+b
  5.             a,b = b,a+b
  6.     le = len(s)
  7.     for l in range(1,(le//2)+1):
  8.         for r in range(1,le-l):
  9.             if r>1 and s[l] == '0':break
  10.             n, get, t = iter(num(int(s[:l]),int(s[l:l+r]))), s[:l+r], 2
  11.             while len(get)<=le:
  12.                 if get == s and t>=3:return True
  13.                 get += str(next(n))
  14.                 t += 1
  15.     return False
  16. if __name__ == '__main__':
  17.     print('示例1 输出:',solve('112358'))
  18.     print('示例2 输出:',solve('199100199'))
  19.     print('别人错的 11#',solve('1023'))
复制代码



评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-4 22:03:58 | 显示全部楼层
前几次的出题学到itertools.combinations
感觉这就可以用上,但我绞尽脑汁都想不出来...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-4 22:23:57 | 显示全部楼层    本楼为最佳答案   
本帖最后由 TJBEST 于 2020-2-4 22:26 编辑

可能有点繁琐,但是结果应该没错
  1. def fun323(string):
  2.     M = len(string)
  3.     if M < 3:
  4.         return False
  5.     else:
  6.         for u0 in range(1,(M//3)+1):
  7.             for u1 in range(u0,((M - u0)//2)+1):
  8.                 num1 = string[0:u0]
  9.                 num2 = string[u0:(u0+u1)]
  10.                 if (len(num1) > 1 and num1[0]=='0') or (len(num2) > 1 and num2[0]=='0'):
  11.                     pass
  12.                 else:
  13.                     num1 = int(string[0:u0])
  14.                     num2 = int(string[u0:(u0+u1)])
  15.                     index = u0 + u1
  16.                     while index < M:
  17.                         temp = num1 + num2
  18.                         bits = len(str(temp))
  19.                         new = index + bits
  20.                         if new < M:
  21.                             if str(temp) == string[index:new]:
  22.                                 num1 = num2
  23.                                 num2 = int(string[index:new])
  24.                                 index = new
  25.                             else:
  26.                                 break
  27.                         elif new == M:
  28.                             if str(temp) == string[index:new]:
  29.                                 return True
  30.                             else:
  31.                                 break
  32.                         else:
  33.                             break
  34.                            
  35.                 num1 = string[0:u1]
  36.                 num2 = string[u1:(u0+u1)]
  37.                 if (len(num1) > 1 and num1[0]=='0') or (len(num2) > 1 and num2[0]=='0'):
  38.                     pass
  39.                 else:
  40.                     num1 = int(string[0:u1])
  41.                     num2 = int(string[u1:(u0+u1)])
  42.                     index = u0 + u1
  43.                     while index < M:
  44.                         temp = num1 + num2
  45.                         bits = len(str(temp))
  46.                         new = index + bits
  47.                         if new < M:
  48.                             if str(temp) == string[index:new]:
  49.                                 num1 = num2
  50.                                 num2 = int(string[index:new])
  51.                                 index = new
  52.                             else:
  53.                                 break
  54.                         elif new == M:
  55.                             if str(temp) == string[index:new]:
  56.                                 return True
  57.                             else:
  58.                                 break
  59.                         else:
  60.                             break
  61.     return False
复制代码


评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-4 22:27:27 | 显示全部楼层
  1. def fun323(num):
  2.     length = len(num)
  3.     if length < 3:
  4.         return False
  5.     for i in range((length-1)//2):
  6.         if num[0] == '0' and i >= 1:
  7.                 continue
  8.         for j in range(i+1,length//2):
  9.             if num[i+1] == '0' and j != i+1:
  10.                 continue
  11.             a = int(num[:i+1])
  12.             b = int(num[i+1:j+1])
  13.             nextindex = j+1
  14.             nextc = a+b
  15.             lenitem = len(str(nextc))
  16.             while nextindex < length and nextindex+lenitem <= length and int(num[nextindex:nextindex+lenitem]) == nextc:
  17.                 a = b
  18.                 b = int(num[nextindex: nextindex + lenitem])
  19.                 nextc = a+b
  20.                 nextindex += lenitem
  21.                 lenitem = len(str(nextc))
  22.             if nextindex == length:
  23.                 return True
  24.     return False

  25. print(fun323("11199911102109"))
复制代码


顺便帮我把前面两次的评了。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-4 22:41:52 | 显示全部楼层
好吧,我想了个比较奇特的方法

  1. def fun323(s):
  2.     if len(s)<3:return False
  3.     def recursive(a,s,j):
  4.         b,c=s[i:i+j],s[i+j:]
  5.         t=str(int(a)+int(b))
  6.         if c==t:
  7.             return True
  8.         elif c.startswith(t):
  9.             return recursive(b,' '*i+c,len(t))
  10.         else:
  11.             return False
  12.     for i in range(1,len(s)-1):
  13.         for j in range(1,(len(s)-i)//2+1):
  14.             a=s[:i]
  15.             if recursive(a,s,j):return True
  16.     return False
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-5 01:19:57 | 显示全部楼层
本帖最后由 kinkon 于 2020-2-5 02:51 编辑

学习阶段,参考大神们的
  1. def f323(s):
  2.     l=len(s)
  3.     if l<3:return False
  4.     for i in range(1,l//3+1):
  5.         for j in range(i,l//2+1):
  6.             c=i+j
  7.             a,b=int(s[i:c]),int(s[:i])+int(s[i:c])
  8.             while str(b)==s[c:c+len(str(b))]:
  9.                 c+=len(str(b))
  10.                 if c==l:return True
  11.                 a,b=b,a+b
  12.     return False
  13.    
  14. print(f323('0112358'))
  15. print(f323('199100199'))
  16. print(f323('112359'))
  17. print(f323('199100198'))
  18. print(f323('101'))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-5 03:04:13 | 显示全部楼层
1001101算True还是False?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-5 13:37:16 | 显示全部楼层
su沐沫 发表于 2020-2-4 18:55
累加数可以干嘛用呢

??
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-5 13:39:43 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-5 13:51:42 | 显示全部楼层
ll104567 发表于 2020-2-4 19:36
暴力战胜一切-----------------------------------------------------

解答错误

输入:"10"
输出:True
预期结果:False
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-5 13:52:48 | 显示全部楼层
William4869 发表于 2020-2-4 19:56
def f323(s):
    lenth=len(s)//2+1
    for i in range(1,lenth):

解答错误

输入:"1023"
输出:True
打印:1 0
预期结果:False
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-5 14:12:56 | 显示全部楼层
增加了一个判断,测试用例多给几个吧~

  1. def gene(a,b):
  2.     x = [str(a),str(b)]
  3.     for i in range(100):
  4.         x.append(str(int(x[-1])+int(x[-2])))
  5.     return ''.join(x)

  6. def create_list(n):
  7.     if n % 3 == 1:
  8.         max_number = (n+1)//3 + 1
  9.     elif n %3 == 2:
  10.         max_number = (n+2)//3 + 1
  11.     else:
  12.         max_number = (n)//3 + 1
  13.     x = []
  14.     for i in range(1,max_number):
  15.         for j in range(i,max_number):
  16.             x.append((i,j))
  17.     #print(x)
  18.     return x

  19. def check(x):
  20.     if len(x) < 3:
  21.         return False
  22.     l = create_list(len(x))
  23.     all_possible = []
  24.     for i in l:
  25.         a = int(x[0:i[0]])
  26.         b = int(x[i[0]:i[0]+i[1]])
  27.         all_possible.append(gene(a,b))
  28.     for i in all_possible:
  29.         #print(i[:20])
  30.         if i.startswith(x):
  31.             return True
  32.     return False

  33. print(check('10'))
  34. print(check('199100199'))
  35. print(check('112359'))
  36. print(check('199100198'))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-5 15:06:08 | 显示全部楼层
zltzlt 发表于 2020-2-5 13:52
解答错误

输入:"1023"

改了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-5 16:34:25 | 显示全部楼层
Vmtayvj 发表于 2020-2-4 22:03
前几次的出题学到itertools.combinations
感觉这就可以用上,但我绞尽脑汁都想不出来...

combinations 效率很低,如果用 combinations 八成会超时。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-5 16:35:20 | 显示全部楼层
William4869 发表于 2020-2-4 20:04
def f323(s):
    lenth=len(s)//2+1
    for i in range(1,lenth):

如何正确发代码:https://fishc.com.cn/forum.php?mod=viewthread&tid=52272
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-5 16:36:24 | 显示全部楼层
William4869 发表于 2020-2-4 20:04
def f323(s):
    lenth=len(s)//2+1
    for i in range(1,lenth):

解答错误

输入:"198019823962"
输出:False
预期结果:True
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-24 16:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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