Ich habe aus irgendeinem Grund FizzBuzz erstellt, aber plötzlich fragte ich mich: "Was ist, wenn ich versuche, FizzBuzz so kurz wie möglich zu schreiben?"
Es mag ein allgemeiner Artikel auf der Straße sein, aber ich werde ihn für mein eigenes Studium schreiben.
Python 3.8.2
FizzBuzz
an, wenn die Zahl durch 3 und 5 teilbar ist.
--Wenn die Nummer nicht die oben angegebene ist, wird die aktuelle Nummer (Zeichenfolgentyp) angezeigt.
--Überprüfen Sie das Ergebnis auf dem Terminal und zeigen Sie jede Zahl / Zeichenfolge mit einem Zeilenumbruch an.FizzBuzz mit einer for-Anweisung, was im Allgemeinen so ist.
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)
Wie Python ist es sehr leicht zu sehen.
Da ich FizzBuzz und für Anweisung ver geschrieben habe. Mit while-Anweisung habe ich auch while-Anweisung ver geschrieben.
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
Die Anzahl der Zeichen ist 11 mehr als die for-Anweisung ver.
Es ist eine Schande, aber im Fall einer einfachen Wiederholungsoperation wie der obigen scheint die while-Anweisung langsamer zu sein, wenn die Ausführungsgeschwindigkeiten der for-Anweisung und der while-Anweisung verglichen werden.
Die while-Anweisung ist keine einfache Quelle wie FizzBuzz, aber wir verwenden sie an anderer Stelle (runder Wurf).
FizzBuzz mit dem ternären Operator konnte ich es in einem Satz schreiben, aber es war zu lang, also begann ich eine neue Zeile mit einem Doppelpunkt.
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)
Durch die Verwendung des ternären Operators ist der Ausdruck viel sauberer geworden.
Lassen Sie es uns mit dieser Bedingung immer kürzer halten.
Der ternäre Operator ist ein Operator, der häufig verwendet wird, wenn Sie einen bedingten Zweig wie eine if ~ else-Anweisung in einer Anweisung beschreiben möchten.
(Wert, wenn die Bedingung wahr ist) if (Bedingungen) else (BedingungenがFalseのときの値)
Die folgende if ~ else-Anweisung kann mit dem ternären Operator wie folgt geschrieben werden.
# if~sonst Aussage
if number == 0:
print("number is 0")
else:
print("number is NOT 0")
#Dreiecksoperator
print("number is 0" if number == 0 else "number is NOT 0")
Mit FizzBuzz können Sie mit ternären Operatoren und Generatorausdrücken eine Zeile zwangsweise anzeigen.
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)))
Durch die Verwendung in Kombination mit dem zuvor erwähnten ternären Operator konnte ich es ordentlich in einem Satz schreiben.
Lassen Sie uns diese Beschreibung als nächstes noch kürzer machen.
Als grobe Erklärung werde ich zur Erläuterung des Generatorausdrucks zunächst die Listeneinschlussnotation erläutern.
Die Listeneinschlussnotation ist eine Python-spezifische Beschreibung und lautet wie folgt.
print([i for i in range(0,10)]) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Wenn Sie die Listeneinschlussnotation und das Trennzeichen .join ([list]) verwenden, können Sie das Ergebnis so erhalten, als hätten Sie eine normale for-Anweisung verwendet.
print("\n".join([i for i in range(0,10)]))
Fahren wir auf der Grundlage des oben Gesagten mit dem Generatortyp fort.
Um es kurz zu erklären, befindet es sich in [] der Listeneinschlussnotation und dient dazu, eine Funktion in Klammern zu erstellen und sie zur Durchführung der Verarbeitung zu verwenden.
Mal sehen, was der Generatorausdruck zurückgibt.
print(i for i in range(0,10)) # <generator object <genexpr> at 0x000001C52B998BA0>
Da das obige Ausgabeergebnis "so etwas wie eine Funktion, die eine Liste zurückgibt" zurückgibt, können Menschen es nicht so verstehen, wie es ist.
Sie können das Ergebnis der Verwendung der normalen for-Anweisung jedoch erhalten, indem Sie das Trennzeichen .join ([list]) im Generatorausdruck sowie die Listeneinschlussnotation verwenden.
In diesem FizzBuzz ist die Anzahl der Zeichen bei Verwendung des Generatorausdrucks geringer als bei Verwendung der Listeneinschlussnotation. Daher wird dies übernommen und beschrieben.
FizzBuzz mit Generatortyp und Kurzschlussauswertung (Teilstringbetrieb) ist erheblich kürzer geworden.
print("\n".join("Fizz"*(i % 3 == 0)+"Buzz"*(i % 5 == 0)or str(i) for i in range(1, 101)))
Es ist sehr kurz, weniger als 100 Zeichen.
Das kürzeste FizzBuzz, bei dem ich ankam, war hier.
Als ich es jedoch nachgeschlagen habe, gab es eine kürzere Beschreibung von FizzBuzz (dem kürzesten der Welt), daher werde ich es als nächstes vorstellen.
Verwenden Sie im Fall dieser Beschreibung in "Fizz" * (i% 3 == 0) "und" Buzz "* (i% 5 == 0)" die Beschreibung von "Zeichenfolge * boolean". Ich tat.
In Python ist der Bool-Typ eine Unterklasse des Int-Typs, und die Bool-Typen "True" und "False" entsprechen "0" bzw. "1".
Es gibt auch eine Möglichkeit, einen String zu wiederholen: string * number (int)
.
Hier führt "ABC * 3" zu "ABCABCABC" und "ABC * 0" zu einem leeren Zeichen "" ".
Das heißt, wenn die zu beurteilende Zahl ein Vielfaches von 3 ist, ist der Boolesche Wert wahr und "Fizz * 1 => Fizz" wird angezeigt, und wenn es ein Vielfaches von 15 ist, "Fizz" * 1 + "Buzz" * 1 => "Fizz" + Buzz => "FizzBuzz" `.
In Bezug auf die Kurzschlussbewertung war die folgende Seite sehr gut organisiert (ich habe auch darauf hingewiesen).
Referenz: Logische Python-Operatoren und oder nicht (logisches Produkt, logische Summe, Ablehnung)
Einfach ausgedrückt, folgen die Rückgabewerte von und und oder einem festen Algorithmus, wie unten gezeigt.
Hier bedeutet die Beschreibung von x (wahr), dass "x selbst wahr ist".
x(wahr) and y(falsch) => y
x(falsch) and y(wahr) => x
x(wahr) or y(falsch) => x
x(falsch) or y(wahr) => y
x(wahr) and y(wahr) => y
x(falsch) and y(falsch) => x
x(wahr) or y(wahr) => x
x(falsch) or y(falsch) => y
Übrigens, wenn x oder y falsch ist, dann:
--Bool Typ False
Alles andere gilt als wahr.
Mit anderen Worten, in diesem Fall wird in der Formel "(" Fizz "* (i% 3 == 0) +" Buzz "* (i% 5 == 0) oder i" FizzBuzz durch die folgende Berechnung ermittelt. ..
--Wenn die zu beurteilende Zahl ein Vielfaches von 3 ist
"Fizz"*(i % 3 == 0)+"Buzz"*(i % 5 == 0)or i
=> "Fizz" + "" or i
=> "Fizz" or i
=> "Fizz"
--Wenn die zu beurteilende Zahl kein Vielfaches von 3, 5 oder 15 ist
"Fizz"*(i % 3 == 0)+"Buzz"*(i % 5 == 0)or i
=> "" or i
=> i
FizzBuzz, die kürzeste Beschreibung der Welt, ich habe die Beschreibung gemäß dieser Regel ein wenig geändert, aber sie ist überraschend kurz!
Referenz: Implementieren Sie FizzBuzz in 1 Byte> Python3 (59 Byte)
for i in range(100):print(i % 3//2*"Fizz"+i % 5//4*"Buzz"or -~i)
Es ist kurz. Ich habe diese Aussage nicht bemerkt, aber sie ist sehr einfach (anscheinend nur für und Druckanweisungen).
Die verwendeten Syntax / Techniken waren für Anweisung, Kurzschlussbewertung, Abschneiden / Teilen und Bitinversion.
Ich hatte Angst, als ich es zum ersten Mal sah, also ist es eine Ergänzung.
Durch Setzen von "i% 3 // 2" wird 0 zurückgegeben, wenn i 0 oder 1 ist, und 1 wird zurückgegeben, wenn i 2 ist.
Daher lautet die for-Anweisung "range (100)", nicht wahr?
Es scheint, dass dies und die Kurzschlussbewertung verwendet werden, um die gesamte Minute zu verkürzen.
Ich habe die Bitinversion mit dem Operator ~
verwendet.
Im Fall von Python scheint es, dass "~ x" zu "(x + 1)" wird, anstatt einfach den Wert zu invertieren.
Referenz: Einzelterm-Arithmetik- und Bit-für-Bit-Operationen
Wenn Sie also "- ~ x" schreiben, ist es "- (- (x + 1))", dh "(x + 1)", und der Bereich der for-Anweisung ist "range (100)". Es schien da zu sein.
Dies war eine gute Gelegenheit, den Generatortyp, die Kurzschlussauswertung, die Bitinversion usw. erneut zu bestätigen.
FizzBuzz ist tief!
Beim nächsten Mal möchte ich herausfinden, ob sich die Ausführungsgeschwindigkeit ändert, wenn die Anzahl der Zeichen in FizzBuzz abnimmt.
Recommended Posts