How do I increment one value and reset another. PYTHON - python

I am searching for common terms in 2 decks of cards.
I want to search deck[v]...1 to deck[b]...1,2,3,4,5,6,7,8,9,10,11,12,13.
I then want to increment [v] to search deck[v]...2 to deck[b]...1,2,3,4,5,6,7,8,9,10,11,12,13.
etc etc etc
I can get the first part but can't figure out how to increment [v] and reset [b] to 1.
Any help would be appreciated.
Theres 13 terms
b = 1
v = 1
while b <= 13:
print(b, deck[b])
print("Intersection between", "v = ",v, "and", "b = ",b, deck[v].intersection(deck[b]))
if len(deck[v].intersection(deck[b])) == 1:
print("1 match")
print("v = ", v)
print("b = ", b)
b = b + 1

Why not just use 2 for loops?
for b in range(1,14):
for v in range(1,14):
# Your code
print(b, deck[b])
print("Intersection between", "v = ",v, "and", "b = ",b, deck[v].intersection(deck[b]))
if len(deck[v].intersection(deck[b])) == 1:
print("1 match")
print("v = ", v)
print("b = ", b)

You just need to insert your current code into a new loop and increment v in that loop:
b = 1
v = 1
while v <= 13:
while b <= 13:
print(b, deck[b])
print("Intersection between", "v = ",v, "and", "b = ",b, deck[v].intersection(deck[b]))
if len(deck[v].intersection(deck[b])) == 1:
print("1 match")
print("v = ", v)
print("b = ", b)
b = b + 1
v = v + 1

Related

How can i add a While loop to detect errors in the input in python

So, i am trying to write a code to not only do arithmetic equations, but also, give feedback if there is an error as well as give me 3 tries max. any advice?
arithmetic=input("Enter an arithmetic operation:")
arithmetic= arithmetic.replace(" ", "")
w=arithmetic.split('/')
x= arithmetic.split('-')
y=arithmetic.split('+')
z=arithmetic.split('*')
if ("+" in arithmetic):
a= int(y[0])
b= int(y[1])
sum = a + b
print("The result is = " + str(sum))
elif ("*" in arithmetic):
a= int(z[0])
b= int(z[1])
result = a * b
print("The result is = " + str(result))
elif ("/" in arithmetic):
a= int(w[0])
b= int(w[1])
result = a / b
result = round(result,3)
print("The result is = " + str(result))
elif ("-" in arithmetic) and (len(x)==3):
a= int(x[1])
b= int(x[2])
result = a + b
result = result * (-1)
print("The result is = " + str(result))
elif ("-" in arithmetic) and (len(x)==2):
a= int(x[0])
b= int(x[1])
result = a - b
print("The result is = " + str(result))
#tries = 0
#while(tries < 3):
# arithmetic=input("Enter an arithmetic operation:")
# match = arithmetic.find('+')
# print(match)
# if(match == -1):
# print ("Invalid")
# tries += 1
# else:
# tries= 3
I tried to add the while in the beginning. However, when i put an input such as 11 and 12 without the + sign, it just printed the input without giving me an error. why is that?
tries = 0
while tries < 3:
arithmetic = input("Enter an arithmetic operation:")
arithmetic = arithmetic.replace(" ", "")
w = arithmetic.split('/')
x = arithmetic.split('-')
y = arithmetic.split('+')
z = arithmetic.split('*')
try:
if ("+" in arithmetic):
a = int(y[0])
b = int(y[1])
sum = a + b
print("The result is = " + str(sum))
elif ("*" in arithmetic):
a = int(z[0])
b = int(z[1])
result = a * b
print("The result is = " + str(result))
elif ("/" in arithmetic):
a = int(w[0])
b = int(w[1])
result = a / b
result = round(result, 3)
print("The result is = " + str(result))
elif ("-" in arithmetic) and (len(x) == 3):
a = int(x[1])
b = int(x[2])
result = a + b
result = result * (-1)
print("The result is = " + str(result))
elif ("-" in arithmetic) and (len(x) == 2):
a = int(x[0])
b = int(x[1])
result = a - b
print("The result is = " + str(result))
else:
print("Invalid")
tries += 1
continue
break
except ValueError: # for case split not working good due cases like first input is a negative number
print("Invalid")
tries += 1
At the end of your if / else if chain, just add:
else:
print("invalid")
tries += 1
Replace everything you have inside your while loop currently with the uncommented code above it and that should work.

Finding common outputs of 3 functions

