Java, 318 312 297 294 260 258 байт
Збережено 15 байт завдяки скелі !
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);}}
Він працює з аргументами командного рядка.
Безгольовий у читаному для людини вигляді:
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);
}
}
Так, все ще важко зрозуміти, що відбувається, навіть коли програма не працює. Отже, тут йде покрокове пояснення:
static void main(String[] A)
Перші два аргументи командного рядка - які ми використаємо для отримання розмірів - можуть використовуватися в програмі як A[0]
і A[1]
(відповідно).
int b = Byte.valueOf(A[0]),
B = Byte.valueOf(A[1]),
C = 3 + b*2;
String c = "";
b
- кількість стовпців, B
це кількість рядків і C
є змінною, призначеною для використання в for
циклах.
c
є твір Лего. Ми додамо до нього рядки, а потім роздрукуємо їх наприкінці.
if (b < 2 & B < 2)
c = "o";
else {
Якщо фрагмент для друку є 1х1, то обидва b
(кількість стовпців) і B
(кількість рядків) повинні бути меншими за 2. Отже, ми просто встановлюємо c
одиницю, o
а потім переходимо до твердження, що System.out.print
це фрагмент, якщо це так.
for (; C-- > 0; C)
c += "_";
Тут ми додаємо (integerValueOfA[0] * 2) + 3
підкреслення c
. Це самий верхній ряд над усіма отворами.
for (; B > 0; B--) {
c += "\n|";
for(C = b; C-- > 0;)
c+=" o";
c += " |";
}
Це петля, де ми конструюємо деталь по одному ряду. Що відбувається всередині, неможливо пояснити без прикладів. Скажімо, шматок 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 += "-";
Тут ми додаємо (integerValueOfA[0] * 2) + 3
дефіси до твору. Це ряд в самому дні, під усіма отворами.
Частина 4х4, яку я використав для пояснення for
циклу, куди фактично побудований шматок, виглядає приблизно так:
___________\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);
І нарешті, друкуємо твір!