S-Zade
Haziran 11, 2020, 11:00ös
1
Başlığa ne yazacağımı pek bilemedim
Konu şu internette şöyle bir örnek buldum yapmak için
Create a function that returns true if a given inequality
expression is correct and false otherwise.
Examples
correct_signs("3 < 7 < 11") ➞ True
correct_signs("13 > 44 > 33 > 1") ➞ False
correct_signs("1 < 2 < 6 < 9 > 3") ➞ True
bunun için şöyle bir kod yazdım ama sanki daha pratik olabilir di gibi me geliyor ondan sizinde bi fikrinizi alam dedim
def correct_signs(deg):
giris=0
beg=0
volumes=[]
signs=[]
try:
while True:
mi=deg.find("<",beg)
bi=deg.find(">",beg)
# print(mi,bi,beg)
if bi==-1 and mi==-1 and giris==0:
print("You should enter siign")
# print("0")
break
elif mi<=bi and mi!=-1 and bi!=-1 :
volumes.append(int(deg[:deg.find("<",beg)]))
signs.append("<")
beg=deg.find("<",beg)+1
deg=deg[beg:]
beg=0
# print("1")
elif bi<=mi and bi!=-1 and mi!=-1:
volumes.append(int(deg[:deg.find(">",beg)]))
signs.append(">")
beg=deg.find(">",beg)+1
deg=deg[beg:]
beg=0
# print("5")
elif bi!=-1 and mi==-1:
volumes.append(int(deg[:deg.find(">",beg)]))
signs.append(">")
beg=deg.find(">",beg)+1
deg=deg[beg:]
beg=0
# print("3")
elif mi!=-1 and bi==-1:
volumes.append(int(deg[:deg.find("<",beg)]))
signs.append("<")
beg=deg.find("<",beg)+1
deg=deg[beg:]
beg=0
# print("4")
elif bi==-1 and mi==-1:
volumes.append(int(deg))
deg=""
break
giris+=1
a=0
b=1
bol=True
print(volumes)
print(signs)
while a<len(volumes)-1:
# print(a,b)
if signs[a]=="<":
if volumes[a]<volumes[b]:
pass
else:
bol=False
elif signs[a]==">":
if volumes[a]>volumes[b]:
pass
else:
bol=False
else:
print("Wow")
a+=1
b+=1
print(bol)
except ValueError:
print("There is some problem with your number")
correct_signs("12 < 45 > 12 < 45")
correct_signs("25<13>4846>456")
correct_signs("1181546>1563>1516<1566813")
evil
kullanmaya izin var mı?
def correct_signs(deg): return eval(deg)
print(correct_signs("3 < 7 < 11"))
print(correct_signs("13 > 44 > 33 > 1"))
print(correct_signs("1 < 2 < 6 < 9 > 3"))
Hatta aşağıdaki kontrolu ekleyelim de, fonksiyonun evil
yanını törpüleyelim.
def correct_signs(deg):
if all(i.isnumeric() or i in "< >." for i in deg):
return eval(deg)
3 Beğeni
S-Zade
Haziran 12, 2020, 6:44öö
4
Çok mantıklı eval kullanmak benim aklıma bile gelmemişti
evil
yanlarından dolayı sanırsam
1 Beğeni
Şunun gibi bir şey programa OverflowError
verdirir:
>>> def correct_signs(deg):
if all(i.isnumeric() or i in "< >." for i in deg):
return eval(deg)
>>> import sys
>>> sys.getsizeof(1)
28
>>> sys.getsizeof(1<<10)
28
>>> sys.getsizeof(1<<100)
40
>>> sys.getsizeof(1<<1000)
160
>>> correct_sign("1<<999999999999999999999999999999999999999999999")
3 Beğeni
evil nedir? O eval degilmi?
Şöyle bir kod hem daha modüler hem de daha okunaklı olur:
class Parser():
def __init__(self, text):
self.text = text
self.index = 0
self.state = "number"
def _cmp(self, c1, c2, o):
if o == "<":
return c1 < c2
elif o == ">":
return c1 > c2
def eval(self):
first = self.next_token()
operator = self.next_token()
second = self.next_token()
while True:
try:
if not self._cmp(first, second, operator):
return False
first = second
operator = self.next_token()
second = self.next_token()
except EOFError:
break
return True
def next_token(self):
try:
self.pass_spaces()
if self.state == "number":
self.state = "operand"
return self.get_integer()
elif self.state == "operand":
self.state = "number"
return self.get_operand()
except IndexError:
if self.state == "operand":
raise EOFError()
else:
raise SyntaxError("Unexpected EOF.")
def pass_spaces(self):
while self.text[self.index] == " ":
self.index += 1
def get_integer(self):
s = ""
try:
while self.text[self.index].isnumeric():
s += self.text[self.index]
self.index += 1
except IndexError:
pass
if s:
return int(s)
else:
raise SyntaxError(f"Invalid char at {self.index}: {self.text[self.index]!r}")
def get_operand(self):
if self.text[self.index] in ("<", ">"):
self.index += 1
return self.text[self.index -1]
else:
raise SyntaxError(f"Invalid char at {self.index}: {self.text[self.index]!r}")
def evaluate(text):
return Parser(text).eval()
assert evaluate("3 < 7 < 11") == True
assert evaluate("13 > 44 > 33 > 1") == False
assert evaluate("1 < 2 < 6 < 9 > 3") == True
2 Beğeni
aib
Haziran 13, 2020, 11:41öö
9
Ben olsam once tokenize edip integer’lari parse eden bir fonksiyon yazardim:
"1 < 2 < 6 < 9 > 3"
→ [1, LT, 2, LT, 6, LT, 9, GT, 3]
veya → [1, '<', 2, '<', 6, '<', 9, '>', 3]
Sonra bunlari alip ikili ifadelere ceviren bir tane:
[1, '<', 3, '>', 5]
→ [[1, '<', 3], [3, '>', 5]]
Sonra ikili ifade cozen bir tane:
[1, '<', 3]
→ True
[3, '>', 5]
→ False
Cozum: all(map(evaluateBinaryExpression, toBinaryExpressions(tokenizeAndParseInt(expr))))
2 Beğeni
S-Zade
Haziran 13, 2020, 6:59ös
10
Hocam senin ki benim için fazla düzenli olmuş birde sorumsu şeyde fonksiyon dedi diye sınıf olşturmadı idim ama ben hiç bitürlü bu kadan düzenli yazamazdım
S-Zade
Haziran 13, 2020, 7:00ös
11
Sizin ki de çok mantıklı öyle bir şey yazmayı denicem