I have 3 functions.These are
A(n) = n(n+1)/2
B(n) = n(3n-1)/2
C(n) = n(2n-1)
Their first common output and indexes are:
A(285)=B(165)=C(143)=40755
I need second one,so I tried this:
def equation1(x):
return x*(x+1)/2
def equation2(x):
return x*((3*x)-1)/2
def equation3(x):
return x*((2*x)-1)
for i in range(144,30000):
x = equation3(i)
for a in range(i,2*i):
y = equation2(a)
if(x==y):
for b in range(a,2*a):
z = equation1(b)
if(x==y==z):
print("Term =" + str(x))
print("A" + str(b))
print("B" + str(a))
print("C" + str(i))
But it takes too much time to find it.How can I handle this in an easier way?
Since all three functions are increasing for positive values, you can write a loop that increases the number with the smallest value at each iteration:
a = b = c = 1
eq_a = equation1(a)
eq_b = equation2(b)
eq_c = equation3(c)
while True:
if eq_a == eq_b and eq_b == eq_c:
print("Found {}, {}, {}, result={}".format(a,b,c,eq_a))
if eq_a <= eq_b and eq_a <= eq_c:
a += 1
eq_a = equation1(a)
elif eq_b <= eq_a and eq_b <= eq_c:
b += 1
eq_b = equation2(b)
elif eq_c <= eq_a and eq_c <= eq_b:
c += 1
eq_c = equation3(c)
else:
print("Should never be here")
assert(False);
Test run:
Found 1, 1, 1, result=1
Found 285, 165, 143, result=40755
Found 55385, 31977, 27693, result=1533776805
Found 10744501, 6203341, 5372251, result=57722156241751

Better way to print a true group in Python

I want to make a program that returns a group of True variables that i found in my program. Like this:
1 = True
2 = True
3 = False
4 = False
5 = True
What I want is to return as a print
The true numbers are: 1, 2 and 5
Edit 1:
The code is a letter counter!
eacha letter in a group has a value.
Like
a=1
b = 2
...
If a number repeats more than 4 times, that number is a true
The group would be a name. like John in an imput.
The program reads it and gives a number for each letter.
what I am using right now is this (Preatty ugly I know, but I started programing this month...), where "a" is the amount of letter a in the name, b is the amount of b in the name....
if (a + j + s) >=4:
exe1 = 1
else:
exe1 = ""
if (b + k + t) >=4:
exe2 = 2
else:
exe2 = ""
if (c + l + u) >=4:
exe3 = 3
else:
exe3 = ""
if (d + m + v) >=4:
exe4 = 4
else:
exe4 = ""
if (e + n + w) >=4:
exe5 = 5
else:
exe5 = ""
if (f + o + x) >=4:
exe6 = 6
else:
exe6 = ""
if (g + p + y) >=4:
exe7 = 7
else:
exe7 = ""
if (h + q + z) >=4:
exe8 = 8
else:
exe8 = ""
if (i + r) >=4:
exe9 = 9
else:
exe9 = ""
print("Excesses:", exe1, exe2, exe3, exe4, exe5, exe6, exe7, exe8, exe9)
Why don't you use a dictionary? Take a look in this code as an example.
dict1 = {1:'True', 2:'True', 3:'False', 4:'False', 5:'True'}
list = []
for k, v in dict1.items():
if v == 'True':
#print(k, sep=' ', end=',')
list.append(k)
print(list)
Now you the list - although inside brackets and I don't know how to remove them since they are part of the list... Maybe iteration over it again should solve the problem, although I am not a truly expert in Python.

Implementing Knuth-Morris-Pratt (KMP) algorithm for string matching with Python

