Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>I think I've got it.</p> <p>First, the code based on your idea:</p> <pre><code>import time lastResult = 100 def checkNextID(ID, lastResult = lastResult, diff = [8,18,7,17,6,16,5,15]): runs = 0 SEEN = set() while True: if ID&gt;lastResult: print ('\n==========================' '\nID==%s' '\n ID&gt;lastResult is %s : program STOPS')\ % (ID,ID&gt;lastResult,) break runs += 1 if runs % 10 == 0: time.sleep(0.5) if ID in SEEN: print '-----------------\nID=='+str(ID)+' already seen, not examined' ID += 1 else: curRes = isValid(ID) if curRes: print '--------------------------\nID=='+str(ID)+' vaaaalid' while True: for i in diff: runs += 1 if runs % 10 == 0: time.sleep(0.5) curRes = isValid(ID+i) SEEN.add(ID+i) if curRes: print ' i==%2s ID+i==%s valid' % (i,ID+i) ID += i print '--------------------------\nID==%s' % str(ID) break else: print ' i==%2s ID+i==%s not valid' % (i,ID+i) else: ID += 1 break else: print '--------------------------\nID==%s not valid' % ID ID += 1 def isValid(ID, valid_ones = (1,9,17,25,50,52,60,83,97,98)): return ID in valid_ones checkNextID(0) </code></pre> <p>result</p> <pre><code>-------------------------- ID==0 not valid -------------------------- ID==1 vaaaalid i== 8 ID+i==9 valid -------------------------- ID==9 i== 8 ID+i==17 valid -------------------------- ID==17 i== 8 ID+i==25 valid -------------------------- ID==25 i== 8 ID+i==33 not valid i==18 ID+i==43 not valid i== 7 ID+i==32 not valid i==17 ID+i==42 not valid i== 6 ID+i==31 not valid i==16 ID+i==41 not valid i== 5 ID+i==30 not valid i==15 ID+i==40 not valid -------------------------- ID==26 not valid -------------------------- ID==27 not valid -------------------------- ID==28 not valid -------------------------- ID==29 not valid ----------------- ID==30 already seen, not examined ----------------- ID==31 already seen, not examined ----------------- ID==32 already seen, not examined ----------------- ID==33 already seen, not examined -------------------------- ID==34 not valid -------------------------- ID==35 not valid -------------------------- ID==36 not valid -------------------------- ID==37 not valid -------------------------- ID==38 not valid -------------------------- ID==39 not valid ----------------- ID==40 already seen, not examined ----------------- ID==41 already seen, not examined ----------------- ID==42 already seen, not examined ----------------- ID==43 already seen, not examined -------------------------- ID==44 not valid -------------------------- ID==45 not valid -------------------------- ID==46 not valid -------------------------- ID==47 not valid -------------------------- ID==48 not valid -------------------------- ID==49 not valid -------------------------- ID==50 vaaaalid i== 8 ID+i==58 not valid i==18 ID+i==68 not valid i== 7 ID+i==57 not valid i==17 ID+i==67 not valid i== 6 ID+i==56 not valid i==16 ID+i==66 not valid i== 5 ID+i==55 not valid i==15 ID+i==65 not valid -------------------------- ID==51 not valid -------------------------- ID==52 vaaaalid i== 8 ID+i==60 valid -------------------------- ID==60 i== 8 ID+i==68 not valid i==18 ID+i==78 not valid i== 7 ID+i==67 not valid i==17 ID+i==77 not valid i== 6 ID+i==66 not valid i==16 ID+i==76 not valid i== 5 ID+i==65 not valid i==15 ID+i==75 not valid -------------------------- ID==61 not valid -------------------------- ID==62 not valid -------------------------- ID==63 not valid -------------------------- ID==64 not valid ----------------- ID==65 already seen, not examined ----------------- ID==66 already seen, not examined ----------------- ID==67 already seen, not examined ----------------- ID==68 already seen, not examined -------------------------- ID==69 not valid -------------------------- ID==70 not valid -------------------------- ID==71 not valid -------------------------- ID==72 not valid -------------------------- ID==73 not valid -------------------------- ID==74 not valid ----------------- ID==75 already seen, not examined ----------------- ID==76 already seen, not examined ----------------- ID==77 already seen, not examined ----------------- ID==78 already seen, not examined -------------------------- ID==79 not valid -------------------------- ID==80 not valid -------------------------- ID==81 not valid -------------------------- ID==82 not valid -------------------------- ID==83 vaaaalid i== 8 ID+i==91 not valid i==18 ID+i==101 not valid i== 7 ID+i==90 not valid i==17 ID+i==100 not valid i== 6 ID+i==89 not valid i==16 ID+i==99 not valid i== 5 ID+i==88 not valid i==15 ID+i==98 valid -------------------------- ID==98 i== 8 ID+i==106 not valid i==18 ID+i==116 not valid i== 7 ID+i==105 not valid i==17 ID+i==115 not valid i== 6 ID+i==104 not valid i==16 ID+i==114 not valid i== 5 ID+i==103 not valid i==15 ID+i==113 not valid ----------------- ID==99 already seen, not examined ----------------- ID==100 already seen, not examined ========================== ID==101 ID&gt;lastResult is True : program STOPS </code></pre> <p>.</p> <p>And here's the code based on my idea:</p> <pre><code>import time lastResult = 100 def checkNextID(ID, lastResult = lastResult, diff = [8,18,7,17,6,16,5,15]): runs = 0 maxdiff = max(diff) others = [x for x in xrange(1,maxdiff) if x not in diff] lastothers = others[-1] SEEN = set() while True: if ID&gt;lastResult: print ('\n==========================' '\nID==%s' '\n ID&gt;lastResult is %s : program STOPS')\ % (ID,ID&gt;lastResult,) break runs += 1 if runs % 10 == 0: time.sleep(0.5) if ID in SEEN: print '-----------------\nID=='+str(ID)+' already seen, not examined' ID += 1 else: curRes = isValid(ID) if curRes: print '------------------------------------\nID=='+str(ID)+' vaaaalid' while True: for i in diff: runs += 1 if runs % 10 == 0: time.sleep(0.5) curRes = isValid(ID+i) SEEN.add(ID+i) if curRes: print ' i==%2s ID+i==%s valid' % (i,ID+i) ID += i print '--------------------------\nID==%s' % str(ID) break else: print ' i==%2s ID+i==%s not valid' % (i,ID+i) else: for j in others: if ID+j&gt;lastResult: print '\n j==%2s %s+%s==%s&gt;lastResult==%s is %s' \ % (j,ID,j,ID+j,lastResult,ID+j&gt;lastResult) ID += j print '\n--------------------------\nnow ID==',ID break runs += 1 if runs % 10 == 0: time.sleep(0.5) curRes = isValid(ID+j) SEEN.add(ID+j) if curRes: print ' j==%2s ID+j==%s valid' % (j,ID+j) ID += j print '--------------------------\nID=='+str(ID) break else: print ' j==%2s ID+j==%s not valid' % (j,ID+j) if j==lastothers: ID += maxdiff + 1 print ' ID += %s + 1 ==&gt; ID==%s' % (maxdiff,ID) break elif ID&gt;lastResult: print ' ID&gt;lastResult==%s&gt;%s is %s ==&gt; WILL STOP' % (ID,lastResult,ID&gt;lastResult) break else: print '-------------------------\nID=='+str(ID)+' not valid' ID += 1 def isValid(ID, valid_ones = (1,9,17,25,50,52,60,83,97,98)): return ID in valid_ones checkNextID(0) </code></pre> <p>result</p> <pre><code>------------------------- ID==0 not valid ------------------------------------ ID==1 vaaaalid i== 8 ID+i==9 valid -------------------------- ID==9 i== 8 ID+i==17 valid -------------------------- ID==17 i== 8 ID+i==25 valid -------------------------- ID==25 i== 8 ID+i==33 not valid i==18 ID+i==43 not valid i== 7 ID+i==32 not valid i==17 ID+i==42 not valid i== 6 ID+i==31 not valid i==16 ID+i==41 not valid i== 5 ID+i==30 not valid i==15 ID+i==40 not valid j== 1 ID+j==26 not valid j== 2 ID+j==27 not valid j== 3 ID+j==28 not valid j== 4 ID+j==29 not valid j== 9 ID+j==34 not valid j==10 ID+j==35 not valid j==11 ID+j==36 not valid j==12 ID+j==37 not valid j==13 ID+j==38 not valid j==14 ID+j==39 not valid ID += 18 + 1 ==&gt; ID==44 ------------------------- ID==44 not valid ------------------------- ID==45 not valid ------------------------- ID==46 not valid ------------------------- ID==47 not valid ------------------------- ID==48 not valid ------------------------- ID==49 not valid ------------------------------------ ID==50 vaaaalid i== 8 ID+i==58 not valid i==18 ID+i==68 not valid i== 7 ID+i==57 not valid i==17 ID+i==67 not valid i== 6 ID+i==56 not valid i==16 ID+i==66 not valid i== 5 ID+i==55 not valid i==15 ID+i==65 not valid j== 1 ID+j==51 not valid j== 2 ID+j==52 valid -------------------------- ID==52 i== 8 ID+i==60 valid -------------------------- ID==60 i== 8 ID+i==68 not valid i==18 ID+i==78 not valid i== 7 ID+i==67 not valid i==17 ID+i==77 not valid i== 6 ID+i==66 not valid i==16 ID+i==76 not valid i== 5 ID+i==65 not valid i==15 ID+i==75 not valid j== 1 ID+j==61 not valid j== 2 ID+j==62 not valid j== 3 ID+j==63 not valid j== 4 ID+j==64 not valid j== 9 ID+j==69 not valid j==10 ID+j==70 not valid j==11 ID+j==71 not valid j==12 ID+j==72 not valid j==13 ID+j==73 not valid j==14 ID+j==74 not valid ID += 18 + 1 ==&gt; ID==79 ------------------------- ID==79 not valid ------------------------- ID==80 not valid ------------------------- ID==81 not valid ------------------------- ID==82 not valid ------------------------------------ ID==83 vaaaalid i== 8 ID+i==91 not valid i==18 ID+i==101 not valid i== 7 ID+i==90 not valid i==17 ID+i==100 not valid i== 6 ID+i==89 not valid i==16 ID+i==99 not valid i== 5 ID+i==88 not valid i==15 ID+i==98 valid -------------------------- ID==98 i== 8 ID+i==106 not valid i==18 ID+i==116 not valid i== 7 ID+i==105 not valid i==17 ID+i==115 not valid i== 6 ID+i==104 not valid i==16 ID+i==114 not valid i== 5 ID+i==103 not valid i==15 ID+i==113 not valid j== 1 ID+j==99 not valid j== 2 ID+j==100 not valid j== 3 98+3==101&gt;lastResult==100 is True -------------------------- now ID== 101 ID&gt;lastResult==101&gt;100 is True ==&gt; WILL STOP ========================== ID==101 ID&gt;lastResult is True : program STOPS </code></pre> <p>There is</p> <pre><code> if ID in SEEN: print '-----------------\nID=='+str(ID)+' already seen, not examined' ID += 1 </code></pre> <p>in this code, but the message <strong>'already seen'</strong> is never printed during the execution; however, the detection of valids ID has the same result; that means that the use of a set SEEN isn't necessary in my code. </p> <p>.</p> <h2>Edit 1</h2> <p>The code #1 with instruction to regularly empty SEEN</p> <pre><code>import time lastResult = 100 def checkNextID(ID, lastResult = lastResult, diff = [8,18,7,17,6,16,5,15]): runs = 0 SEEN = set() while True: if ID&gt;lastResult: print ('\n==========================' '\nID==%s' '\n ID&gt;lastResult is %s : program STOPS')\ % (ID,ID&gt;lastResult,) break runs += 1 if runs % 10 == 0: time.sleep(0.5) if ID in SEEN: print '-----------------\n%s\nID==%s already seen, not examined' % (SEEN,ID) ID += 1 else: curRes = isValid(ID) if curRes: print '--------------------------\n%s\nID==%s vaaaalid' % (SEEN,ID) while True: for i in diff: runs += 1 if runs % 10 == 0: time.sleep(0.5) curRes = isValid(ID+i) print ' '+str(SEEN) if i==diff[0]: SEEN = set([ID+i]) else: SEEN.add(ID+i) if curRes: print ' i==%2s ID+i==%s valid' % (i,ID+i) ID += i print '--------------------------\nID==%s' % str(ID) break else: print ' i==%2s ID+i==%s not valid' % (i,ID+i) else: ID += 1 break else: print '--------------------------\n%s\nID==%s not vaaaaalid' % (SEEN,ID) ID += 1 def isValid(ID, valid_ones = (1,9,17,25,30,50,52,60,83,97,98)): return ID in valid_ones checkNextID(0) </code></pre> <p>result</p> <pre><code>-------------------------- set([]) ID==0 not vaaaaalid -------------------------- set([]) ID==1 vaaaalid set([]) i== 8 ID+i==9 valid -------------------------- ID==9 set([9]) i== 8 ID+i==17 valid -------------------------- ID==17 set([17]) i== 8 ID+i==25 valid -------------------------- ID==25 set([25]) i== 8 ID+i==33 not valid set([33]) i==18 ID+i==43 not valid set([33, 43]) i== 7 ID+i==32 not valid set([32, 33, 43]) i==17 ID+i==42 not valid set([32, 33, 42, 43]) i== 6 ID+i==31 not valid set([32, 33, 42, 43, 31]) i==16 ID+i==41 not valid set([32, 33, 41, 42, 43, 31]) i== 5 ID+i==30 valid -------------------------- ID==30 set([32, 33, 41, 42, 43, 30, 31]) i== 8 ID+i==38 not valid set([38]) i==18 ID+i==48 not valid set([48, 38]) i== 7 ID+i==37 not valid set([48, 37, 38]) i==17 ID+i==47 not valid set([48, 37, 38, 47]) i== 6 ID+i==36 not valid set([48, 36, 37, 38, 47]) i==16 ID+i==46 not valid set([36, 37, 38, 46, 47, 48]) i== 5 ID+i==35 not valid set([35, 36, 37, 38, 46, 47, 48]) i==15 ID+i==45 not valid -------------------------- set([35, 36, 37, 38, 45, 46, 47, 48]) ID==31 not vaaaaalid -------------------------- set([35, 36, 37, 38, 45, 46, 47, 48]) ID==32 not vaaaaalid -------------------------- set([35, 36, 37, 38, 45, 46, 47, 48]) ID==33 not vaaaaalid -------------------------- set([35, 36, 37, 38, 45, 46, 47, 48]) ID==34 not vaaaaalid ----------------- set([35, 36, 37, 38, 45, 46, 47, 48]) ID==35 already seen, not examined ----------------- set([35, 36, 37, 38, 45, 46, 47, 48]) ID==36 already seen, not examined ----------------- set([35, 36, 37, 38, 45, 46, 47, 48]) ID==37 already seen, not examined ----------------- set([35, 36, 37, 38, 45, 46, 47, 48]) ID==38 already seen, not examined -------------------------- set([35, 36, 37, 38, 45, 46, 47, 48]) ID==39 not vaaaaalid -------------------------- set([35, 36, 37, 38, 45, 46, 47, 48]) ID==40 not vaaaaalid -------------------------- set([35, 36, 37, 38, 45, 46, 47, 48]) ID==41 not vaaaaalid -------------------------- set([35, 36, 37, 38, 45, 46, 47, 48]) ID==42 not vaaaaalid -------------------------- set([35, 36, 37, 38, 45, 46, 47, 48]) ID==43 not vaaaaalid -------------------------- set([35, 36, 37, 38, 45, 46, 47, 48]) ID==44 not vaaaaalid ----------------- set([35, 36, 37, 38, 45, 46, 47, 48]) ID==45 already seen, not examined ----------------- set([35, 36, 37, 38, 45, 46, 47, 48]) ID==46 already seen, not examined ----------------- set([35, 36, 37, 38, 45, 46, 47, 48]) ID==47 already seen, not examined ----------------- set([35, 36, 37, 38, 45, 46, 47, 48]) ID==48 already seen, not examined -------------------------- set([35, 36, 37, 38, 45, 46, 47, 48]) ID==49 not vaaaaalid -------------------------- set([35, 36, 37, 38, 45, 46, 47, 48]) ID==50 vaaaalid set([35, 36, 37, 38, 45, 46, 47, 48]) i== 8 ID+i==58 not valid set([58]) i==18 ID+i==68 not valid set([58, 68]) i== 7 ID+i==57 not valid set([57, 58, 68]) i==17 ID+i==67 not valid set([57, 58, 67, 68]) i== 6 ID+i==56 not valid set([56, 57, 58, 67, 68]) i==16 ID+i==66 not valid set([66, 67, 68, 56, 57, 58]) i== 5 ID+i==55 not valid set([66, 67, 68, 55, 56, 57, 58]) i==15 ID+i==65 not valid -------------------------- set([65, 66, 67, 68, 55, 56, 57, 58]) ID==51 not vaaaaalid -------------------------- set([65, 66, 67, 68, 55, 56, 57, 58]) ID==52 vaaaalid set([65, 66, 67, 68, 55, 56, 57, 58]) i== 8 ID+i==60 valid -------------------------- ID==60 set([60]) i== 8 ID+i==68 not valid set([68]) i==18 ID+i==78 not valid set([68, 78]) i== 7 ID+i==67 not valid set([67, 68, 78]) i==17 ID+i==77 not valid set([67, 68, 77, 78]) i== 6 ID+i==66 not valid set([66, 67, 68, 77, 78]) i==16 ID+i==76 not valid set([66, 67, 68, 76, 77, 78]) i== 5 ID+i==65 not valid set([65, 66, 67, 68, 76, 77, 78]) i==15 ID+i==75 not valid -------------------------- set([65, 66, 67, 68, 75, 76, 77, 78]) ID==61 not vaaaaalid -------------------------- set([65, 66, 67, 68, 75, 76, 77, 78]) ID==62 not vaaaaalid -------------------------- set([65, 66, 67, 68, 75, 76, 77, 78]) ID==63 not vaaaaalid -------------------------- set([65, 66, 67, 68, 75, 76, 77, 78]) ID==64 not vaaaaalid ----------------- set([65, 66, 67, 68, 75, 76, 77, 78]) ID==65 already seen, not examined ----------------- set([65, 66, 67, 68, 75, 76, 77, 78]) ID==66 already seen, not examined ----------------- set([65, 66, 67, 68, 75, 76, 77, 78]) ID==67 already seen, not examined ----------------- set([65, 66, 67, 68, 75, 76, 77, 78]) ID==68 already seen, not examined -------------------------- set([65, 66, 67, 68, 75, 76, 77, 78]) ID==69 not vaaaaalid -------------------------- set([65, 66, 67, 68, 75, 76, 77, 78]) ID==70 not vaaaaalid -------------------------- set([65, 66, 67, 68, 75, 76, 77, 78]) ID==71 not vaaaaalid -------------------------- set([65, 66, 67, 68, 75, 76, 77, 78]) ID==72 not vaaaaalid -------------------------- set([65, 66, 67, 68, 75, 76, 77, 78]) ID==73 not vaaaaalid -------------------------- set([65, 66, 67, 68, 75, 76, 77, 78]) ID==74 not vaaaaalid ----------------- set([65, 66, 67, 68, 75, 76, 77, 78]) ID==75 already seen, not examined ----------------- set([65, 66, 67, 68, 75, 76, 77, 78]) ID==76 already seen, not examined ----------------- set([65, 66, 67, 68, 75, 76, 77, 78]) ID==77 already seen, not examined ----------------- set([65, 66, 67, 68, 75, 76, 77, 78]) ID==78 already seen, not examined -------------------------- set([65, 66, 67, 68, 75, 76, 77, 78]) ID==79 not vaaaaalid -------------------------- set([65, 66, 67, 68, 75, 76, 77, 78]) ID==80 not vaaaaalid -------------------------- set([65, 66, 67, 68, 75, 76, 77, 78]) ID==81 not vaaaaalid -------------------------- set([65, 66, 67, 68, 75, 76, 77, 78]) ID==82 not vaaaaalid -------------------------- set([65, 66, 67, 68, 75, 76, 77, 78]) ID==83 vaaaalid set([65, 66, 67, 68, 75, 76, 77, 78]) i== 8 ID+i==91 not valid set([91]) i==18 ID+i==101 not valid set([91, 101]) i== 7 ID+i==90 not valid set([90, 91, 101]) i==17 ID+i==100 not valid set([90, 91, 100, 101]) i== 6 ID+i==89 not valid set([89, 90, 91, 100, 101]) i==16 ID+i==99 not valid set([99, 100, 101, 89, 90, 91]) i== 5 ID+i==88 not valid set([99, 100, 101, 88, 89, 90, 91]) i==15 ID+i==98 valid -------------------------- ID==98 set([98, 99, 100, 101, 88, 89, 90, 91]) i== 8 ID+i==106 not valid set([106]) i==18 ID+i==116 not valid set([106, 116]) i== 7 ID+i==105 not valid set([105, 106, 116]) i==17 ID+i==115 not valid set([105, 106, 115, 116]) i== 6 ID+i==104 not valid set([104, 105, 106, 115, 116]) i==16 ID+i==114 not valid set([104, 105, 106, 114, 115, 116]) i== 5 ID+i==103 not valid set([103, 104, 105, 106, 114, 115, 116]) i==15 ID+i==113 not valid -------------------------- set([103, 104, 105, 106, 113, 114, 115, 116]) ID==99 not vaaaaalid -------------------------- set([103, 104, 105, 106, 113, 114, 115, 116]) ID==100 not vaaaaalid ========================== ID==101 ID&gt;lastResult is True : program STOPS </code></pre> <p>This above code shows the process concerning the recording and emptying the values of ID already seen. It is a code as good as it is conceivable, since the algorithm comprises the periodical emptying of SEEN, because it 's true that emptying is necessary, given the number of IDs to te be tested.</p> <p>But from the beginning, my opinion was that this process concernin SEEN in this algorithm weighs on the performance, because recording and testing instructions concerning a SEEN are repeatedly executed at every step of the program.</p> <p>That's why I imagined there should be another algorithm having not this drawback. I finally succeeded to write such an alternative code, and now we have two codes having two different algorithms.</p> <p>Concerning your question <em>"are you sure it's not necessary to use the SEEN logic in the second?"</em><br> I answer 'yes, I think I can be sure'. The intent of runing my code #2 with instructions managing SEEN was to make me sure after verifying what was a mental idea and a conceptual algorithm. If you want to become sure, you must do the same: - study conceptually and precisely the algorithm - do as many essays of execution of the two codes and comparison of their results as you need to be experimentally convinced, varying the values of lastResult, valid_ones and diff For me , this point is closed as long as there won't be a contradictory practical case proving that my conclusion is wrong.</p> <h2>I continue in the other answer, because the number of characters is limited in this one</h2>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload