Java, 318 312 297 294 260 258 octets
Sauvegardé 15 octets grâce à 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);}}
Cela fonctionne avec des arguments en ligne de commande.
Ungolfed Sous une forme lisible par l'homme:
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);
}
}
Oui, il est encore difficile de comprendre ce qui se passe même lorsque le programme n'est pas joué. Donc, voici une explication étape par étape:
static void main(String[] A)
Les deux premiers arguments de la ligne de commande, que nous utiliserons pour obtenir des dimensions, peuvent être utilisés dans le programme en tant que A[0]et A[1](respectivement).
int b = Byte.valueOf(A[0]),
B = Byte.valueOf(A[1]),
C = 3 + b*2;
String c = "";
best le nombre de colonnes, Best le nombre de lignes et Cest une variable dédiée à une utilisation dans les forboucles.
cest la pièce de Lego. Nous y ajouterons des lignes puis l’imprimerons à la fin.
if (b < 2 & B < 2)
c = "o";
else {
Si la pièce à imprimer est 1x1, les deux b(nombre de colonnes) et B(nombre de lignes) doivent être inférieurs à 2. Nous définissons donc simplement cune seule o, puis passons à la déclaration qui correspond à System.out.printla pièce si tel est le cas.
for (; C-- > 0; C)
c += "_";
Ici, nous annexons des (integerValueOfA[0] * 2) + 3underscores à c. C'est la rangée la plus haute au-dessus de tous les trous.
for (; B > 0; B--) {
c += "\n|";
for(C = b; C-- > 0;)
c+=" o";
c += " |";
}
C'est la boucle où nous construisons la pièce une rangée à la fois. Ce qui se passe à l'intérieur est impossible à expliquer sans exemples. Disons que la pièce est 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 += "-";
Ici, nous ajoutons des (integerValueOfA[0] * 2) + 3traits d'union à la pièce. C'est la rangée tout en bas, en dessous de tous les trous.
Le morceau 4x4 que j'ai utilisé pour expliquer la forboucle où le morceau est réellement construit ressemble maintenant à ceci:
___________\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);
Et finalement, nous imprimons la pièce!