Simplifying for-if messes with better structure?
Posted
by
HH
on Stack Overflow
See other posts from Stack Overflow
or by HH
Published on 2011-01-12T15:58:06Z
Indexed on
2011/01/12
18:53 UTC
Read the original article
Hit count: 235
# Description: you are given a bitwise pattern and a string
# you need to find the number of times the pattern matches in the string
# any one liner or simple pythonic solution?
import random
def matchIt(yourString, yourPattern):
"""find the number of times yourPattern occurs in yourString"""
count = 0
matchTimes = 0
# How can you simplify the for-if structures?
for coin in yourString:
#return to base
if count == len(pattern):
matchTimes = matchTimes + 1
count = 0
#special case to return to 2, there could be more this type of conditions
#so this type of if-conditionals are screaming for a havoc
if count == 2 and pattern[count] == 1:
count = count - 1
#the work horse
#it could be simpler by breaking the intial string of lenght 'l'
#to blocks of pattern-length, the number of them is 'l - len(pattern)-1'
if coin == pattern[count]:
count=count+1
average = len(yourString)/matchTimes
return [average, matchTimes]
# Generates the list
myString =[]
for x in range(10000):
myString= myString + [int(random.random()*2)]
pattern = [1,0,0]
result = matchIt(myString, pattern)
print("The sample had "+str(result[1])+" matches and its size was "+str(len(myString))+".\n" +
"So it took "+str(result[0])+" steps in average.\n" +
"RESULT: "+str([a for a in "FAILURE" if result[0] != 8]))
# Sample Output
#
# The sample had 1656 matches and its size was 10000.
# So it took 6 steps in average.
# RESULT: ['F', 'A', 'I', 'L', 'U', 'R', 'E']
© Stack Overflow or respective owner