Retângulo Java Asterisk [fechado]

15

Para minha aula de CS, meu instrutor nos deu a tarefa de criar um retângulo feito de asteriscos com linhas diagonais desenhadas em Java.

Ele também nos disse para escrevê-lo no menor número possível de bytes. Eu o reduzi para 190 bytes, mas preciso encontrar alguns para simplificar esse código ainda mais para diminuir bytes. Alguém pode me ajudar com isso?

Este código é 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 é 10 10.

Resultado:

**********
**  *  * *
* *  *  **
*  *  *  *
**  *  * *
* *  *  **
*  *  *  *
**  *  * *
* *  *  ** 
Noah Sherry
fonte
25
Não o redirecione para SO; ele será comido vivo.
Freira Furada
3
Você pode esclarecer a saída e as especificações do programa? exemplo exemplo entrada / saída etc
TheLethalCoder
25
Não sei ao certo por que isso está sendo votado de perto. Definitivamente, essa não é uma questão de programação geral. É praticamente uma pergunta de dicas padrão , que é muito sobre o tópico. Não tenho certeza se temos uma política de lição de casa, embora, até onde eu possa ver, o OP esteja mostrando seu próprio esforço, então não acho que haja realmente algo de errado nisso?
Martin Ender
3
@NathanMerrill O conselho para problemas específicos de golfe definitivamente não está fora de tópico .
Martin Ender
3
@LeakyNun nós não comemos as pessoas vivas, nós matá-los primeiro;)

Respostas:

1

logicamente, deve haver Asterik ("*") todas as vezes i == j& i+j==w-1(para diagonais), i == 0& j == 0(para a linha superior e o lado esquerdo) e j == w-1& i==h-1 (para o lado direito e a linha 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
fonte
Não sei se este é um exemplo da lógica que pode ser usada ou um código totalmente elaborado. Se for o segundo caso, há muito para jogar aqui. Tais como, os System.out.println()espaços em branco inúteis e inúteis entre os tubos OR ( ||) e o operador ternário.
Yytsi 14/09/16
1
este é apenas um exemplo da lógica @TuukkaX.
Abbas Kararawala 19/09/16
1

O código que você forneceu pode ser reduzido fazendo o seguinte:

  • substitua "*" por 42 e "" por '' (aproveitando o código para *)
  • mova ((y - x)% 3) para o início das coisas a serem multiplicadas e remova os parênteses ao redor
  • remova os parênteses circundantes de (x> w - 2) e de ((y - x)% 3 * y% (h - 1) * x == 0)

O código resultante seria:

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: a última linha está ausente no exemplo de saída da pergunta! A saída do código de amostra é diferente.

Reinis Mazeiks
fonte
0

Na verdade, eu não tenho Java no meu computador, então não posso testar isso, mas acho que ele deve funcionar para 174 bytes e quase definitivamente poderia ser mais jogado.

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

espaço em branco para maior clareza:

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 o último caractere em cada linha, "*" para todas as primeira e última linhas e a primeira coluna e "*" para qualquer momento em que a soma da linha e coluna for par; caso contrário, será impressa ""

theLambGoat
fonte