Rectángulo de asterisco de Java [cerrado]

15

Para mi clase de CS, mi instructor nos ha asignado la tarea de crear un rectángulo hecho de asteriscos con líneas diagonales dibujadas a través de él en Java.

También nos dijo que lo escribiéramos en la menor cantidad de bytes posible. Lo he reducido a 190 bytes, pero necesito encontrar algunos para simplificar aún más este código para disminuir los bytes. Puede alguien ayudarme con esto?

Este código es funcional:

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

Entrada es 10 10.

Salida:

**********
**  *  * *
* *  *  **
*  *  *  *
**  *  * *
* *  *  **
*  *  *  *
**  *  * *
* *  *  ** 
Noah Sherry
fuente
25
No lo redirija a SO; se lo comerán vivo.
Leaky Nun
3
¿Puedes aclarar el resultado y las especificaciones del programa? es decir, entrada / salida de ejemplo, etc.
TheLethalCoder
25
No estoy del todo seguro de por qué este estar cerca votó. Definitivamente, esta no es una pregunta de programación general. Es más o menos una pregunta de consejos estándar , que está muy relacionada con el tema. No estoy seguro de si tenemos una política sobre la tarea, aunque, por lo que puedo ver, el OP incluso está mostrando su propio esfuerzo, por lo que no creo que haya algo realmente malo en esto.
Martin Ender
3
@NathanMerrill El asesoramiento para problemas específicos de golf definitivamente no está fuera de tema .
Martin Ender
3
@LeakyNun no comemos personas vivas, las matamos primero;)

Respuestas:

1

lógicamente, debería haber Asterik ("*") cada vez i == j& i+j==w-1(para diagonales), i == 0& j == 0(para la línea superior y el lado izquierdo) y j == w-1& i==h-1 (para el lado derecho y la línea inferior).

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();
        }
    }
}
Abbas Kararawala
fuente
No sé si este es un ejemplo de la lógica que se puede utilizar o un código totalmente desarrollado. Si es el segundo caso, hay mucho para jugar golf aquí. Tales como, los System.out.println()espacios en blanco inútiles y todos inútiles entre los tubos OR ( ||) y el operador ternario.
Yytsi
1
Este es solo un ejemplo de lógica @TuukkaX.
Abbas Kararawala
1

El código que proporcionó podría reducirse haciendo esto:

  • reemplace "*" por 42 y "" por '' (aprovechando el código de char para *)
  • mover ((y - x)% 3) al comienzo de las cosas que se multiplicarán y eliminar el paréntesis circundante
  • eliminar paréntesis circundantes de (x> w - 2) y de ((y - x)% 3 * y% (h - 1) * x == 0)

El código resultante sería:

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: ¡falta la última línea en el resultado de ejemplo de la pregunta! La salida del código de muestra es diferente.

Reinis Mazeiks
fuente
0

En realidad no tengo Java en mi computadora, así que no puedo probar esto, pero creo que debería funcionar para 174 bytes y casi definitivamente podría jugar más.

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

espacio en blanco para mayor claridad:

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

imprima "* \ n" para el último carácter en cada línea, "*" para todas las líneas primera y última y la primera columna, y "*" para cualquier momento en que la suma de la fila y la columna sea par, de lo contrario imprime ""

theLambGoat
fuente