Я думаю, что у меня есть.
Во-первых, код, основанный на вашей идее:
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>lastResult:
print ('\n=========================='
'\nID==%s'
'\n ID>lastResult is %s : program STOPS')\
% (ID,ID>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)
результат
--------------------------
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>lastResult is True : program STOPS
.
А вот код, основанный на моей идее:
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>lastResult:
print ('\n=========================='
'\nID==%s'
'\n ID>lastResult is %s : program STOPS')\
% (ID,ID>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>lastResult:
print '\n j==%2s %s+%s==%s>lastResult==%s is %s' \
% (j,ID,j,ID+j,lastResult,ID+j>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 ==> ID==%s' % (maxdiff,ID)
break
elif ID>lastResult:
print ' ID>lastResult==%s>%s is %s ==> WILL STOP' % (ID,lastResult,ID>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)
результат
-------------------------
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 ==> 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 ==> 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>lastResult==100 is True
--------------------------
now ID== 101
ID>lastResult==101>100 is True ==> WILL STOP
==========================
ID==101
ID>lastResult is True : program STOPS
В этом коде есть
if ID in SEEN:
print '-----------------\nID=='+str(ID)+' already seen, not examined'
ID += 1
, но сообщение 'уже видел' никогда не печатается во время исполнения;однако обнаружение идентификатора валидности имеет тот же результат;это означает, что использование набора SEEN не обязательно в моем коде.
.
Редактировать 1
Код # 1 с инструкцией по регулярному опустошению SEEN
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>lastResult:
print ('\n=========================='
'\nID==%s'
'\n ID>lastResult is %s : program STOPS')\
% (ID,ID>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)
результат
--------------------------
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>lastResult is True : program STOPS
Этот код выше показывает процесс, касающийся записи и сброса значений идентификатора, уже виденных.Этот код настолько хорош, насколько это только возможно, поскольку алгоритм включает периодическое опорожнение SEEN, поскольку верно, что опорожнение необходимо, учитывая количество идентификаторов, которые нужно протестировать.
Но изВначале мое мнение заключалось в том, что этот процесс, касающийся SEEN, в этом алгоритме влияет на производительность, потому что инструкции по записи и тестированию, относящиеся к SEEN, многократно выполняются на каждом этапе программы.Алгоритм не имеет этого недостатка.Мне наконец удалось написать такой альтернативный код, и теперь у нас есть два кода с двумя разными алгоритмами.
Относительно вашего вопроса "Вы уверены, что нет необходимости использовать логику SEEN во втором?"
Я отвечаю «да, я думаю, что могу быть уверен».Цель моего кода № 2 с инструкциями, управляющими SEEN, состояла в том, чтобы убедить меня после проверки того, что было мысленной идеей и концептуальным алгоритмом.Если вы хотите быть уверенным, вы должны сделать то же самое: - изучить концептуально и точно алгоритм - выполнить столько эссе выполнения двух кодов и сравнить их результаты, сколько вам необходимо убедиться экспериментально, варьируя значения lastResult,valid_ones и diff Для меня эта точка закрыта до тех пор, пока не будет противоречивого практического случая, доказывающего, что мой вывод неверен.
Я продолжаю в другом ответе, потому что количество символов ограничено вэтот