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 = "";
b
est le nombre de colonnes, B
est le nombre de lignes et C
est une variable dédiée à une utilisation dans les for
boucles.
c
est 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 c
une seule o
, puis passons à la déclaration qui correspond à System.out.print
la pièce si tel est le cas.
for (; C-- > 0; C)
c += "_";
Ici, nous annexons des (integerValueOfA[0] * 2) + 3
underscores à 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) + 3
traits 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 for
boucle 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!