Java, 318 312 297 294 260 258 byte
Disimpan 15 byte berkat 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);}}
Ini bekerja dengan argumen baris perintah.
Tidak Digubah dalam bentuk yang dapat dibaca manusia:
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);
}
}
Ya, masih sulit untuk memahami apa yang sedang terjadi bahkan ketika program tidak ungolfed. Jadi begini penjelasan langkah demi langkah:
static void main(String[] A)
Dua argumen baris perintah pertama - yang akan kita gunakan untuk mendapatkan dimensi - dapat digunakan dalam program sebagai A[0]
dan A[1]
(masing-masing).
int b = Byte.valueOf(A[0]),
B = Byte.valueOf(A[1]),
C = 3 + b*2;
String c = "";
b
adalah jumlah kolom, B
adalah jumlah baris dan C
merupakan variabel yang didedikasikan untuk digunakan dalam for
loop.
c
adalah bagian Lego. Kami akan menambahkan baris ke sana dan kemudian mencetaknya di akhir.
if (b < 2 & B < 2)
c = "o";
else {
Jika bagian yang akan dicetak adalah 1x1, maka keduanya b
(jumlah kolom) dan B
(jumlah baris) harus lebih kecil dari 2. Jadi kita cukup mengatur c
untuk satu o
dan kemudian melompat ke pernyataan yang System.out.print
merupakan bagian jika itu yang terjadi.
for (; C-- > 0; C)
c += "_";
Di sini, kami menambahkan (integerValueOfA[0] * 2) + 3
garis bawah ke c
. Ini adalah baris paling atas di atas semua lubang.
for (; B > 0; B--) {
c += "\n|";
for(C = b; C-- > 0;)
c+=" o";
c += " |";
}
Ini adalah lingkaran tempat kita membuat potongan satu demi satu. Apa yang terjadi di dalam tidak mungkin dijelaskan tanpa contoh. Katakanlah potongannya 4x4:
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 += "-";
Di sini, kami menambahkan (integerValueOfA[0] * 2) + 3
tanda hubung ke bagian. Ini adalah baris di bagian paling bawah, di bawah semua lubang.
Sepotong 4x4 yang saya gunakan untuk menjelaskan for
loop di mana bagian itu sebenarnya dibangun sekarang terlihat seperti ini:
___________\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);
Dan akhirnya, kami mencetaknya!