Java, 318 312 297 294 260 258 bytes
¡ Ahorró 15 bytes gracias a 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);}}
Funciona con argumentos de línea de comando.
Ungolfed En una forma legible por humanos:
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);
}
}
Sí, aún es difícil entender lo que está sucediendo incluso cuando el programa no está protegido. Así que aquí va una explicación paso a paso:
static void main(String[] A)
Los primeros dos argumentos de la línea de comandos, que usaremos para obtener dimensiones, se pueden usar en el programa como A[0]y A[1](respectivamente).
int b = Byte.valueOf(A[0]),
B = Byte.valueOf(A[1]),
C = 3 + b*2;
String c = "";
bes el número de columnas, Bes el número de filas y Ces una variable dedicada para su uso en forbucles.
cEs la pieza de Lego. Le agregaremos filas y luego lo imprimiremos al final.
if (b < 2 & B < 2)
c = "o";
else {
Si la pieza que se va a imprimir es 1x1, entonces tanto b(número de columnas) como B(número de filas) deberían ser menores que 2. Por lo tanto, simplemente establecemos cuna sola oy luego saltamos a la declaración que System.out.printes la pieza si ese es el caso.
for (; C-- > 0; C)
c += "_";
Aquí, agregamos (integerValueOfA[0] * 2) + 3guiones bajos a c. Esta es la fila superior sobre todos los agujeros.
for (; B > 0; B--) {
c += "\n|";
for(C = b; C-- > 0;)
c+=" o";
c += " |";
}
Este es el bucle donde construimos la pieza una fila a la vez. Lo que sucede dentro es imposible de explicar sin ejemplos. Digamos que la pieza es 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 += "-";
Aquí, agregamos (integerValueOfA[0] * 2) + 3guiones a la pieza. Esta es la fila en la parte inferior, debajo de todos los agujeros.
La pieza 4x4 que utilicé para explicar el forbucle donde se construye la pieza ahora se ve así:
___________\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);
Y finalmente, imprimimos la pieza!