import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Ideone
{
public static void main
(String[] args
) {
ArrayList<Fraction> list = new ArrayList<Fraction>();
try (Scanner in
= new Scanner
(System.
in)) {
while (in.hasNextLine())
{
try
{
list.add(new Fraction(line));
System.
out.
printf("I> %s%n", line
);
// 入力された分数を記録して昇順ソート後に出力。
{
for (Fraction f : list)
{
}
}
// 等しい値をグループ化して出力。
{
ArrayList<Fraction> group = new ArrayList<Fraction>();
Fraction a = list.get(0);
group.add(a);
for (int i = 1; i < list.size(); i++)
{
Fraction b = list.get(i);
if (a.compareTo(b) == 0)
{
group.add(b);
}
else
{
printGroup(group);
group.clear();
group.add(b);
a = b;
}
}
printGroup(group);
}
// 仮分数(2/2, 3/2等)の入力を帯分数または整数に変換してから出力。
{
Fraction a = list.get(0);
for (int i = 1; i < list.size(); i++)
{
Fraction b = list.get(i);
if (a.compareTo(b) != 0)
{
a = b;
}
}
}
{
System.
out.
println("不正な入力: " + e.
getMessage()); }
}
}
}
static void printGroup(List<Fraction> group)
{
StringBuilder sb = new StringBuilder();
if (group.size() == 1)
{
sb.append(group.get(0).s);
sb.append(" ");
}
else
{
sb.append("(");
for (Fraction f : group)
{
sb.append(f.s);
sb.append(" ");
}
sb.setLength(sb.length() - 1);
sb.append(") ");
}
}
}
class Fraction implements Comparable<Fraction>
{
static Pattern pattern = Pattern.compile("(\\d+)|(\\d+)/(\\d+)|(\\d+) (\\d+)/(\\d+)");
int numerator;
int denominator;
{
Matcher m = pattern.matcher(s);
if (m.matches())
{
this.
s = String.
format("'%s'", s
); if (m.group(1) != null) // 整数
{
numerator
= Integer.
parseInt(m.
group(1)); denominator = 1;
}
else if (m.group(2) != null) // 分数
{
numerator
= Integer.
parseInt(m.
group(2)); denominator
= Integer.
parseInt(m.
group(3)); }
else if (m.group(4) != null) // 帯分数
{
denominator
= Integer.
parseInt(m.
group(6)); numerator
= Integer.
parseInt(m.
group(4)) * denominator
+ Integer.
parseInt(m.
group(5)); }
}
if (denominator != 0)
{
int gcd = gcd(numerator, denominator);
numerator /= gcd;
denominator /= gcd;
if (numerator == 0)
{
n = "'0'";
}
else if (denominator == 1)
{
n
= String.
format("'%d'", numerator
); }
else if (numerator < denominator)
{
n
= String.
format("'%d/%d'", numerator, denominator
); }
else
{
n
= String.
format("'%d %d/%d'", numerator
/ denominator, numerator
% denominator, denominator
); }
}
else
{
}
}
int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a % b);
}
@Override
public int compareTo(Fraction f)
{
return Long.
compare((long) numerator
* f.
denominator,
(long) f.
numerator * denominator
); }
}
aW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5TY2FubmVyOwppbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CmltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKCmNsYXNzIElkZW9uZQp7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQogICAgewogICAgICAgIEFycmF5TGlzdDxGcmFjdGlvbj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RnJhY3Rpb24+KCk7CiAgICAgICAgdHJ5IChTY2FubmVyIGluID0gbmV3IFNjYW5uZXIoU3lzdGVtLmluKSkKICAgICAgICB7CiAgICAgICAgICAgIHdoaWxlIChpbi5oYXNOZXh0TGluZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IGluLm5leHRMaW5lKCk7CiAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChuZXcgRnJhY3Rpb24obGluZSkpOwogICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJJPiAlcyVuIiwgbGluZSk7CiAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0KTsKCiAgICAgICAgICAgICAgICAgICAgLy8g5YWl5Yqb44GV44KM44Gf5YiG5pWw44KS6KiY6Yyy44GX44Gm5piH6aCG44K944O844OI5b6M44Gr5Ye65Yqb44CCCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJPPiAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChGcmFjdGlvbiBmIDogbGlzdCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChmLnMgKyAiICIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8g562J44GX44GE5YCk44KS44Kw44Or44O844OX5YyW44GX44Gm5Ye65Yqb44CCCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJPPiAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PEZyYWN0aW9uPiBncm91cCA9IG5ldyBBcnJheUxpc3Q8RnJhY3Rpb24+KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIEZyYWN0aW9uIGEgPSBsaXN0LmdldCgwKTsKICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAuYWRkKGEpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWN0aW9uIGIgPSBsaXN0LmdldChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmNvbXBhcmVUbyhiKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLmFkZChiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludEdyb3VwKGdyb3VwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLmFkZChiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gYjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwcmludEdyb3VwKGdyb3VwKTsKICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyDku67liIbmlbDvvIgyLzIsIDMvMuetie+8ieOBruWFpeWKm+OCkuW4r+WIhuaVsOOBvuOBn+OBr+aVtOaVsOOBq+WkieaPm+OBl+OBpuOBi+OCieWHuuWKm+OAggogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiTz4gIik7CiAgICAgICAgICAgICAgICAgICAgICAgIEZyYWN0aW9uIGEgPSBsaXN0LmdldCgwKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsaXN0LnNpemUoKTsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFjdGlvbiBiID0gbGlzdC5nZXQoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5jb21wYXJlVG8oYikgIT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGEubiArICIgIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGEubik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigi5LiN5q2j44Gq5YWl5YqbOiAiICsgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHN0YXRpYyB2b2lkIHByaW50R3JvdXAoTGlzdDxGcmFjdGlvbj4gZ3JvdXApCiAgICB7CiAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgaWYgKGdyb3VwLnNpemUoKSA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc2IuYXBwZW5kKGdyb3VwLmdldCgwKS5zKTsKICAgICAgICAgICAgc2IuYXBwZW5kKCIgIik7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHNiLmFwcGVuZCgiKCIpOwogICAgICAgICAgICBmb3IgKEZyYWN0aW9uIGYgOiBncm91cCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2IuYXBwZW5kKGYucyk7CiAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzYi5zZXRMZW5ndGgoc2IubGVuZ3RoKCkgLSAxKTsKICAgICAgICAgICAgc2IuYXBwZW5kKCIpICIpOwogICAgICAgIH0KICAgICAgICBTeXN0ZW0ub3V0LnByaW50KHNiKTsKICAgIH0KCgp9CgpjbGFzcyBGcmFjdGlvbiBpbXBsZW1lbnRzIENvbXBhcmFibGU8RnJhY3Rpb24+CnsKICAgIHN0YXRpYyBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIihcXGQrKXwoXFxkKykvKFxcZCspfChcXGQrKSAoXFxkKykvKFxcZCspIik7CiAgICBpbnQgbnVtZXJhdG9yOwogICAgaW50IGRlbm9taW5hdG9yOwoKICAgIFN0cmluZyBzOwogICAgU3RyaW5nIG47CgogICAgRnJhY3Rpb24oU3RyaW5nIHMpCiAgICB7CiAgICAgICAgTWF0Y2hlciBtID0gcGF0dGVybi5tYXRjaGVyKHMpOwogICAgICAgIGlmIChtLm1hdGNoZXMoKSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMucyA9IFN0cmluZy5mb3JtYXQoIiclcyciLCBzKTsKICAgICAgICAgICAgaWYgKG0uZ3JvdXAoMSkgIT0gbnVsbCkgLy8g5pW05pWwCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG51bWVyYXRvciA9IEludGVnZXIucGFyc2VJbnQobS5ncm91cCgxKSk7CiAgICAgICAgICAgICAgICBkZW5vbWluYXRvciA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAobS5ncm91cCgyKSAhPSBudWxsKSAvLyDliIbmlbAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbnVtZXJhdG9yID0gSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDIpKTsKICAgICAgICAgICAgICAgIGRlbm9taW5hdG9yID0gSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDMpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChtLmdyb3VwKDQpICE9IG51bGwpIC8vIOW4r+WIhuaVsAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkZW5vbWluYXRvciA9IEludGVnZXIucGFyc2VJbnQobS5ncm91cCg2KSk7CiAgICAgICAgICAgICAgICBudW1lcmF0b3IgPSBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoNCkpICogZGVub21pbmF0b3IgKyBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoNSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoZGVub21pbmF0b3IgIT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIGludCBnY2QgPSBnY2QobnVtZXJhdG9yLCBkZW5vbWluYXRvcik7CiAgICAgICAgICAgIG51bWVyYXRvciAvPSBnY2Q7CiAgICAgICAgICAgIGRlbm9taW5hdG9yIC89IGdjZDsKCiAgICAgICAgICAgIGlmIChudW1lcmF0b3IgPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbiA9ICInMCciOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGRlbm9taW5hdG9yID09IDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG4gPSBTdHJpbmcuZm9ybWF0KCInJWQnIiwgbnVtZXJhdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChudW1lcmF0b3IgPCBkZW5vbWluYXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbiA9IFN0cmluZy5mb3JtYXQoIiclZC8lZCciLCBudW1lcmF0b3IsIGRlbm9taW5hdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG4gPSBTdHJpbmcuZm9ybWF0KCInJWQgJWQvJWQnIiwgbnVtZXJhdG9yIC8gZGVub21pbmF0b3IsIG51bWVyYXRvciAlIGRlbm9taW5hdG9yLCBkZW5vbWluYXRvcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihzKTsKICAgICAgICB9CiAgICB9CgogICAgaW50IGdjZChpbnQgYSwgaW50IGIpCiAgICB7CiAgICAgICAgcmV0dXJuIGIgPT0gMCA/IGEgOiBnY2QoYiwgYSAlIGIpOwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIGludCBjb21wYXJlVG8oRnJhY3Rpb24gZikKICAgIHsKICAgICAgICByZXR1cm4gTG9uZy5jb21wYXJlKChsb25nKSBudW1lcmF0b3IgKiBmLmRlbm9taW5hdG9yLCAobG9uZykgZi5udW1lcmF0b3IgKiBkZW5vbWluYXRvcik7CiAgICB9Cn0=