Java Asterisk Rectangle [fermé]


15

Pour ma classe CS, mon instructeur nous a confié la tâche de créer un rectangle composé d'astérisques avec des lignes diagonales tracées à travers lui en Java.

Il nous a également dit de l'écrire en aussi peu d'octets que possible. Je l'ai réduit à 190 octets, mais j'ai besoin d'en trouver quelques-uns pour simplifier encore plus ce code pour diminuer les octets. Est-ce que quelqu'un peut m'aider avec ça?

Ce code est fonctionnel:

interface d{static void main(String[]a){for(int z=0,w=new Byte(a[0]),h=new Byte(a[1]);z<h*w;){int y=z/w,x=z++%w;System.out.print((x>w-2)?"*\n":(y%(h-1)*x*((y-x)%3)==0)?"*":" ");}}}

L'entrée est 10 10.

Production:

**********
**  *  * *
* *  *  **
*  *  *  *
**  *  * *
* *  *  **
*  *  *  *
**  *  * *
* *  *  ** 

25
Ne le redirigez pas vers SO; il sera mangé vivant.
Leaky Nun

3
Pouvez-vous clarifier la sortie et les spécifications du programme? ie exemple entrée / sortie etc
TheLethalCoder

25
Je ne sais pas exactement pourquoi ce vote serré a été voté. Ce n'est certainement pas une question de programmation générale. C'est à peu près une question de conseils standard , qui est très bien sur le sujet. Je ne sais pas si nous avons une politique sur les devoirs, bien que pour autant que je puisse voir le PO montre même leurs propres efforts, donc je ne pense pas qu'il y ait vraiment quelque chose de mal à cela?
Martin Ender

3
@NathanMerrill Des conseils pour des problèmes de golf spécifiques ne sont certainement pas hors sujet .
Martin Ender

3
@LeakyNun nous ne mangeons pas les gens vivants, nous les tuons d'abord;)

Réponses:


1

logiquement, il devrait y avoir Asterik ("*") à chaque fois i == j& i+j==w-1(pour les diagonales), i == 0& j == 0(pour la ligne supérieure et le côté gauche) et j == w-1& i==h-1 (pour le côté droit et la ligne inférieure).

class d {
    public static void main(String[] a) {
        for(int i=0,w=new Byte(a[0]),h=new Byte(a[1]);i<h;i++) {
            for(int j=0;j<w;j++) {
                System.out.print(i==0 || j==0 || i==h-1 || i+j==w-1 || j==w-1 || i==j ? "*":" ");
            }
            System.out.println();
        }
    }
}

Je ne sais pas si c'est un exemple de la logique qui peut être utilisée ou un code entièrement joué. Si c'est le deuxième cas, il y a beaucoup à jouer ici. Tels que, les System.out.println()espaces blancs inutiles et inutiles entre les tuyaux OU ( ||) et l'opérateur ternaire.
Yytsi

1
ce n'est qu'un exemple de la logique @TuukkaX.
Abbas Kararawala

1

Le code que vous avez fourni pourrait être réduit en procédant comme suit:

  • remplacer "*" par 42 et "" par '' (en profitant du charcode pour *)
  • déplacer ((y - x)% 3) au début des choses à multiplier et supprimer la parenthèse environnante
  • supprimer les parenthèses environnantes de (x> w - 2) et de ((y - x)% 3 * y% (h - 1) * x == 0)

Le code résultant serait:

interface r{static void main(String[]a){for(int z=0,w=new Byte(a[0]),h=new Byte(a[1]);z<h*w;){int y=z/w,x=z++%w;System.out.print(x>w-2?"*\n":(y-x)%3*y%(h-1)*x==0?42:' ');}}}

Remarque: la dernière ligne est manquante dans l'exemple de sortie de la question! La sortie de l'exemple de code est différente.


0

Je n'ai pas réellement Java sur mon ordinateur, donc je ne peux pas tester cela, mais je pense que cela devrait fonctionner pour 174 octets et pourrait certainement être joué plus

class d{static void main(String[]a){for(int i=0,w=new Byte(a[0]),h=new Byte(a[1]);i<h;i++)for(int j=0;j<w;j++)System.out.print(j==w-1?"*\n":i%h-1==0||!j||i+j%2==0?"*":" ");}}

espace blanc pour plus de clarté:

class d {
    static void string main(String[] a) {
        for(int i=0,w=new Byte(a[0]),h=new Byte(a[1]);i<h;i++)
            for(int j=0;j<w;j++)
                System.out.print(j==w-1 ? "*\n" : i % h-1 == 0 || !j || i+j % 2 == 0 ? "*":" ");
    }
}

affiche "* \ n" pour le dernier caractère de chaque ligne, "*" pour toutes les première et dernière lignes et la première colonne, et "*" pour chaque fois que la somme de la ligne et de la colonne est paire, sinon imprime ""

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.