Python 2.7,2013年得分
该程序可用作参考,您可以采用以下代码并进行修改,然后将其发布到自己的解决方案中。
事后看来,我也许也应该使用正则表达式来处理报价,但是我认为在当前状态下,足以使人们开始陷入问题。
为什么选择Python 2.7:我认为测试起来是否更容易通过exec
关键字使程序崩溃。
此代码以形式接收程序in.txt
。
我认为我至少应该编写一个报价解析器(也可以处理评论),让想参与的人参与其中,并简要说明一下正则表达式与报价解析器结合可以如何真正改变游戏规则的例子。这个问题的复杂性。
注意:此缩小器仍有很大的改进空间。就像您可以使用缩进,变量名并在使用我的关键字(例如print
或)时删除括号一样yield
。
import re
with open("in.txt","r") as fi:
code = fi.read()
class QuoteHandler():
def __init__(self):
pass
def loadCode(self,code):
quoteFlag = False
currentQuoteChar = ""
ignoreNext = False
inEndLineComment=False
startLocation = 0
self.reAddStrings = []
outStr = ""
for i, character in enumerate(code):
if ignoreNext:
ignoreNext = False
elif inEndLineComment:
if character in "\r\n":
inEndLineComment=False
elif character == "#" and not quoteFlag:
inEndLineComment = True
elif character in "'\"" and (currentQuoteChar == character or not quoteFlag):
if quoteFlag:
self.reAddStrings.append(code[startLocation+1:i])
else:
currentQuoteChar = character
startLocation = i
quoteFlag = not quoteFlag
elif character == "\\":
ignoreNext = True
if not inEndLineComment and not quoteFlag:
outStr+=character
return outStr
def find_all_locations(self,substr,code):
return [m.start() for m in re.finditer(substr, code)]
def unloadCode(self,code):
temp = self.reAddStrings[::-1]
for i, location in enumerate(list(self.find_all_locations('"',code))[::-1]):
code = code[:location] + "\"" + temp[i] + code[location:]
return code
def applyRegexes(code):#\w here?
operatorRegexCleaner = ["([\d\/*\-\"=,'+{}:[\](\)])","[ \t]+","(\w)"]
regexes = [
[''.join(operatorRegexCleaner),r"\1\2"],
[''.join(operatorRegexCleaner[::-1]),r"\1\2"],#removes whitespace between operators
["\n\s*\n","\n"]#removes empty lines
]
for regex in regexes:
code = re.sub(regex[0],regex[1],code)
return code
qh = QuoteHandler()
code = qh.loadCode(code)
code = applyRegexes(code)
code = qh.unloadCode(code)
print(code)
exec(code)
程序输出:
def factor(factor_number):
for n in range(2,factor_number):
if factor_number % n==0:
yield(n)
def gcd(a,b):
"""Calculate the Greatest Common Divisor of a and b.
Unless b==0, the result will have the same sign as b (so that when
b is divided by it, the result comes out positive).
"""
while b:
a,b=b,a%b
return a
class Apricot:
def __init__(self):
self.mold=False
def get(self):
return self.mold
def update(self):
self.mold=not self.mold
def blue(self):return5
def tell_me_about_these_numbers(*a):
print("%d is the first number!" % a[0])
print("{} / 3 is {}".format(a[0],a[0]/3.))
myFavorate=Apricot()
for number in a:
print list(factor(number))
myFavorate.update()
print[gcd(a,b)for a,b in zip(a[:-1],a[1:])]
print(myFavorate.get())
tell_me_about_these_numbers(5,6,9,45,200)
print"Let's play with scope!"
a,b=10,9
def randomFunction(a):
print(a)
randomFunction(b)
print(a)
for a in range(100):
b+=a
print(a)
print(b)
li=[]
for i in range(10):
li.append(i*2)
print(li)
print([i*2for i in range(10)])
a=c=b=d=e=f=g=h=i=j=k=l=m=n=o=p=q=r=s=t=u=v=w=x=y=z=5
print(a)
a-=1
print(a)
g=10
print(str(10**g+5)[::-1])
def blue_fish(a):
def blue_fish(a):
def blue_fish(a):
return a
a+=1
return blue_fish(a)
a-=1
return blue_fish(a)
print(blue_fish(10))
def blue_fish(a):
if a==0:
return"0"
return"1" +blue_fish(a-1)
print(blue_fish(5))
blue_fish=lambda a,b,c:a*b*c
print(blue_fish(1,2,3))
blue_fish=lambda*a:reduce(lambda a,b:a*b,a)
print(blue_fish(1,2,3))
print(max([[6,1],[5,2],[4,3],[3,4],[2,5],[1,6]],key=lambda a:a[1]))
print(zip(*[[1],[2],[3],[4],[5]]))
print"Now let's test to see if you handle quotes correctly:"
print"test \'many diffent\' \"types of \" quotes, even with \' \" trailing quotes"
print"""
Multi line quotes are great too!
"""
a=""" ::
one more multi-line quote won't hurt
"""
print a