import java.util.*;
import java.util.function.*;
import java.time.*;
class Ideone {
private static <X, Y
> Function
<List
<X
>, List
<Y
>> mapi
(BiFunction
<Integer, X, Y
> f
) { return (xs) -> {
List<Y> ys = new ArrayList<>();
for (int i = 0; i < xs.size(); i++) {
ys.
add(f.
apply(Integer.
valueOf(i
), xs.
get(i
))); }
return ys;
};
}
private static <X> Function<List<X>, List<X>> sort(Comparator<X> c) {
return (xs) -> {
List<X> ys = new ArrayList<>(xs);
ys.sort(c);
return ys;
};
}
private static <X, Y> Function<List<X>, List<Y>> map(Function<X, Y> f) {
return (xs) -> {
List<Y> ys = new ArrayList<>();
for (X x : xs) ys.add(f.apply(x));
return ys;
};
}
private static <T> Function<T, Void> function(Consumer<T> c) {
return (x) -> {c.accept(x); return null;};
}
private static <E extends Comparable<E>> List<Integer> sorti(List<E> cs) {
/*
record IndexedValue<T extends Comparable<? super T>>(Integer index, T value) implements Comparable<IndexedValue<T>> {
public int compareTo(IndexedValue<T> other) {
return value.compareTo(other.value);
}
}
*/
class IndexedValue<T extends Comparable<? super T>> implements Comparable<IndexedValue<T>> {
private T value;
public Integer index
() {return index
;} public IndexedValue
(Integer index, T value
) {this.
index = index
;this.
value = value
;} public int compareTo(IndexedValue<T> other) {return value.compareTo(other.value);}
}
return map(IndexedValue<E>::index).compose(sort(IndexedValue<E>::compareTo)).compose(mapi(IndexedValue<E>::new)).apply(cs);
}
private static Function<List<? extends Comparable>, List<Integer>> _sorti() {
return Ideone::sorti;
}
public static void main
(String[] args
) { var f = _sorti().compose(_sorti());
var g
= function
(System.
out::println
).
compose(f
); g.
apply(Arrays.
asList(1,
100,
10,
10000,
1000)); g.
apply(Arrays.
asList(3,
1,
4,
1,
5,
9,
2)); g.
apply(Arrays.
asList(0,
1,
0,
1,
0,
1,
0,
1)); g.
apply(Arrays.
asList("A",
"C",
"B",
"E",
"D")); g.
apply(Arrays.
asList(Month.
MARCH, Month.
JANUARY, Month.
APRIL, Month.
JANUARY, Month.
MAY, Month.
SEPTEMBER, Month.
FEBRUARY)); }
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLio7CmltcG9ydCBqYXZhLnRpbWUuKjsKY2xhc3MgSWRlb25lIHsKICAgIHByaXZhdGUgc3RhdGljIDxYLCBZPiBGdW5jdGlvbjxMaXN0PFg+LCBMaXN0PFk+PiBtYXBpKEJpRnVuY3Rpb248SW50ZWdlciwgWCwgWT4gZikgewogICAgICAgIHJldHVybiAoeHMpIC0+IHsKICAgICAgICAgICAgTGlzdDxZPiB5cyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHhzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICB5cy5hZGQoZi5hcHBseShJbnRlZ2VyLnZhbHVlT2YoaSksIHhzLmdldChpKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB5czsKICAgICAgICB9OwogICAgfQogICAgcHJpdmF0ZSBzdGF0aWMgPFg+IEZ1bmN0aW9uPExpc3Q8WD4sIExpc3Q8WD4+IHNvcnQoQ29tcGFyYXRvcjxYPiBjKSB7CiAgICAgICAgcmV0dXJuICh4cykgLT4gewogICAgICAgICAgICBMaXN0PFg+IHlzID0gbmV3IEFycmF5TGlzdDw+KHhzKTsKICAgICAgICAgICAgeXMuc29ydChjKTsKICAgICAgICAgICAgcmV0dXJuIHlzOwogICAgICAgIH07CiAgICB9CiAgICBwcml2YXRlIHN0YXRpYyA8WCwgWT4gRnVuY3Rpb248TGlzdDxYPiwgTGlzdDxZPj4gbWFwKEZ1bmN0aW9uPFgsIFk+IGYpIHsKICAgICAgICByZXR1cm4gKHhzKSAtPiB7CiAgICAgICAgICAgIExpc3Q8WT4geXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgICAgZm9yIChYIHggOiB4cykgeXMuYWRkKGYuYXBwbHkoeCkpOwogICAgICAgICAgICByZXR1cm4geXM7CiAgICAgICAgfTsKICAgIH0KICAgIHByaXZhdGUgc3RhdGljIDxUPiBGdW5jdGlvbjxULCBWb2lkPiBmdW5jdGlvbihDb25zdW1lcjxUPiBjKSB7CiAgICAgICAgcmV0dXJuICh4KSAtPiB7Yy5hY2NlcHQoeCk7IHJldHVybiBudWxsO307CiAgICB9CiAgICBwcml2YXRlIHN0YXRpYyA8RSBleHRlbmRzIENvbXBhcmFibGU8RT4+IExpc3Q8SW50ZWdlcj4gc29ydGkoTGlzdDxFPiBjcykgewogICAgICAgIC8qCiAgICAgICAgcmVjb3JkIEluZGV4ZWRWYWx1ZTxUIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIFQ+PihJbnRlZ2VyIGluZGV4LCBUIHZhbHVlKSBpbXBsZW1lbnRzIENvbXBhcmFibGU8SW5kZXhlZFZhbHVlPFQ+PiB7CiAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEluZGV4ZWRWYWx1ZTxUPiBvdGhlcikgewogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmNvbXBhcmVUbyhvdGhlci52YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgKi8KICAgICAgICBjbGFzcyBJbmRleGVkVmFsdWU8VCBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBUPj4gaW1wbGVtZW50cyBDb21wYXJhYmxlPEluZGV4ZWRWYWx1ZTxUPj4gewogICAgICAgICAgICBwcml2YXRlIEludGVnZXIgaW5kZXg7CiAgICAgICAgICAgIHByaXZhdGUgVCB2YWx1ZTsKICAgICAgICAgICAgcHVibGljIEludGVnZXIgaW5kZXgoKSB7cmV0dXJuIGluZGV4O30KICAgICAgICAgICAgcHVibGljIEluZGV4ZWRWYWx1ZShJbnRlZ2VyIGluZGV4LCBUIHZhbHVlKSB7dGhpcy5pbmRleCA9IGluZGV4O3RoaXMudmFsdWUgPSB2YWx1ZTt9CiAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEluZGV4ZWRWYWx1ZTxUPiBvdGhlcikge3JldHVybiB2YWx1ZS5jb21wYXJlVG8ob3RoZXIudmFsdWUpO30KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1hcChJbmRleGVkVmFsdWU8RT46OmluZGV4KS5jb21wb3NlKHNvcnQoSW5kZXhlZFZhbHVlPEU+Ojpjb21wYXJlVG8pKS5jb21wb3NlKG1hcGkoSW5kZXhlZFZhbHVlPEU+OjpuZXcpKS5hcHBseShjcyk7CiAgICB9CiAgICBwcml2YXRlIHN0YXRpYyBGdW5jdGlvbjxMaXN0PD8gZXh0ZW5kcyBDb21wYXJhYmxlPiwgTGlzdDxJbnRlZ2VyPj4gX3NvcnRpKCkgewogICAgICAgIHJldHVybiBJZGVvbmU6OnNvcnRpOwogICAgfQogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIHZhciBmID0gX3NvcnRpKCkuY29tcG9zZShfc29ydGkoKSk7CiAgICAgICAgdmFyIGcgPSBmdW5jdGlvbihTeXN0ZW0ub3V0OjpwcmludGxuKS5jb21wb3NlKGYpOwogICAgICAgIGcuYXBwbHkoQXJyYXlzLmFzTGlzdCgxLDEwMCwxMCwxMDAwMCwxMDAwKSk7CiAgICAgICAgZy5hcHBseShBcnJheXMuYXNMaXN0KDMsMSw0LDEsNSw5LDIpKTsKICAgICAgICBnLmFwcGx5KEFycmF5cy5hc0xpc3QoMCwxLDAsMSwwLDEsMCwxKSk7CiAgICAgICAgZy5hcHBseShBcnJheXMuYXNMaXN0KCJBIiwiQyIsIkIiLCJFIiwiRCIpKTsKICAgICAgICBnLmFwcGx5KEFycmF5cy5hc0xpc3QoTW9udGguTUFSQ0gsIE1vbnRoLkpBTlVBUlksIE1vbnRoLkFQUklMLCBNb250aC5KQU5VQVJZLCBNb250aC5NQVksIE1vbnRoLlNFUFRFTUJFUiwgTW9udGguRkVCUlVBUlkpKTsKICAgIH0KfQo=
[0, 2, 1, 4, 3]
[3, 0, 4, 1, 5, 6, 2]
[0, 4, 1, 5, 2, 6, 3, 7]
[0, 2, 1, 4, 3]
[3, 0, 4, 1, 5, 6, 2]