FizzBuzz avec des expressions régulières etc. sans utiliser l'opérateur '%'

introduction

J'ai vérifié le module re en résolvant la 51e question du projet Oiler, donc j'écrirai le code FizzBuzz au lieu du mémorandum. Dans ce qui suit, j'ai essayé de (1) utiliser autant que possible des expressions régulières, et (2) d'éviter d'utiliser l'opérateur% même si je n'utilise pas d'expressions régulières.

Jugement des multiples de 3

Pour les multiples de 3, je ne pouvais pas penser à un jugement utilisant une expression régulière. Par conséquent, pour déterminer un multiple de 3, nous avons utilisé le fait que si la somme de chaque chiffre d'un multiple de 3 est répétée, le résultat final sera soit 3, 6 ou 9. Plus précisément, il a été décidé d'appeler récursivement jusqu'à ce que la somme devienne un chiffre. Quand il devient un chiffre, si le nombre est 3, 6 ou 9, il renvoie vrai, sinon il retourne faux.

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)))

Jugement des multiples de 5

Il est facile de déterminer un multiple de 5. En effet, le premier chiffre doit être 0 ou 5. C'est facile, donc je l'ai simplement fait en utilisant re. En guise de mise en garde, re.compile (). Match () ne frappe qu'au niveau du mot (il détermine s'il correspond au début du mot, utilisez donc re.compile (). Search () Il semble que vous deviez soit précéder la chaîne avec laquelle vous voulez frapper? *.

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

Remplacer à l'aide d'une expression régulière

Quand j'ai googlé "remplacer à l'aide d'expressions régulières", l'article sur re.sub () était affiché en haut. Si vous souhaitez utiliser des expressions régulières pour le remplacement de caractères, vous devez probablement utiliser re.sub.

Jugement des multiples de 15

S'il s'agit d'un multiple de 3 et d'un multiple de 5, il s'agit d'un multiple de 15, donc aucun jugement spécial n'a été porté. Cependant, j'ai essayé d'utiliser pleinement de petites astuces telles que l'ajout d'un blanc à la fin de "Fizz" et le remplacement du blanc par "Buzz". Si cela fonctionne, FizzBuzz devrait s'afficher correctement.

Code final

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

FizzBuzz avec des expressions régulières etc. sans utiliser l'opérateur '%'
Écrivez FizzBuzz sans utiliser "="
Extraire des nombres avec des expressions régulières
Mémorandum slackbot ~ Demande utilisant des expressions régulières ~
Gestion des expressions régulières par PHP / Python
Lors de l'utilisation d'expressions régulières en Python
Derrière le flyer: utiliser Docker avec Python
[Python] Arrondissez avec juste l'opérateur
Travailler avec OpenStack à l'aide du SDK Python
Remplacer non-ASCII par des expressions régulières en Python
Jouez avec Dajare en utilisant l'API COTOHA
Python: analyse morphologique simplifiée avec des expressions régulières
J'ai essayé Hello World avec un langage OS + C 64 bits sans utiliser de bibliothèque
Distinguer les chiffres et les lettres avec des expressions régulières
Pandas Python: recherchez DataFrame à l'aide d'expressions régulières
[Python] Débarrassez-vous de la datation avec des expressions régulières
Supprimer les chaînes supplémentaires dans l'URL avec une expression canonique
Modifiez la sortie sans toucher au code en utilisant Argparse