Java Asterisk Rectangle [zamknięte]

15

Na mojej klasie CS mój instruktor zlecił nam utworzenie prostokąta z gwiazdkami z poprowadzonymi przez nią ukośnymi liniami w Javie.

Powiedział nam również, abyśmy napisali go w jak najmniejszej liczbie bajtów. Sprowadziłem go do 190 bajtów, ale muszę znaleźć kilka, aby jeszcze bardziej uprościć ten kod, aby zmniejszyć bajty. Czy ktoś może mi w tym pomóc?

Ten kod działa:

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

Dane wejściowe to 10 10.

Wynik:

**********
**  *  * *
* *  *  **
*  *  *  *
**  *  * *
* *  *  **
*  *  *  *
**  *  * *
* *  *  ** 
Noah Sherry
źródło
25
Nie przekierowuj go do SO; zostanie zjedzony żywcem.
Leaky Nun
3
Czy możesz wyjaśnić dane wyjściowe i specyfikacje programu? tzn. przykładowe wejście / wyjście itp.
TheLethalCoder
25
Nie jestem do końca pewien, dlaczego głosowano tak blisko. To zdecydowanie nie jest ogólne pytanie dotyczące programowania. To w zasadzie standardowe pytanie z poradami , które dotyczy w dużej mierze tematu. Nie jestem pewien, czy mamy politykę dotyczącą pracy domowej, chociaż o ile widzę, PO pokazuje nawet swój wysiłek, więc nie sądzę, żeby było w tym coś złego?
Martin Ender
3
@NathanMerrill Porady dotyczące konkretnych problemów golfowych zdecydowanie nie są tematem .
Martin Ender
3
@LeakyNun nie jemy żywych ludzi, najpierw ich zabijamy;)

Odpowiedzi:

1

logicznie, za każdym razem powinien występować Asterik („*”) i == ji i+j==w-1(dla przekątnych), i == 0i j == 0(dla górnej linii i lewej strony) i j == w-1& i==h-1 (dla prawej strony i dolnej linii).

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
źródło
Nie wiem, czy to jest przykład logiki, którą można zastosować, czy kod w pełni golfowy. Jeśli jest to drugi przypadek, tutaj jest wiele do golfa. Takich jak bezużyteczne System.out.println()i wszystkie bezużyteczne białe spacje między rurami OR ( ||) a operatorem trójskładnikowym.
Yytsi
1
to tylko przykład logiki @TuukkaX.
Abbas Kararawala,
1

Podany kod można zmniejszyć, wykonując następujące czynności:

  • zamień „*” na 42 i „” na „” (wykorzystując kod znakowy dla *)
  • przesuń ((y - x)% 3) na początek mnożenia i usuń otaczający nawias
  • usuń otaczający nawias z (x> w - 2) i z ((y - x)% 3 * y% (h - 1) * x == 0)

Wynikowy kod wyglądałby następująco:

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

Uwaga: w przykładowym wyniku pytania brakuje ostatniego wiersza! Dane wyjściowe przykładowego kodu są inne.

Reinis Mazeiks
źródło
0

W rzeczywistości nie mam Java na moim komputerze, więc nie mogę tego przetestować, ale myślę, że powinien działać dla 174 bajtów i prawie na pewno można by grać w golfa więcej

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

białe znaki wstawione dla jasności:

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

wypisz „* \ n” dla ostatniego znaku w każdym wierszu, „*” dla wszystkich pierwszych i ostatnich wierszy oraz pierwszej kolumny i „*” za każdym razem, gdy suma wiersza i kolumny jest parzysta, w przeciwnym razie drukowane „”

theLambGoat
źródło