Java, 318 312 297 294 260 258 bajtów
Zaoszczędzono 15 bajtów dzięki 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);}}
Działa z argumentami wiersza poleceń.
Ungolfed W formie czytelnej dla człowieka:
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);
}
}
Tak, nadal trudno jest zrozumieć, co się dzieje, nawet jeśli program nie jest golfisty. Oto wyjaśnienie krok po kroku:
static void main(String[] A)
Pierwsze dwa argumenty wiersza poleceń - których użyjemy do uzyskania wymiarów - mogą być użyte w programie jako odpowiednio ( A[0]i A[1]).
int b = Byte.valueOf(A[0]),
B = Byte.valueOf(A[1]),
C = 3 + b*2;
String c = "";
bto liczba kolumn, Bliczba wierszy i Czmienna przeznaczona do użycia w forpętlach.
cjest klockiem Lego. Dodamy do niego wiersze, a następnie wydrukujemy na końcu.
if (b < 2 & B < 2)
c = "o";
else {
Jeśli kawałek do wydrukowania ma wartość 1x1, to zarówno b(liczba kolumn), jak i B(liczba wierszy) powinna być mniejsza niż 2. Więc po prostu ustawiamy cna jeden, oa następnie przejdźmy do stwierdzenia, że System.out.printjest to kawałek, jeśli tak jest.
for (; C-- > 0; C)
c += "_";
Tutaj dołączamy (integerValueOfA[0] * 2) + 3podkreślenia do c. To najwyższy rząd ponad wszystkimi dziurami.
for (; B > 0; B--) {
c += "\n|";
for(C = b; C-- > 0;)
c+=" o";
c += " |";
}
Jest to pętla, w której konstruujemy element po jednym rzędzie. To, co dzieje się w środku, nie da się wyjaśnić bez przykładów. Powiedzmy, że ten kawałek to 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 += "-";
Tutaj dołączamy (integerValueOfA[0] * 2) + 3łączniki do utworu. To rząd na samym dole, pod wszystkimi otworami.
Kawałek 4x4, którego użyłem do wyjaśnienia forpętli, w której jest on faktycznie zbudowany, wygląda teraz tak:
___________\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);
I w końcu drukujemy kawałek!