83 lines
1.8 KiB
Java
83 lines
1.8 KiB
Java
import java.util.Collection;
|
|
import java.util.Map;
|
|
import java.util.Optional;
|
|
import java.util.function.BooleanSupplier;
|
|
import java.util.function.Supplier;
|
|
import java.util.stream.IntStream;
|
|
import java.util.stream.Stream;
|
|
|
|
import static java.util.Collections.singletonMap;
|
|
|
|
public interface YinYang {
|
|
public static boolean circle(
|
|
int x,
|
|
int y,
|
|
int c,
|
|
int r
|
|
) {
|
|
return
|
|
(r * r) >=
|
|
((x = x / 2) * x)
|
|
+ ((y = y - c) * y)
|
|
;
|
|
}
|
|
|
|
public static String pixel(int x, int y, int r) {
|
|
return Stream.<Map<BooleanSupplier, Supplier<String>>>of(
|
|
singletonMap(
|
|
() -> circle(x, y, -r / 2, r / 6),
|
|
() -> "#"
|
|
),
|
|
singletonMap(
|
|
() -> circle(x, y, r / 2, r / 6),
|
|
() -> "."
|
|
),
|
|
singletonMap(
|
|
() -> circle(x, y, -r / 2, r / 2),
|
|
() -> "."
|
|
),
|
|
singletonMap(
|
|
() -> circle(x, y, r / 2, r / 2),
|
|
() -> "#"
|
|
),
|
|
singletonMap(
|
|
() -> circle(x, y, 0, r),
|
|
() -> x < 0 ? "." : "#"
|
|
)
|
|
)
|
|
.sequential()
|
|
.map(Map::entrySet)
|
|
.flatMap(Collection::stream)
|
|
.filter(e -> e.getKey().getAsBoolean())
|
|
.map(Map.Entry::getValue)
|
|
.map(Supplier::get)
|
|
.findAny()
|
|
.orElse(" ")
|
|
;
|
|
}
|
|
|
|
public static void yinYang(int r) {
|
|
IntStream.rangeClosed(-r, r)
|
|
.mapToObj(
|
|
y ->
|
|
IntStream.rangeClosed(
|
|
0 - r - r,
|
|
r + r
|
|
)
|
|
.mapToObj(x -> pixel(x, y, r))
|
|
.reduce("", String::concat)
|
|
)
|
|
.forEach(System.out::println)
|
|
;
|
|
}
|
|
|
|
public static void main(String... arguments) {
|
|
Optional.of(arguments)
|
|
.filter(a -> a.length == 1)
|
|
.map(a -> a[0])
|
|
.map(Integer::parseInt)
|
|
.ifPresent(YinYang::yinYang)
|
|
;
|
|
}
|
|
}
|