Прямокутник зірочки Java [закрито]


15

Для мого класу CS мій інструктор дав нам завдання створити прямокутник з зірочок з діагональними лініями, прокресленими через нього на Java.

Він також сказав нам написати це якомога менше байтів. Я звів його до 190 байт, але мені потрібно знайти кілька, щоб ще більше спростити цей код, щоб зменшити байти. Хтось може мені допомогти у цьому?

Цей код функціональний:

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

Введення є 10 10.

Вихід:

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

25
Не перенаправляйте його на SO; він з’їсться живим.
Leaky Nun

3
Чи можете ви уточнити вихід та характеристики програми? наприклад приклад вводу / виводу тощо
TheLethalCoder

25
Я не зовсім впевнений, чому за це будучи близьким. Це, безумовно, не загальне питання програмування. Це майже стандартне запитання щодо підказок , яке дуже стосується теми. Я не впевнений, чи є у нас політика щодо виконання домашніх завдань, хоча, наскільки я бачу, ОП навіть демонструє власні зусилля, тож я не думаю, що в цьому дійсно нічого поганого?
Мартін Ендер

3
@NathanMerrill Поради щодо конкретних проблем із гольфом , безумовно, не є темою .
Мартін Ендер

3
@LeakyNun ми не їмо людей живими, ми їх вбиваємо першими;)

Відповіді:


1

логічно, щоразу має бути Asterik ("*") i == j& i+j==w-1(для діагоналей), i == 0& j == 0(для верхньої та лівої частини) та j == w-1& i==h-1 (для правої та нижньої ліній).

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

Я не знаю, чи це приклад логіки, яку можна використати, або повністю гольф-код. Якщо це другий випадок, тут багато для гольфу. Наприклад, непотрібні System.out.println()та всі непотрібні пробіли між каналами АБО ( ||) та потрійним оператором.
Yytsi

1
це лише приклад до логіки @TuukkaX.
Аббас Караравала

1

Наданий вами код можна зменшити, виконавши це:

  • замініть "*" на 42 та "" на "" (скориставшись шаблоном для *)
  • перейдіть ((у - х)% 3) до початку речей, які потрібно помножити, і видаліть довколишні дужки
  • видаліть довколишні дужки з (x> w - 2) і з ((y - x)% 3 * y% (h - 1) * x == 0)

Отриманий код буде таким:

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

Примітка: останній рядок відсутній у прикладі виводу питання! Вихід зразкового коду відрізняється.


0

Я фактично не маю Java на своєму комп’ютері, тому не можу перевірити це, але я думаю, що він повинен працювати на 174 байти і майже напевно міг би бути в гольф більше

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

білий простір, розміщений для наочності:

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

друкуйте "* \ n" для останнього знаку у кожному рядку, "*" для всіх першого та останнього рядків та першого стовпця та "*" будь-коли, якщо сума рядка та стовпця є рівною, інакше друкується ""

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.