Java, 318 312 297 294 260 258 bytes
Economizou 15 bytes graças ao 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 com argumentos de linha de comando.
Ungolfed De uma forma legível 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);
}
}
Sim, ainda é difícil entender o que está acontecendo, mesmo quando o programa está sendo destruído. Então, aqui vai uma explicação passo a passo:
static void main(String[] A)
Os dois primeiros argumentos da linha de comando - que usaremos para obter dimensões - podem ser usados no programa como A[0]
e A[1]
(respectivamente).
int b = Byte.valueOf(A[0]),
B = Byte.valueOf(A[1]),
C = 3 + b*2;
String c = "";
b
é o número de colunas, B
é o número de linhas e C
é uma variável dedicada para uso em for
loops.
c
é a peça de Lego. Vamos anexar linhas a ele e depois imprimi-lo no final.
if (b < 2 & B < 2)
c = "o";
else {
Se a peça a ser impressa for 1x1, ambas b
(número de colunas) e B
(número de linhas) devem ser menores que 2. Portanto, definimos c
como uma única o
e, em seguida, pularemos para a declaração que System.out.print
é a peça, se for o caso.
for (; C-- > 0; C)
c += "_";
Aqui, anexamos (integerValueOfA[0] * 2) + 3
sublinhados a c
. Esta é a linha superior, acima de todos os orifícios.
for (; B > 0; B--) {
c += "\n|";
for(C = b; C-- > 0;)
c+=" o";
c += " |";
}
Este é o loop em que construímos a peça uma linha por vez. O que está acontecendo lá dentro é impossível de explicar sem exemplos. Digamos que a peça seja 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 += "-";
Aqui, anexamos (integerValueOfA[0] * 2) + 3
hífens à peça. Esta é a linha na parte inferior, abaixo de todos os buracos.
A peça 4x4 que eu usei para explicar o for
loop em que a peça é realmente construída agora fica assim:
___________\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);
E, finalmente, imprimimos a peça!