Ich habe das Modul re überprüft, während ich die 51. Frage von Project Oiler gelöst habe, daher werde ich den FizzBuzz-Code anstelle des Memorandums schreiben. Im Folgenden habe ich versucht, (1) so viele reguläre Ausdrücke wie möglich zu verwenden und (2) den% -Operator nicht zu verwenden, auch wenn ich keine regulären Ausdrücke verwende.
Für ein Vielfaches von 3 konnte ich mir kein Urteil mit einem regulären Ausdruck vorstellen. Um das Vielfache von 3 zu bestimmen, haben wir daher die Tatsache verwendet, dass das Endergebnis entweder 3, 6 oder 9 ist, wenn die Summe jeder Ziffer des Vielfachen von 3 wiederholt wird. Insbesondere wurde beschlossen, rekursiv anzurufen, bis die Summe eine Ziffer wurde. Wenn es eine Ziffer wird und die Zahl 3, 6 oder 9 ist, gibt es true zurück, andernfalls false.
def is_multiple_of_3(n):
if len(str(n)) == 1:
if str(n) in ['3', '6', '9']:
return True
else:
return False
else:
return is_multiple_of_3( reduce(lambda x,y:int(x)+int(y), str(n)))
Das Bestimmen eines Vielfachen von 5 ist einfach. Dies liegt daran, dass die erste Ziffer 0 oder 5 sein sollte. Es ist einfach, also habe ich es einfach mit re gemacht. Als Einschränkung trifft re.compile (). Match () nur auf Wortebene (es bestimmt, ob es vom Wortanfang an übereinstimmt, verwenden Sie also re.compile (). Search () Es scheint, dass Sie entweder der Zeichenfolge vorangehen müssen, mit der Sie schlagen möchten? *.
def is_multiple_of_5(n):
#p = re.compile('(5|0)$')
p = re.compile('\d*(5|0)$')
if p.match(str(n)):
return True
else:
return False
Als ich "Ersetzen durch reguläre Ausdrücke" googelte, wurde der Artikel über re () oben angezeigt. Wenn Sie reguläre Ausdrücke zum Ersetzen von Zeichen verwenden möchten, müssen Sie wahrscheinlich re sub verwenden.
Wenn es ein Vielfaches von 3 und ein Vielfaches von 5 ist, ist es ein Vielfaches von 15, so dass keine besondere Beurteilung vorgenommen wurde. Ich habe jedoch versucht, kleine Tricks wie das Hinzufügen eines Rohlings am Ende von "Fizz" und das Ersetzen des Rohlings durch "Buzz" voll auszunutzen. Wenn dies funktioniert, sollte FizzBuzz ordnungsgemäß angezeigt werden.
import re
def is_multiple_of_3(n):
if len(str(n)) == 1:
if str(n) in ['3', '6', '9']:
return True
else:
return False
else:
return is_multiple_of_3( reduce(lambda x,y:int(x)+int(y), str(n)))
def is_multiple_of_5(n):
#p = re.compile('(5|0)$')
p = re.compile('\d*(5|0)$')
if p.match(str(n)):
return True
else:
return False
def main():
for n in range(1,101):
ret = str(n)
if is_multiple_of_3(n):
ret = re.sub('\d+', 'Fizz ', ret)
if is_multiple_of_5(n):
ret = re.sub('(\d+|\ )', 'Buzz', ret)
ret.strip(' ')
print ret
main()
Recommended Posts