fork download
  1. #import matplotlib.pyplot as plt
  2. #from random import randrange
  3.  
  4. def itOne(n):
  5. return 1 if n==1 else (n*3+1)//2 if n%2 else n//2
  6. return 1 if n==1 else n*3+1 if n%2 else n//2
  7.  
  8. def itFull(n):
  9. ni=n
  10. cs=[ni]
  11. while ni>1:
  12. ni=itOne(ni)
  13. cs.append(ni)
  14. return cs
  15.  
  16. def pen(n):
  17. return n**1.0 if n>0 else 0
  18. ###alternatives
  19. ##return n**1.0 if n>0 else 0 #-(abs(n)**1.1)/1000
  20.  
  21. def gen(sp,c,r):
  22. if c==-10:
  23. aaa=1
  24. sc=[(float('inf'),0)]
  25. for i in range(1,len(r)):
  26. rg=sc[i-1][0]+pen(r[i])
  27. dg=sp[i-1][0]+pen(r[i]+c)
  28. sv = min( rg, dg )
  29. sd = int( rg > dg )
  30. ###alternatives
  31. ##sd = int( rg >= dg )
  32. ##if rg==dg:
  33. ## sd=randrange(2)
  34. sc+=[(sv,sd)]
  35. return sc
  36.  
  37. def traceAndAdd(s,c,r):
  38. h=len(c)-1
  39. rn=r[:]
  40. cl=[]
  41. for i in range(len(r)-1,-1,-1):
  42. if s[h][i][1] == 1:
  43. rn[i]+=c[h]
  44. h-=1
  45. cl+=[i]
  46. return cl,rn
  47.  
  48.  
  49. def addFullIt(c,r):
  50. s=[ [(0,0)] ]
  51. for i in range(1,len(r)):
  52. s[0]+=[(s[0][-1][0]+pen(r[i]),0)]
  53. for i in range(0,len(c)-1):
  54. s+=[gen(s[i],c[i+1],r)]
  55. cl,rn=traceAndAdd(s,c,r)
  56. return cl,rn
  57.  
  58. n1=30#0
  59. n2=40#0
  60.  
  61. a=list(range(n1,n2+1))
  62. b=list(map(itFull,a))
  63. c=sorted(b,key=lambda t:len(t),reverse=True)
  64.  
  65. r=[0]*((len(c[0])+1)*2)
  66. cd=list(map(lambda l: list(map(lambda i,k:i-k, l[1:], l[:-1])), c))
  67. rds=[]
  68.  
  69. cll=[]
  70.  
  71. for ind,cde in enumerate(cd):
  72. ###progress mark
  73. ##print('*',end='')
  74. cde=[0]+cde
  75. ro=r[:]
  76. cl,r=addFullIt(cde,r)
  77. cll+=[cl]
  78. #print(c[ind][1],':',cl)
  79. rd=list(map(lambda i,k:i-k, r,ro))
  80. rds+=[rd]
  81.  
  82. fp=[]
  83. for i in range(len(r)):
  84. fp+=[[]]
  85. for ind,cl in enumerate(cll):
  86. for cle in cl:
  87. fp[cle]+=[c[ind][0]]
  88.  
  89. for fpe in fp:
  90. if len(fpe)>1:
  91. print(fpe)
  92.  
  93. ###reiteration, doesn't help much
  94. ##for cde,rde in zip(cd,rds):
  95. ## print('*',end='')
  96. ## cde=[0]+cde
  97. ## r=list(map(lambda i,k:i-k, r,rde))
  98. ## r=addFullIt(cde,r)
  99.  
  100.  
  101. rf=[r[0]-sum(r)]
  102. for i in range(1,len(r)):
  103. rf+=[rf[-1]+r[i]]
  104.  
  105. rps=sum(map(pen,r))
  106. print('max: ',max(rf),', pen: ',rps)
  107.  
  108. #plt.plot(rf)
  109. #plt.show()
  110.  
Success #stdin #stdout 0.09s 8688KB
stdin
Standard input is empty
stdout
[31, 30]
[31, 36]
[31, 36, 38]
[31, 34, 40, 32]
[31, 40, 32]
[31, 39, 33, 36, 37, 38, 30, 34, 35]
[31, 33, 36, 37]
[31, 39, 33, 36, 38, 30]
[31, 33, 37, 34]
[31, 37, 38, 40, 32]
[31, 39, 33, 36, 37, 30, 34, 40]
[31, 38, 34, 40, 32]
[31, 39, 34, 40, 32]
[31, 40]
[31, 39, 33, 36, 37, 38, 30, 34, 35]
[31, 33, 36, 30, 34]
[31, 33, 30, 34, 35]
[31, 30, 34, 35]
[31, 30, 35]
[31, 39, 33, 36, 37, 38, 30]
[31, 39, 36, 37, 38, 30, 35]
[31, 33, 37, 38, 35]
[31, 39, 33, 36, 37, 38, 30, 35]
[31, 39, 37, 38, 30, 35]
[31, 35]
[31, 39, 33, 36, 37, 38]
[31, 33, 36, 37, 38]
[31, 33, 36, 37, 38]
[31, 39, 33]
[31, 39, 33, 36, 37, 38]
[31, 39, 33]
[31, 33]
[31, 39]
[31, 39]
[31, 39]
[31, 39]
[31, 39]
[31, 39]
[31, 39]
[31, 39]
[31, 39]
[31, 39]
max:  4627 , pen:  9192.0