Je créais FizzBuzz pour une raison quelconque, mais je me suis soudainement demandé: "Et si j'essayais d'écrire FizzBuzz aussi court que possible?"
C'est peut-être un article courant dans les rues, mais je l'écrirai pour ma propre étude.
Python 3.8.2
FizzBuzz
si le nombre est divisible par 3 et 5.FizzBuzz avec une instruction for, qui est généralement celle-ci.
--Nombre de caractères: 212 caractères
for i in range(1, 101):
if ((i % 3 == 0) & (i % 5 == 0)):
print("FizzBuzz")
elif (i % 5 == 0):
print("Buzz")
elif (i % 3 == 0):
print("Fizz")
else:
print(i)
Comme Python, c'est très facile à voir.
Depuis que j'ai écrit FizzBuzz et pour statement ver. En utilisant la déclaration while, j'ai également écrit while statement ver.
--Nombre de caractères: 223 caractères
i = 1
while(i < 101):
if ((i % 3 == 0) & (i % 5 == 0)):
print("FizzBuzz")
elif (i % 5 == 0):
print("Buzz")
elif (i % 3 == 0):
print("Fizz")
else:
print(i)
i += 1
Le nombre de caractères est 11 de plus que l'instruction for ver.
C'est dommage, mais dans le cas d'une simple opération répétitive comme celle ci-dessus, l'instruction while semble être plus lente lorsque l'on compare les vitesses d'exécution de l'instruction for et de l'instruction while.
L'instruction while n'est pas une source simple comme FizzBuzz, mais jouons un rôle actif à un autre endroit (lancer rond).
FizzBuzz en utilisant l'opérateur ternaire, je pouvais l'écrire en une phrase, mais c'était trop long, j'ai donc commencé une nouvelle ligne avec un deux-points.
--Nombre de caractères: 126
for i in range(1, 101):
print("FizzBuzz" if (i % 15 == 0) else "Buzz" if (i % 5 == 0) else "Fizz" if (i % 3 == 0) else i)
En utilisant l'opérateur ternaire, l'expression est devenue beaucoup plus propre.
Gardons-le de plus en plus court avec cette condition.
L'opérateur ternaire est un opérateur souvent utilisé lorsque vous souhaitez décrire une branche conditionnelle telle qu'une instruction if ~ else dans une instruction.
(Valeur lorsque la condition est vraie) if (conditions) else (conditionsがFalseのときの値)
L'instruction if ~ else suivante peut être écrite en utilisant l'opérateur ternaire comme suit.
# if~autre déclaration
if number == 0:
print("number is 0")
else:
print("number is NOT 0")
#Opérateur triangulaire
print("number is 0" if number == 0 else "number is NOT 0")
FizzBuzz en utilisant l'opérateur ternaire et l'expression du générateur, vous pouvez afficher de force une ligne.
--Nombre de caractères: 130 caractères (car il dépasse 80 caractères, une pause est en fait nécessaire)
print("\n".join("FizzBuzz" if i % 15 == 0 else "Buzz" if i % 5 == 0 else "Fizz" if i % 3 == 0 else str(i) for i in range(1, 101)))
En l'utilisant en combinaison avec l'opérateur ternaire mentionné précédemment, j'ai pu l'écrire proprement en une phrase.
Rendons cette description encore plus courte ensuite.
En guise d'explication approximative, afin d'expliquer l'expression du générateur, je vais d'abord expliquer la notation d'inclusion de liste.
notation d'inclusion de liste
, générateur
, etc.La notation d'inclusion de liste est une description spécifique à Python et se présente comme suit.
print([i for i in range(0,10)]) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
En utilisant la notation d'inclusion de liste et le separator .join ([list])
, vous pouvez obtenir le résultat comme si vous utilisiez une instruction for normale.
print("\n".join([i for i in range(0,10)]))
Sur la base de ce qui précède, passons au type de générateur.
Pour expliquer brièvement, il est dans [] de la notation d'inclusion de liste, et il s'agit de créer une fonction entre parenthèses et de l'utiliser pour effectuer le traitement.
Voyons ce que renvoie l'expression du générateur.
print(i for i in range(0,10)) # <generator object <genexpr> at 0x000001C52B998BA0>
Puisque le résultat de sortie ci-dessus renvoie "quelque chose comme une fonction qui renvoie une liste", les humains ne peuvent pas le comprendre tel quel.
Cependant, vous pouvez obtenir le résultat de l'utilisation de l'instruction for normale en utilisant le separator .join ([list])
dans l'expression du générateur ainsi que la notation d'inclusion de liste.
Dans ce FizzBuzz, le nombre de caractères est plus petit lors de l'utilisation de l'expression du générateur que lors de l'utilisation de la notation d'inclusion de liste, donc ceci est adopté et décrit.
FizzBuzz utilisant le type de générateur et l'évaluation des courts-circuits (fonctionnement de chaîne partielle) est devenu considérablement plus court.
print("\n".join("Fizz"*(i % 3 == 0)+"Buzz"*(i % 5 == 0)or str(i) for i in range(1, 101)))
C'est très court, moins de 100 caractères.
Le FizzBuzz le plus court auquel je suis arrivé était ici.
Cependant, lorsque je l'ai recherché, il y avait une description plus courte de FizzBuzz (la plus courte du monde), je vais donc la présenter ensuite.
Dans le cas de cette description, dans " Fizz "* (i% 3 == 0)
et " Buzz "* (i% 5 == 0)
, utilisez la description de chaîne de caractères * boolean
. J'ai fait.
En Python, le type booléen est une sous-classe du type int, et les types booléens «True» et «False» sont respectivement équivalents à «0» et «1».
Il existe également un moyen de répéter une chaîne: string * number (int)
.
Ici, ʻABC * 3 est ʻABCABCABC
, et ʻABC * 0 est un caractère vide
"" `.
Autrement dit, si le nombre à juger est un multiple de 3, booléen est vrai et Fizz * 1 => Fizz
s'affiche, et s'il est un multiple de 15,"Fizz" * 1 + "Buzz" * 1 => "Fizz" + Buzz => "FizzBuzz"
.
En ce qui concerne l'évaluation des courts-circuits, le site suivant était très bien organisé (j'y ai aussi fait référence).
Référence: opérateurs logiques Python et, ou, non (produit logique, somme logique, refus)
En termes simples, les valeurs de retour de et et ou suivent un algorithme fixe, comme indiqué ci-dessous.
Ici, la description de x (vrai) signifie que «x lui-même est vrai».
x(vrai) and y(faux) => y
x(faux) and y(vrai) => x
x(vrai) or y(faux) => x
x(faux) or y(vrai) => y
x(vrai) and y(vrai) => y
x(faux) and y(faux) => x
x(vrai) or y(vrai) => x
x(faux) or y(faux) => y
À propos, si x ou y est faux, alors:
--Type de booléen False
Tout le reste est considéré comme vrai.
En d'autres termes, dans ce cas, dans la formule (" Fizz "* (i% 3 == 0) +" Buzz "* (i% 5 == 0) ou i
, FizzBuzz est établi par le calcul suivant. ..
--Lorsque le nombre à juger est un multiple de 3
"Fizz"*(i % 3 == 0)+"Buzz"*(i % 5 == 0)or i
=> "Fizz" + "" or i
=> "Fizz" or i
=> "Fizz"
x (true) ou y (true) => x
.--Lorsque le nombre à juger n'est pas un multiple de 3, 5 ou 15
"Fizz"*(i % 3 == 0)+"Buzz"*(i % 5 == 0)or i
=> "" or i
=> i
x (faux) ou y (vrai) => y
.FizzBuzz, la description la plus courte au monde, j'ai un peu changé la description selon cette règle, mais elle est étonnamment courte!
Référence: Implémenter FizzBuzz en 1 octet> Python3 (59 octets)
--Nombre de caractères: 64 caractères
for i in range(100):print(i % 3//2*"Fizz"+i % 5//4*"Buzz"or -~i)
C'est court. Je n'ai pas remarqué cette déclaration, mais c'est très simple (apparemment uniquement pour et imprimer les déclarations).
La syntaxe / les techniques utilisées étaient pour l'instruction, l'évaluation des courts-circuits, la troncature / division et l'inversion de bits.
J'avais peur quand je l'ai vu pour la première fois, c'est donc un supplément.
En définissant ʻi% 3 // 2`, 0 est renvoyé si i est 0 ou 1, et 1 est renvoyé si i est 2.
Par conséquent, l'instruction for est «range (100)», n'est-ce pas?
Il semble que cela et l'évaluation du court-circuit soient utilisés pour raccourcir la minute entière.
J'utilisais l'inversion de bits avec l'opérateur ~
.
Dans le cas de Python, il semble que ~ x
devienne- (x + 1)
, pas simplement la valeur avec les bits inversés.
Référence: opérations arithmétiques et bit par bit sur un seul terme
Par conséquent, si vous écrivez - ~ x
, ce sera - (- (x + 1))
, c'est-à-dire (x + 1)
, et la plage de l'instruction for serarange (100)
. Cela semblait être là.
C'était une bonne occasion de reconfirmer le type de générateur, l'évaluation des courts-circuits, l'inversion des bits, etc.
FizzBuzz est profond!
La prochaine fois, j'aimerais savoir si la vitesse d'exécution changera si le nombre de caractères dans FizzBuzz diminue.