Java Asterisk Rectangle [закрыто]

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; он будет съеден заживо.
Утренняя монахиня
3
Можете ли вы уточнить выход и характеристики программы? т.е. пример ввода / вывода и т. д.
TheLethalCoder
25
Я не совсем уверен, почему за это проголосовали близко. Это определенно не общий вопрос программирования. Это в значительной степени стандартный вопрос о советах , который очень по теме. Я не уверен, есть ли у нас политика в отношении домашней работы, хотя, насколько я вижу, ОП даже показывает свои собственные усилия, поэтому я не думаю, что в этом действительно что-то не так?
Мартин Эндер
3
@NathanMerrill Советы по конкретным проблемам в гольф, безусловно, не по теме .
Мартин Эндер
3
@LeakyNun мы не едим людей живыми, мы их сначала убиваем;)

Ответы:

1

логически, каждый раз должен быть знак «звездочка» («*») 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()и все бесполезные пробелы между OR pipe ( ||) и троичным оператором.
Yytsi
1
это всего лишь пример логики @TuukkaX.
Аббас Караравала
1

Код, который вы предоставили, можно уменьшить, выполнив это:

  • замените "*" на 42 и "" на '' (воспользовавшись кодом для *)
  • переместите ((y - x)% 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» для последнего символа в каждой строке, «*» для всех первой и последней строк и первого столбца, и «*» для любого времени, когда сумма строки и столбца является четной, в противном случае печатается ""

theLambGoat
источник