Erfahren Sie mehr über Spezifikationen, während Sie FizzBuzz verkürzen, das in Java geschrieben wurde

Ich werde es vorerst schreiben

class FizzBuzz{
    public static void main(String[] args){
        for(int i = 1; i <= 100; ++i){
            if(i % 3 == 0 && i % 5 == 0){
                System.out.println("FizzBuzz");
            }else if(i % 3 == 0){
                System.out.println("Fizz");
            }else if(i % 5 == 0){
                System.out.println("Buzz");
            }else{
                System.out.println(i);
            }
        }
    }
}

Versuchen Sie zu verkürzen

Derzeit scheint der kürzeste Java-Quellcode für FizzBuzz 96 Byte zu sein. Kürzen wir es, weil es eine große Sache ist (was?).


Mit bedingten Operatoren kürzen

class FizzBuzz{
    public static void main(String[] args){
        for(int i = 1; i <= 100; ++i){
            System.out.println(((i % 3 == 0 && i % 5 == 0) ? "FizzBuzz" : ((i % 5 == 0) ? "Buzz" : ((i % 3 == 0) ? "Fizz" : i + ""))));
        }
    }
}

Der Code ist bequem und leicht zu lesen, wenn Sie bei der Verwendung keinen Fehler machen. (Obwohl ich unterschiedliche Geschmäcker habe) Die oben genannte Verwendung ist jedoch in jeder Hinsicht übertrieben. Tun Sie dies daher nur, wenn Sie einen bestimmten Grund haben.


Entwickeln Sie einen Algorithmus

Dies ist eine Frage der reinen Idee oder nicht. Tägliches Training und Sinn sind wichtig. Ich denke, Sie sollten viel guten Code lesen und selbst viel Code schreiben.


Entwickeln Sie einen Algorithmus

Code bis Java 1.4 (JLS 2nd Edition)

class FizzBuzz{
    public static void main(String[] args){
        for(int i = 1; i <= 100; ++i){
            System.out.println((i % 3 > 0 ? "" : "Fizz") + (i % 5 > 0 ? (i % 3 > 0 ? i + "" : "") : "Buzz"));
        }
    }
}

Entwickeln Sie einen Algorithmus

Java5 (JLS 3rd Edition) und späterer Code

class FizzBuzz{
    public static void main(String[] args){
        for(int i = 1; i <= 100; ++i){
            System.out.println((i % 3 > 0 ? "" : "Fizz") + (i % 5 > 0 ? (i % 3 > 0 ? i : "") : "Buzz"));
        }
    }
}

Was ist der Unterschied?


Klammern reduzieren

class FizzBuzz{
    public static void main(String[] args){
        for(int i = 1; i <= 100; ++i)
            System.out.println((i % 3 > 0 ? "" : "Fizz") + (i % 5 > 0 ? i % 3 > 0 ? i : "" : "Buzz"));
    }
}

Inkrementspezifikationen

class FizzBuzz{
    public static void main(String[] args){
        for(int i = 0; ++i < 101;)
            System.out.println((i % 3 > 0 ? "" : "Fizz") + (i % 5 > 0 ? i % 3 > 0 ? i : "" : "Buzz"));
    }
}

Fertig

class F{public static void main(String[]a){for(int i=0;++i<101;)System.out.println((i%3>0?"":"Fizz")+(i%5>0?i%3>0?i:"":"Buzz"));}}

Entfernen Sie zusätzliche Leerzeichen und Zeilenumbrüche, um die Variable zu einem einzelnen Zeichen zu machen. Anständig? Diese 130 Bytes sind die Grenze im Quellcode. Vielleicht.


Vielen Dank für den Moment


Ein wenig beiseite

Ich habe eine Array-Deklaration dank Kurzcodierung

String[]a

Mir ist aufgefallen, dass ich schreiben kann, indem ich so zusammenhalte. Ebenfalls

String

[]

a

Es spielt keine Rolle, ob Sie es so zerlegen.

Nun, ich wähle und benutze das Array heutzutage nicht mehr alleine ...


Straße zu 96 Bytes

Am Anfang habe ich gesagt, dass der kürzeste 96 Byte beträgt, im vorherigen Code jedoch 130 Byte. Tatsächlich ist es unter besonderen Bedingungen immer noch kürzer.


Nutzen Sie Fehler

Es scheint, dass VMs bis zu einer bestimmten Version ein Problem haben und es möglich war, Zeichen ohne die Hauptmethode auszugeben. (Mit der aktuellen VM sollte nichts ohne die Hauptmethode funktionieren.)


Statischer Initialisierer

class F{static{for(int i=0;++i<101;)System.out.println((i%3>0?"":"Fizz")+(i%5>0?i%3>0?i:"":"Buzz"));}}

Es wurden 102 Bytes. VMs bis zu einer bestimmten Version scheinen im statischen Initialisierer früher als in den ursprünglichen VM-Spezifikationen angegeben ausgeführt zu werden, und es scheint, dass sogar ein solcher Code ausgeführt wird. Für diesen Code ärgere ich mich, nachdem es FizzBuzz ausgeführt hat, dass es keine Hauptmethode gibt.

