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 = "";
badalah jumlah kolom, Badalah jumlah baris dan Cmerupakan variabel yang didedikasikan untuk digunakan dalam forloop.
cadalah 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 cuntuk satu odan kemudian melompat ke pernyataan yang System.out.printmerupakan bagian jika itu yang terjadi.
for (; C-- > 0; C)
c += "_";
Di sini, kami menambahkan (integerValueOfA[0] * 2) + 3garis 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) + 3tanda hubung ke bagian. Ini adalah baris di bagian paling bawah, di bawah semua lubang.
Sepotong 4x4 yang saya gunakan untuk menjelaskan forloop 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!