Java, 318 312 297 294 260 258 byte
Đã lưu 15 byte nhờ cliffroot !
interface a{static void main(String[]A){int b=Byte.valueOf(A[0]),B=Byte.valueOf(A[1]),C=3+b*2;String c="";if(b<2&B<2)c="o";else{for(;C-->0;)c+="_";for(;B-->0;){c+="\n|";for(C=b;C-->0;)c+=" o";c+=" |";}c+="\n";for(C=3+b*2;C-->0;)c+="-";}System.out.print(c);}}
Nó hoạt động với các đối số dòng lệnh.
Ungolfed ở dạng người có thể đọc được:
interface a {
static void main(String[] A) {
int b = Byte.valueOf(A[0]),
B = Byte.valueOf(A[1]),
C = 3 + b*2;
String c = "";
if (b < 2 & B < 2)
c = "o";
else {
for (; C-- > 0;)
c += "_";
for (; B-- > 0;) {
c += "\n|";
for (C = b; C-- >0;)
c += " o";
c += " |";
}
c += "\n";
for(C = 3 + b*2; C-- >0;)
c += "-";
}
System.out.print(c);
}
}
Vâng, vẫn còn khó hiểu những gì đang diễn ra ngay cả khi chương trình không được cung cấp. Vì vậy, đây là một lời giải thích từng bước:
static void main(String[] A)
Hai đối số dòng lệnh đầu tiên - chúng ta sẽ sử dụng để lấy kích thước - có thể được sử dụng trong chương trình như A[0]
và A[1]
(tương ứng).
int b = Byte.valueOf(A[0]),
B = Byte.valueOf(A[1]),
C = 3 + b*2;
String c = "";
b
là số lượng cột, B
là số lượng hàng và C
là biến chuyên dụng để sử dụng trong for
các vòng lặp.
c
là mảnh Lego. Chúng tôi sẽ nối các hàng với nó và sau đó in nó ở cuối.
if (b < 2 & B < 2)
c = "o";
else {
Nếu mảnh được in là 1x1, sau đó cả hai b
(số cột) và B
(số hàng) nên nhỏ hơn 2. Vì vậy, chúng ta chỉ cần đặt c
một đơn o
và sau đó bỏ qua để tuyên bố rằng System.out.print
là mảnh nếu đó là trường hợp.
for (; C-- > 0; C)
c += "_";
Ở đây, chúng tôi nối thêm (integerValueOfA[0] * 2) + 3
dấu gạch dưới vào c
. Đây là hàng trên cùng trên tất cả các lỗ.
for (; B > 0; B--) {
c += "\n|";
for(C = b; C-- > 0;)
c+=" o";
c += " |";
}
Đây là vòng lặp nơi chúng ta xây dựng một mảnh mỗi lần. Những gì đang diễn ra bên trong là không thể giải thích mà không có ví dụ. Hãy nói rằng tác phẩm là 4 x 4:
Before entering the loop, c looks like this:
___________
After the first iteration (\n denotes a line feed):
___________\n
| o o o o |
After the second iteration:
___________\n
| o o o o |\n
| o o o o |
After the third iteration:
___________\n
| o o o o |\n
| o o o o |\n
| o o o o |
.
c += "\n";
for (C = 3 + b*2; C-- > 0;)
c += "-";
Ở đây, chúng tôi nối các (integerValueOfA[0] * 2) + 3
dấu gạch nối vào mảnh. Đây là hàng ở dưới cùng, bên dưới tất cả các lỗ.
Phần 4 x 4 tôi đã sử dụng để giải thích for
vòng lặp trong đó phần thực sự được xây dựng bây giờ trông như thế này:
___________\n
| o o o o |\n
| o o o o |\n
| o o o o |\n
| o o o o |\n
-----------
System.out.print(c);
Và cuối cùng, chúng tôi in mảnh!