Java, 318 312 297 294 260 258 byte
Risparmiato 15 byte grazie 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);}}
Funziona con argomenti da riga di comando.
Ungolfed in una forma leggibile dall'uomo:
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ì, è ancora difficile capire cosa sta succedendo anche quando il programma non è salvato. Quindi ecco una spiegazione dettagliata:
static void main(String[] A)
I primi due argomenti della riga di comando, che useremo per ottenere le dimensioni, possono essere usati nel programma come A[0]
e A[1]
(rispettivamente).
int b = Byte.valueOf(A[0]),
B = Byte.valueOf(A[1]),
C = 3 + b*2;
String c = "";
b
è il numero di colonne, B
è il numero di righe ed C
è una variabile dedicata all'uso nei for
loop.
c
è il pezzo di Lego. Le aggiungeremo delle righe e le stamperemo alla fine.
if (b < 2 & B < 2)
c = "o";
else {
Se il pezzo da stampare è 1x1, allora sia b
(numero di colonne) e B
(numero di righe) deve essere inferiore a 2. Così abbiamo semplicemente fissato c
ad un singolo o
e poi saltare al l'affermazione che System.out.print
s il pezzo, se questo è il caso.
for (; C-- > 0; C)
c += "_";
Qui, aggiungiamo caratteri di (integerValueOfA[0] * 2) + 3
sottolineatura a c
. Questa è la riga più in alto sopra tutti i buchi.
for (; B > 0; B--) {
c += "\n|";
for(C = b; C-- > 0;)
c+=" o";
c += " |";
}
Questo è il ciclo in cui costruiamo il pezzo una fila alla volta. Quello che succede dentro è impossibile da spiegare senza esempi. Diciamo che il pezzo è 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 += "-";
Qui, aggiungiamo (integerValueOfA[0] * 2) + 3
trattini al pezzo. Questa è la fila in fondo, sotto tutti i buchi.
Il pezzo 4x4 che ho usato per spiegare il for
loop in cui il pezzo è effettivamente costruito ora appare così:
___________\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 infine, stampiamo il pezzo!