Java Asterisk Rectangle [chiuso]


15

Per la mia classe CS, il mio istruttore ci ha dato l'incarico di creare un rettangolo fatto di asterischi con linee diagonali disegnate attraverso di esso in Java.

Ci ha anche detto di scriverlo nel minor numero di byte possibile. Sono arrivato a 190 byte, ma devo trovarne alcuni per semplificare ancora di più questo codice per ridurre i byte. Qualcuno mi può aiutare con questo?

Questo codice è funzionale:

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'input è 10 10.

Produzione:

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

25
Non reindirizzarlo su SO; verrà mangiato vivo.
Leaky Nun,

3
Puoi chiarire l'output e le specifiche del programma? cioè esempio input / output etc
TheLethalCoder

25
Non sono del tutto sicuro del perché questo voto da vicino sia stato votato. Questa non è sicuramente una domanda di programmazione generale. È praticamente una domanda di suggerimenti standard , che è molto sull'argomento. Non sono sicuro che abbiamo una politica sui compiti a casa, anche se per quanto posso vedere l'OP sta anche mostrando i propri sforzi, quindi non penso che ci sia davvero qualcosa di sbagliato in questo?
Martin Ender,

3
@NathanMerrill I consigli su specifici problemi del golf non sono assolutamente fuori tema .
Martin Ender,

3
@LeakyNun non mangiamo persone vive, le uccidiamo prima;)

Risposte:


1

logicamente, ci dovrebbe essere Asterik ("*") ogni volta i == j& i+j==w-1(per diagonali), i == 0& j == 0(per la linea superiore e il lato sinistro) e j == w-1& i==h-1 (per il lato destro e la linea di fondo).

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

Non so se questo è un esempio della logica che può essere utilizzata o un codice completamente golfato. Se è il secondo caso, qui c'è molto da golf. Come System.out.println()gli spazi bianchi inutili e tutti inutili tra i tubi OR ( ||) e l'operatore ternario.
Yytsi,

1
questo è solo un esempio della logica @TuukkaX.
Abbas Kararawala,

1

Il codice fornito potrebbe essere ridotto in questo modo:

  • sostituisci "*" con 42 e "" con '' (sfruttando il codice per *)
  • sposta ((y - x)% 3) all'inizio delle cose da moltiplicare e rimuovi la parentesi circostante
  • rimuove la parentesi circostante da (x> w - 2) e da ((y - x)% 3 * y% (h - 1) * x == 0)

Il codice risultante sarebbe:

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

Nota: l'ultima riga manca nell'output di esempio della domanda! L'output del codice di esempio è diverso.


0

In realtà non ho Java sul mio computer, quindi non posso provarlo ma penso che dovrebbe funzionare per 174 byte e quasi sicuramente potrebbe essere golfato di più

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

spazio bianco messo per chiarezza:

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

stampa "* \ n" per l'ultimo carattere in ciascuna riga, "*" per tutte le prime e ultime righe e la prima colonna e "*" per ogni volta che la somma della riga e della colonna è pari, altrimenti stampa ""

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.