Java, 318 312 297 294 260 258 байт
Сохранено 15 байтов благодаря 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);}}
Работает с аргументами командной строки.
Ungolfed в удобочитаемой форме:
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
это часть Lego. Мы добавим к нему строки, а затем напечатаем его в конце.
if (b < 2 & B < 2)
c = "o";
else {
Если часть для печати имеет размер 1x1, то оба 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 += " |";
}
Это цикл, в котором мы строим фигуру по одной строке за раз. То, что происходит внутри, невозможно объяснить без примеров. Допустим, что кусок 4х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 += "-";
Здесь мы добавляем (integerValueOfA[0] * 2) + 3
дефис к куску. Это строка в самом низу, под всеми отверстиями.
Часть 4x4, которую я использовал для объяснения 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);
И, наконец, мы печатаем кусок!