Ich habe versucht, Pythons FizzBuzz nach und nach zu verkürzen

Auslösen

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.

Umgebung

Python 3.8.2

FizzBuzz-Regeln

Teil 1 (zur Erklärung)

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)

Kommentar

Wie Python ist es sehr leicht zu sehen.

Teil 2 (while-Anweisung)

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

Kommentar

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

Teil 3 (ternärer Operator)

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)

Kommentar

Durch die Verwendung des ternären Operators ist der Ausdruck viel sauberer geworden.

Lassen Sie es uns mit dieser Bedingung immer kürzer halten.

Ergänzung: Über den ternären Operator

Falten Sie es, weil es eine Ergänzung ist.

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

Teil 4 (ternärer Operator, Generatorausdruck)

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

Kommentar

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.

Ergänzung: Generatortyp

Falten Sie es, weil es eine Ergänzung ist.

Als grobe Erklärung werde ich zur Erläuterung des Generatorausdrucks zunächst die Listeneinschlussnotation erläutern.

  • Entschuldigung für diejenigen, die die Details der Generatorformel wissen möchten, aber versuchen Sie es bitte mit Google mit "List Inclusion Notation", "Generator" usw.

Listeneinschlussnotation

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.

Generatortyp

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.

  • In der Listeneinschlussnotation kann der Inhalt von Menschen verstanden werden, indem der Rückgabewert des Generatorausdrucks in der Liste [] empfangen wird.

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.

Teil 5 (Generatortyp, Zeichenkettenbetrieb, Kurzschlussauswertung)

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

Kommentar

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.

Ergänzung: String-Operation

Falten Sie es, weil es eine Ergänzung ist.

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" `.

Ergänzung: Kurzschlussauswertung

Falten Sie es, weil es eine Ergänzung ist.

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

  • None --Numerische Werte (Int-Typ und Float-Typ) 0, 0.0 --Leerer String''
  • Leere Container (Listen, Tapples, Wörterbücher usw.) [], (), {},

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"

  • "Fizz" wird als wahr angesehen, da "" nicht leer ist und "Fizz" vom Algorithmus "x (wahr)" oder "y (wahr) => x" zurückgegeben wird.

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

  • Wegen "" wird es als falsch angesehen und i wird vom Algorithmus von "x (falsch) oder y (wahr) => y" zurückgegeben.

Teil 6: Die kürzeste Beschreibung der Welt FizzBuzz (für Anweisung, Kurzschlussauswertung, Bitinversion)

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)

Kommentar

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.

Ergänzung: Kürzungsteilung

Falten Sie es, weil es eine Ergänzung ist.

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.

Ergänzung: Bitinversion

Falten Sie es, weil es eine Ergänzung ist.

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.

Zusammenfassung

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

Ich habe versucht, Pythons FizzBuzz nach und nach zu verkürzen
Ich habe versucht, die Blasensortierung nach Sprache zu programmieren
Ich habe versucht zu kratzen
Ich habe versucht, durch Schaben ein Bild zu bekommen
Ich habe PyQ ausprobiert
Ich habe versucht, FX technische Analyse von AI "scikit-learn"
Ich habe AutoKeras ausprobiert
Ich habe versucht, Pythons GUI-Bibliothek "PySimple GUI" zu berühren.
Ich habe versucht, Pythons "*" - Zeichen in einer anderen Sprache auszugeben
Ich habe es mit Papiermühle versucht
Ich habe versucht, Django-Slack
Ich habe es mit Django versucht
Ich habe es mit Spleeter versucht
Ich habe es mit cgo versucht
Ich habe versucht, Drachenkugeln nach Adalin zu klassifizieren
Ich habe versucht, die Anzahl durch Programmieren zu erhöhen oder zu verringern
Ich habe versucht, parametrisiert zu verwenden
Ich habe versucht, Argparse zu verwenden
Ich habe versucht, Mimesis zu verwenden
Ich habe versucht, Pymc auszuführen
Ich habe ARP-Spoofing ausprobiert
Ich habe versucht, aiomysql zu verwenden
Ich habe versucht, Summpy zu verwenden
Ich habe Python> autopep8 ausprobiert
Ich habe versucht, Pipenv zu verwenden
Ich habe versucht, Matplotlib zu verwenden
Ich habe versucht, ESPCN zu verwenden
Ich habe PyCaret2.0 (pycaret-nightly) ausprobiert.
Ich habe versucht, openpyxl zu verwenden
Ich habe versucht, tief zu lernen
Ich habe AWS CDK ausprobiert!
Ich habe versucht, Ipython zu verwenden
Ich habe versucht zu debuggen.
Ich habe versucht, PyCaret zu verwenden
Ich habe versucht, Cron zu verwenden
Ich habe Kivys Kartenansicht ausprobiert
Ich habe versucht, ngrok zu verwenden
Ich habe versucht, face_recognition zu verwenden
Ich habe versucht, Jupyter zu verwenden
Ich habe versucht, EfficientDet zu verschieben
Ich habe versucht, Shell zu programmieren
Ich habe versucht, doctest zu verwenden
Ich habe Python> Decorator ausprobiert
Ich habe versucht, TensorFlow auszuführen
Ich habe versucht, Folium zu verwenden
Ich habe versucht, jinja2 zu verwenden
Ich habe AWS Iot ausprobiert
Ich habe die Bayes'sche Optimierung ausprobiert!
Ich habe versucht, Folium zu verwenden
Ich habe versucht, das Zeitfenster zu verwenden
Ich habe versucht, die Erkennung von Anomalien durch spärliches Strukturlernen zu implementieren
Ich habe versucht, die Videoerstellung durch parallele Verarbeitung zu beschleunigen
[Einführung in die Simulation] Ich habe versucht, durch Simulation einer Koronainfektion zu spielen ♬
[Django] Ich habe versucht, Zugriffsbeschränkungen durch Klassenvererbung zu implementieren.
[Einführung in Pandas] Ich habe versucht, die Austauschdaten durch Dateninterpolation zu erhöhen ♬
Ich habe versucht, MNIST nach GNN zu klassifizieren (mit PyTorch-Geometrie).
Ich habe ein wenig versucht, das Verhalten der Zip-Funktion