I am following Cormen Leiserson Rivest Stein (clrs) book and came across "kmp algorithm" for string matching. I implemented it using Python (as-is).
However, it doesn't seem to work for some reason. where is my fault?
The code is given below:
def kmp_matcher(t,p):
n=len(t)
m=len(p)
# pi=[0]*n;
pi = compute_prefix_function(p)
q=-1
for i in range(n):
while(q>0 and p[q]!=t[i]):
q=pi[q]
if(p[q]==t[i]):
q=q+1
if(q==m):
print "pattern occurs with shift "+str(i-m)
q=pi[q]
def compute_prefix_function(p):
m=len(p)
pi =range(m)
pi[1]=0
k=0
for q in range(2,m):
while(k>0 and p[k]!=p[q]):
k=pi[k]
if(p[k]==p[q]):
k=k+1
pi[q]=k
return pi
t = 'brownfoxlazydog'
p = 'lazy'
kmp_matcher(t,p)
This is a class I wrote based on CLRs KMP algorithm, which contains what you are after. Note that only DNA "characters" are accepted here.
class KmpMatcher(object):
def __init__(self, pattern, string, stringName):
self.motif = pattern.upper()
self.seq = string.upper()
self.header = stringName
self.prefix = []
self.validBases = ['A', 'T', 'G', 'C', 'N']
#Matches the motif pattern against itself.
def computePrefix(self):
#Initialize prefix array
self.fillPrefixList()
k = 0
for pos in range(1, len(self.motif)):
#Check valid nt
if(self.motif[pos] not in self.validBases):
self.invalidMotif()
#Unique base in motif
while(k > 0 and self.motif[k] != self.motif[pos]):
k = self.prefix[k]
#repeat in motif
if(self.motif[k] == self.motif[pos]):
k += 1
self.prefix[pos] = k
#Initialize the prefix list and set first element to 0
def fillPrefixList(self):
self.prefix = [None] * len(self.motif)
self.prefix[0] = 0
#An implementation of the Knuth-Morris-Pratt algorithm for linear time string matching
def kmpSearch(self):
#Compute prefix array
self.computePrefix()
#Number of characters matched
match = 0
found = False
for pos in range(0, len(self.seq)):
#Check valid nt
if(self.seq[pos] not in self.validBases):
self.invalidSequence()
#Next character is not a match
while(match > 0 and self.motif[match] != self.seq[pos]):
match = self.prefix[match-1]
#A character match has been found
if(self.motif[match] == self.seq[pos]):
match += 1
#Motif found
if(match == len(self.motif)):
print(self.header)
print("Match found at position: " + str(pos-match+2) + ':' + str(pos+1))
found = True
match = self.prefix[match-1]
if(found == False):
print("Sorry '" + self.motif + "'" + " was not found in " + str(self.header))
#An invalid character in the motif message to the user
def invalidMotif(self):
print("Error: motif contains invalid DNA nucleotides")
exit()
#An invalid character in the sequence message to the user
def invalidSequence(self):
print("Error: " + str(self.header) + "sequence contains invalid DNA nucleotides")
exit()
You might want to try out my code:
def recursive_find_match(i, j, pattern, pattern_track):
if pattern[i] == pattern[j]:
pattern_track.append(i+1)
return {"append":pattern_track, "i": i+1, "j": j+1}
elif pattern[i] != pattern[j] and i == 0:
pattern_track.append(i)
return {"append":pattern_track, "i": i, "j": j+1}
else:
i = pattern_track[i-1]
return recursive_find_match(i, j, pattern, pattern_track)
def kmp(str_, pattern):
len_str = len(str_)
len_pattern = len(pattern)
pattern_track = []
if len_pattern == 0:
return
elif len_pattern == 1:
pattern_track = [0]
else:
pattern_track = [0]
i = 0
j = 1
while j < len_pattern:
data = recursive_find_match(i, j, pattern, pattern_track)
i = data["i"]
j = data["j"]
pattern_track = data["append"]
index_str = 0
index_pattern = 0
match_from = -1
while index_str < len_str:
if index_pattern == len_pattern:
break
if str_[index_str] == pattern[index_pattern]:
if index_pattern == 0:
match_from = index_str
index_pattern += 1
index_str += 1
else:
if index_pattern == 0:
index_str += 1
else:
index_pattern = pattern_track[index_pattern-1]
match_from = index_str - index_pattern
Try this:
def kmp_matcher(t, d):
n=len(t)
m=len(d)
pi = compute_prefix_function(d)
q = 0
i = 0
while i < n:
if d[q]==t[i]:
q=q+1
i = i + 1
else:
if q != 0:
q = pi[q-1]
else:
i = i + 1
if q == m:
print "pattern occurs with shift "+str(i-q)
q = pi[q-1]
def compute_prefix_function(p):
m=len(p)
pi =range(m)
k=1
l = 0
while k < m:
if p[k] <= p[l]:
l = l + 1
pi[k] = l
k = k + 1
else:
if l != 0:
l = pi[l-1]
else:
pi[k] = 0
k = k + 1
return pi
t = 'brownfoxlazydog'
p = 'lazy'
kmp_matcher(t, p)
KMP stands for Knuth-Morris-Pratt it is a linear time string-matching algorithm.
Note that in python, the string is ZERO BASED, (while in the book the string starts with index 1).
So we can workaround this by inserting an empty space at the beginning of both strings.
This causes four facts:
The len of both text and pattern is augmented by 1, so in the loop range, we do NOT have to insert the +1 to the right interval. (note that in python the last step is excluded);
To avoid accesses out of range, you have to check the values of k+1 and q+1 BEFORE to give them as index to arrays;
Since the length of m is augmented by 1, in kmp_matcher, before to print the response, you have to check this instead: q==m-1;
For the same reason, to calculate the correct shift you have to compute this instead: i-(m-1)
so the correct code, based on your original question, and considering the starting code from Cormen, as you have requested, would be the following:
(note : I have inserted a matching pattern inside, and some debug text that helped me to find logical errors):
def compute_prefix_function(P):
m = len(P)
pi = [None] * m
pi[1] = 0
k = 0
for q in range(2, m):
print ("q=", q, "\n")
print ("k=", k, "\n")
if ((k+1) < m):
while (k > 0 and P[k+1] != P[q]):
print ("entered while: \n")
print ("k: ", k, "\tP[k+1]: ", P[k+1], "\tq: ", q, "\tP[q]: ", P[q])
k = pi[k]
if P[k+1] == P[q]:
k = k+1
print ("Entered if: \n")
print ("k: ", k, "\tP[k]: ", P[k], "\tq: ", q, "\tP[q]: ", P[q])
pi[q] = k
print ("Outside while or if: \n")
print ("pi[", q, "] = ", k, "\n")
print ("---next---")
print ("---end for---")
return pi
def kmp_matcher(T, P):
n = len(T)
m = len(P)
pi = compute_prefix_function(P)
q = 0
for i in range(1, n):
print ("i=", i, "\n")
print ("q=", q, "\n")
print ("m=", m, "\n")
if ((q+1) < m):
while (q > 0 and P[q+1] != T[i]):
q = pi[q]
if P[q+1] == T[i]:
q = q+1
if q == m-1:
print ("Pattern occurs with shift", i-(m-1))
q = pi[q]
print("---next---")
print("---end for---")
txt = " bacbababaabcbab"
ptn = " ababaab"
kmp_matcher(txt, ptn)
(so this would be the correct accepted answer...)
hope that it helps.

