Hình chữ nhật Asterisk Java [đã đóng]


15

Đối với lớp CS của tôi, người hướng dẫn của tôi đã giao cho chúng tôi nhiệm vụ tạo một hình chữ nhật được làm bằng các dấu sao với các đường chéo được vẽ qua nó trong Java.

Ông cũng bảo chúng tôi viết nó càng ít byte càng tốt. Tôi đã nhận được tới 190 byte, nhưng tôi cần tìm một vài thứ để đơn giản hóa mã này hơn nữa để giảm byte. Bất cứ ai có thể giúp tôi với điều này?

Mã này là chức năng:

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

Đầu vào là 10 10.

Đầu ra:

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

25
Đừng chuyển hướng anh ta đến SO; anh ấy sẽ bị ăn sống.
Leaky Nun

3
Bạn có thể làm rõ đầu ra và thông số kỹ thuật của chương trình? ví dụ: đầu vào / đầu ra, v.v.
TheLethalCoder

25
Tôi không hoàn toàn chắc chắn tại sao điều này được bình chọn chặt chẽ. Đây chắc chắn không phải là một câu hỏi lập trình chung. Đó là khá nhiều câu hỏi mẹo tiêu chuẩn , rất nhiều về chủ đề. Tôi không chắc liệu chúng ta có chính sách về bài tập về nhà hay không, mặc dù theo như tôi thấy thì OP thậm chí còn thể hiện nỗ lực của chính họ, vì vậy tôi không nghĩ thực sự có gì sai với điều này?
Martin Ender

3
@NathanMerrill Lời khuyên cho các vấn đề chơi gôn cụ thể chắc chắn không lạc đề .
Martin Ender

3
@LeakyNun chúng tôi không ăn thịt người, chúng tôi sẽ giết họ trước;)

Câu trả lời:


1

về mặt logic, nên có Asterik ("*") mỗi lần i == j& i+j==w-1(cho đường chéo), i == 0& j == 0(cho dòng trên cùng và bên trái) và j == w-1& i==h-1 (cho bên phải và dòng dưới cùng).

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

Tôi không biết liệu đây là một ví dụ về logic có thể được sử dụng hay mã hoàn toàn được đánh gôn. Nếu đó là trường hợp thứ hai, có rất nhiều để chơi golf ở đây. Chẳng hạn như, System.out.println()khoảng trắng vô dụng và tất cả các khoảng trắng vô dụng giữa các đường ống OR ( ||) và toán tử ternary.
Yytsi

1
đây chỉ là một ví dụ cho logic @TuukkaX.
Abbas Kararawala

1

Mã bạn cung cấp có thể được giảm bằng cách làm điều này:

  • thay thế "*" bằng 42 và "" bằng '' (tận dụng mã char cho *)
  • di chuyển ((y - x)% 3) để bắt đầu những thứ sẽ được nhân lên và loại bỏ dấu ngoặc đơn xung quanh
  • xóa dấu ngoặc đơn xung quanh từ (x> w - 2) và từ ((y - x)% 3 * y% (h - 1) * x == 0)

Mã kết quả sẽ là:

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

Lưu ý: dòng cuối cùng bị thiếu trong đầu ra ví dụ của câu hỏi! Đầu ra của mã mẫu là khác nhau.


0

Tôi thực sự không có Java trên máy tính của mình vì vậy tôi không thể kiểm tra điều này nhưng tôi nghĩ nó nên hoạt động với 174 byte và gần như chắc chắn có thể được chơi gôn nhiều hơn

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

khoảng trắng đặt vào cho rõ ràng:

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

in "* \ n" cho char cuối cùng trong mỗi dòng, "*" cho tất cả các dòng đầu tiên và cuối cùng và cột đầu tiên, và "*" cho bất kỳ lúc nào tổng của hàng và cột là chẵn, nếu không thì in ""

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.