Java Asterisk Rectangle [ditutup]

15

Untuk kelas CS saya, instruktur saya telah memberi kami tugas membuat persegi panjang yang terbuat dari tanda bintang dengan garis diagonal yang digambar di Jawa.

Dia juga menyuruh kami untuk menulisnya sesedikit mungkin. Saya sudah mendapatkannya hingga 190 byte, tetapi saya perlu menemukan beberapa untuk menyederhanakan kode ini bahkan lebih untuk mengurangi byte. Adakah yang bisa membantu saya dengan ini?

Kode ini fungsional:

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

Masukan adalah 10 10.

Keluaran:

**********
**  *  * *
* *  *  **
*  *  *  *
**  *  * *
* *  *  **
*  *  *  *
**  *  * *
* *  *  ** 
Sherry Nuh
sumber
25
Jangan arahkan dia ke SO; dia akan dimakan hidup-hidup.
Leaky Nun
3
Bisakah Anda mengklarifikasi keluaran dan spesifikasi program? contohnya input / output dll
TheLethalCoder
25
Saya tidak sepenuhnya yakin mengapa ini menjadi dekat. Ini jelas bukan pertanyaan pemrograman umum. Ini cukup banyak pertanyaan kiat standar , yang sangat banyak pada topik. Saya tidak yakin apakah kita memiliki kebijakan tentang pekerjaan rumah, meskipun sejauh yang saya bisa lihat OP bahkan menunjukkan upaya mereka sendiri, jadi saya tidak berpikir ada yang salah dengan ini?
Martin Ender
3
@NathanMerrill Saran untuk masalah golf tertentu jelas bukan topik .
Martin Ender
3
@ LeakyNun kita tidak memakan orang hidup-hidup, kita bunuh mereka dulu;)

Jawaban:

1

secara logis, harus ada Asterik ("*") setiap waktu i == j& i+j==w-1(untuk diagonal), i == 0& j == 0(untuk garis atas dan sisi kiri) dan j == w-1& i==h-1 (untuk sisi kanan dan garis bawah).

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
sumber
Saya tidak tahu apakah ini adalah contoh dari logika yang dapat digunakan atau kode golf sepenuhnya. Jika ini kasus kedua, ada banyak golf di sini. Seperti, ruang System.out.println()putih yang tidak berguna dan tidak berguna antara pipa OR ( ||) dan operator ternary.
Yytsi
1
ini hanyalah sebuah contoh untuk logika @TuukkaX.
Abbas Kararawala
1

Kode yang Anda berikan dapat dikurangi dengan melakukan ini:

  • ganti "*" dengan 42 dan "" dengan '' (memanfaatkan charcode untuk *)
  • pindahkan ((y - x)% 3) ke awal hal-hal yang akan dikalikan dan menghapus tanda kurung sekitarnya
  • hapus tanda kurung di sekitarnya dari (x> w - 2) dan dari ((y - x)% 3 * y% (h - 1) * x == 0)

Kode yang dihasilkan adalah:

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

Catatan: baris terakhir tidak ada dalam contoh output dari pertanyaan! Output dari kode sampel berbeda.

Reinis Mazeiks
sumber
0

Saya sebenarnya tidak memiliki Java di komputer saya jadi saya tidak bisa menguji ini, tetapi saya pikir itu harus bekerja untuk 174 byte dan hampir pasti bisa golf lebih

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

ruang putih dimasukkan untuk kejelasan:

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

cetak "* \ n" untuk karakter terakhir di setiap baris, "*" untuk semua baris pertama dan terakhir dan kolom pertama, dan "*" untuk setiap saat jumlah baris dan kolom genap, jika tidak cetak ""

theLambGoat
sumber