Python - Getting an Identation error out of the file

I am trying to make a little program in python, nothing complicated, but extremely long. Just now, I modified one condition for an 'if' statement, and then ran it through the MacOS terminal, since it has a Python shell / IDLE (I don't know how is it called in english).
My document has exactly 456 lines, and the 'IndentationError' I get is at 'line 457' and here is the output :
File "/Volumes/my usb key/MAIN_0.3.py", line 457
^
IndentationError: expected an indented block
I really dont know what to do with that, since the last lines of my programs are all comments. If you want some code, I'll try to put it simply (and in english) for you all, but I would like to know first if it isn't a problem with running it in 'Terminal', because it is really weird.
EDIT : here is some code :
#coding= utf-8
#here I put a lot of variables(38), which are all 'int' or 'randint(x, y)'
#then I define some functions, which are all calculus
#here is the main loop :
while (a!=10) and (b > 10):
function_a(a)
c=0
while (c != 1) and (b > 0):
while b != 0:
print "\n"
d=randint(0,20)
if 0 <= d <= 3: #commentary explaining my program for my buddies at school
b=function_b(b, e, f, g, h, i, j, a, k, l)
if b <= 0: #commentary
m += n
p += a_b
if p > 1000: #commentary
p -= 1000
k += 1
print " BRAVO !"
print " now", k
time.sleep(1)
b += b_levelup
e += e_levelup
f += f_levelup
print " you won", b_levelup, "points"
time.sleep(1)
print " you won", e_levelup, "points"
time.sleep(1)
print " you won", f_levelup, "points"
time.sleep(1)
print "\n"*2
if 3 < d <= 8: #commentary
b=function_b(b, e, f, g, q, r, s, a, k, t)
if b <= 0: #commentary
m += u
p += v
if p > 1000: #
p -= 1000
k += 1
print " BRAVO !"
print " now", k
time.sleep(1)
b += b_levelup
e += e_levelup
f += f_levelup
print " you won", b_levelup, "points"
time.sleep(1)
print " you won", e_levelup, "points"
time.sleep(1)
print " you won", f_levelup, "points"
time.sleep(1)
print "\n"*2
if 8 < d <= 14: #commentary
b=function_b(b, e, f, g, w, x, y, a, z, k, a_a)
if b <= 0: #commentary
m += n
p += a_b
if p > 1000: #commentary
p -= 1000
k += 1
print " BRAVO !"
print " now", k
time.sleep(1)
b += b_levelup
e += e_levelup
f += f_levelup
print " you won", b_levelup, "points"
time.sleep(1)
print " you won", e_levelup, "points"
time.sleep(1)
print " you won", f_levelup, "points"
time.sleep(1)
print "\n"*2
if 15 <= d <= 16:#commentary
a_c += 1
function_c()
if d == 17: #commentary
a_d += 1
function_d()
#boss commentary
if (d == 18) and (a_d == 0):
print " mkay"
time.sleep(2)
print " nope"
print " next door"
#commentary
if (d == 18) and (a_d >= 1):
print " arrived"
time.sleep(2)
print " wanna go ?"
print " yes - 1"
print " No - any other"
a_e=input(" ")
if a_e == 1:
#boss commentary
Comments aren't statements, so when you do
if something:
# Comment
The if has no body. That's a syntax error. If you want a do-nothing placeholder body, that's what the pass statement is for.
if something:
# Comment
pass

Categories

Resources