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 = "";
b
es el número de columnas, B
es el número de filas y C
es una variable dedicada para su uso en for
bucles.
c
Es 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 c
una sola o
y luego saltamos a la declaración que System.out.print
es la pieza si ese es el caso.
for (; C-- > 0; C)
c += "_";
Aquí, agregamos (integerValueOfA[0] * 2) + 3
guiones 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) + 3
guiones a la pieza. Esta es la fila en la parte inferior, debajo de todos los agujeros.
La pieza 4x4 que utilicé para explicar el for
bucle 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!