Découvrez les spécifications tout en raccourcissant FizzBuzz écrit en Java

Je vais l'écrire pour le moment

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

Essayez de raccourcir

Actuellement, le code source Java le plus court pour FizzBuzz semble être 96 octets . Raccourcissons-le parce que c'est un gros problème (quoi?).


Raccourcir à l'aide d'opérateurs conditionnels

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 + ""))));
        }
    }
}

Le code sera pratique et facile à lire si vous ne faites pas d'erreur en l'utilisant. (Bien que j'ai des goûts différents) Cependant, l'utilisation ci-dessus est exagérée par tous les moyens, alors ne le faites pas sauf si vous avez une raison spécifique.


Concevoir un algorithme

C'est une question d'idée pure ou pas. La formation quotidienne et le sens sont importants. Je pense que vous devriez lire beaucoup de bon code et écrire beaucoup de code vous-même.


Concevoir un algorithme

Code jusqu'à 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"));
        }
    }
}

Concevoir un algorithme

Java5 (JLS 3e édition) et code ultérieur

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

Quelle est la différence?

--Jusqu'à JLS 2nd Edition, les deuxième et troisième expressions de l'opérateur conditionnel devaient renvoyer le même type. ―― Donc, je le fais de force String par dextérité comme ʻi + "" `


Réduire les parenthèses

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

Spécifications d'incrément

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

terminer

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

Supprimez les espaces blancs supplémentaires et les sauts de ligne pour faire de la variable un seul caractère. Décent? Ces 130 octets sont la limite du code source. Peut-être.


Merci pour le temps


Un peu de côté

J'ai une déclaration de tableau grâce à un codage court

String[]a

J'ai remarqué que je peux écrire en collant ensemble comme ça. Aussi

String

[]

a

Peu importe que vous le démontiez comme ça.

Eh bien, je ne choisis pas et n'utilise pas le tableau seul de nos jours ...


Route vers 96 octets

Au début, j'ai dit que le plus court était de 96 octets, mais dans le code précédent, il était de 130 octets. En fait, il est encore plus court avec des conditions spéciales.


Profitez des bugs

Il semble que les VM jusqu'à une certaine version aient un problème, et il était possible de sortir des caractères sans la méthode principale. (Avec la VM actuelle, rien ne devrait fonctionner sans la méthode principale.)


Initialiseur statique

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

Il est devenu 102 octets. Les VM jusqu'à une certaine version semblent s'exécuter dans l'initialiseur statique plus tôt que le timing spécifié dans les spécifications de VM d'origine, et il semble que même un tel code sera exécuté. Pour ce code, après l'exécution de FizzBuzz, je me fâche qu'il n'y ait pas de méthode principale.

À propos, un initialiseur statique est un bloc de code déclaré statique qui n'est exécuté qu'une seule fois lorsqu'une classe est chargée. S'il vous plaît google comment l'utiliser.


enum et initialiseur d'instance

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

Il est devenu 97 octets.


enum

Il est préférable de lire l'énumération Effective Java 2nd Edition for Java. sans aucun doute. Concernant le code ci-dessus, il utilise les propriétés suivantes.

--enum est aussi un type de classe


Initialiseur d'instance

Un initialiseur d'instance est un bloc de code qui ne s'exécute qu'une seule fois lorsqu'une instance est créée. Appelé avant le constructeur. S'il vous plaît google comment l'utiliser. Je ne pense pas qu'il existe de nombreuses possibilités de l'utiliser.


Le champ a la valeur par défaut

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

Le dernier octet a été réduit en utilisant la propriété que le champ a une valeur par défaut (int est 0) afin que vous n'ayez pas à affecter explicitement 0.


Résumé

Par codage court avec FizzBuzz

--Opérateur conditionnel

J'ai pu apprendre les spécifications de. Même s'il s'agit de FizzBuzz, vous ne pouvez pas le sous-estimer! !!


Je vous remercie pour votre travail acharné

Recommended Posts

Découvrez les spécifications tout en raccourcissant FizzBuzz écrit en Java
FizzBuzz en Java
À propos de la confusion observée dans les serveurs Java de démarrage
À propos de l'idée des classes anonymes en Java
Une histoire sur le JDK à l'ère de Java 11
Pensez au problème JAVA = JAVAscript (nécessaire à l'avenir)
Pensez aux différences entre les fonctions et les méthodes (en Java)
À propos de la classe abstraite Java
Accéder à l'interface réseau avec Java
Devinez le code de caractère en Java
À propos du symbole <%%> dans Rails erb
En savoir plus sur les points de sauvegarde des transactions (avec Java)
Spécifiez l'emplacement Java dans eclipse.ini
Comment apprendre JAVA en 7 jours
Décompressez le fichier zip en Java
À propos de l'environnement de développement actuel (Java 8)
Analyser l'analyse syntaxique de l'API COTOHA en Java
A propos du traitement de la copie de fichiers en Java
Appelez la super méthode en Java
Une histoire sur un projet Spring Boot écrit en Java qui prend en charge Kotlin
[Introduction à Ruby] À propos du rôle de true et break in the while statement
À propos du phénomène que StackOverflowError se produit lors du traitement à l'aide d'expressions régulières Java
A propos du renvoi d'une référence dans un Java Getter
Obtenez le résultat de POST en Java
Devinez le cadre de persistance Java 2017 (3) Reladomo
Spring Autowired est écrit dans le constructeur
Référence Java à comprendre dans la figure
Essayez d'utiliser l'API Stream en Java
Appelez l'API de notification Windows en Java
À propos de la procédure pour que Java fonctionne
[Création] Un mémorandum sur le codage en Java
À propos du nouveau modèle de version de Java @ Seki Java (20/07/2018)
J'ai essayé le nouveau yuan à Java
[Java] Utiliser la technologie cryptographique avec les bibliothèques standard
Organisation des notes dans la tête (Java-Arrangement)
Essayez d'appeler le service CORBA sur Java 11+
À propos des enregistrements ajoutés pour l'aperçu dans Java JDK 14
Quelle est la méthode principale en Java?
Comment obtenir la date avec Java
Discussion continue sur l'écriture de Java avec Emacs @ 2018
L'histoire de l'écriture de Java dans Emacs
Entrée de la console en Java (comprendre le mécanisme)
Apprenez les modèles Flyweight et ConcurrentHashMap en Java
Impressions et doutes sur l'utilisation de Java pour la première fois dans Android Studio
À propos de la signification des variables de type, E, T, etc. utilisées dans les génériques utilisés en Java