Ein statischer Initialisierer ist übrigens ein statisch deklarierter Codeblock, der beim Laden einer Klasse nur einmal ausgeführt wird. Bitte googeln Sie, wie man es benutzt.


Enum- und Instanzinitialisierer

enum F{A;{for(int i=0;++i<101;)System.out.println((i%3>0?"":"Fizz")+(i%5>0?i%3>0?i:"":"Buzz"));}}

Es wurden 97 Bytes.


enum

Lesen Sie am besten Effective Java 2nd Edition für Java. kein Zweifel. In Bezug auf den obigen Code werden die folgenden Eigenschaften verwendet.

--enum ist auch eine Art Klasse


Instanzinitialisierer

Ein Instanzinitialisierer ist ein Codeblock, der beim Erstellen einer Instanz nur einmal ausgeführt wird. Wird vor dem Konstruktor aufgerufen. Bitte googeln Sie, wie man es benutzt. Ich glaube nicht, dass es viele Möglichkeiten gibt, es zu nutzen.


Feld hat Standardwert

enum F{A;int i;{for(;++i<101;)System.out.println((i%3>0?"":"Fizz")+(i%5>0?i%3>0?i:"":"Buzz"));}}

Die letzte 1 Byte wurde mithilfe der Eigenschaft reduziert, dass das Feld einen Standardwert hat (int ist 0), sodass Sie nicht explizit 0 zuweisen müssen.


Zusammenfassung

Durch kurze Codierung mit FizzBuzz

Ich konnte die Spezifikationen von lernen. Obwohl es FizzBuzz ist, kann man es nicht unterschätzen! !!


Danke für deine harte Arbeit

Recommended Posts

Erfahren Sie mehr über Spezifikationen, während Sie FizzBuzz verkürzen, das in Java geschrieben wurde
FizzBuzz in Java
Über die Verwirrung beim Starten von Java-Servern
Über die Idee anonymer Klassen in Java
Eine Geschichte über das JDK in der Java 11-Ära
Denken Sie an das JAVA = JAVAscript-Problem (wird in Zukunft benötigt).
Denken Sie über die Unterschiede zwischen Funktionen und Methoden nach (in Java)
Über Java Abstract Class
Greifen Sie mit Java auf die Netzwerkschnittstelle zu
Errate den Zeichencode in Java
Über das Symbol <%%> in Rails erb
Erfahren Sie mehr über Transaktionssicherungspunkte (mit Java)
Geben Sie den Java-Speicherort in eclipse.ini an
Wie man JAVA in 7 Tagen lernt
Entpacken Sie die Zip-Datei in Java
Informationen zur aktuellen Entwicklungsumgebung (Java 8)
Analysieren der COTOHA-API-Syntaxanalyse in Java
Informationen zur Dateikopierverarbeitung in Java
Rufen Sie die Super-Methode in Java auf
Eine Geschichte über ein in Java geschriebenes Spring Boot-Projekt, das Kotlin unterstützt
[Einführung in Ruby] Über die Rolle von true und break in der while-Anweisung
Über das Phänomen, dass StackOverflowError bei der Verarbeitung mit regulären Java-Ausdrücken auftritt
Informationen zum Zurückgeben einer Referenz in einem Java Getter
Holen Sie sich das Ergebnis von POST in Java
Erraten Sie das Java Persistence Framework 2017 (3) Reladomo
Spring Autowired wird im Konstruktor geschrieben
Java-Referenz zum Verständnis in der Abbildung
Versuchen Sie es mit der Stream-API in Java
Rufen Sie die Windows-Benachrichtigungs-API in Java auf
Über das Verfahren, damit Java funktioniert
[Erstellen] Ein Memorandum über das Codieren in Java
Über das neue Release-Modell von Java @ Seki Java (20.07.2018)
Ich habe das neue Yuan-Problem in Java ausprobiert
[Java] Verwenden Sie kryptografische Technologie mit Standardbibliotheken
Notizen im Kopf organisieren (Java-Arrangement)
Versuchen Sie, den CORBA-Dienst unter Java 11+ aufzurufen
Informationen zu Datensätzen, die zur Vorschau in Java JDK 14 hinzugefügt wurden
Was ist die Hauptmethode in Java?
So erhalten Sie das Datum mit Java
Fortsetzung Sprechen Sie über das Schreiben von Java mit Emacs @ 2018
Die Geschichte des Schreibens von Java in Emacs
Konsoleneingabe in Java (Verständnis des Mechanismus)
Lernen Sie Flyweight-Muster und ConcurrentHashMap in Java
Eindrücke und Zweifel an der erstmaligen Verwendung von Java in Android Studio
Informationen zur Bedeutung von Typvariablen, E, T usw., die in in Java verwendeten Generika verwendet werden