#include <iostream>
using namespace std;
enum IP_family {
addr_IPv4,
addr_IPv6,
addr_unknown
};
const char *to_string (IP_family f) {
switch (f) {
case addr_IPv6:
return "IPv6";
case addr_IPv4:
return "IPv4";
default:
return "unknown";
}
}
IP_family addr_type (const string &addr) {
if (addr.find_first_of (':') != string::npos)
return addr_IPv6;
if (addr.find_first_of ('.') != string::npos)
return addr_IPv4;
return addr_unknown;
}
ostream &operator<< (ostream &os, IP_family f) {
return os << to_string (f);
}
void test (const string &str) {
cout << "\"" << str << "\" is " << addr_type(str) << endl;
}
int main() {
test ("46.227.16.8");
test ("2a01:6e00:10:410::2");
test ("42");
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKZW51bSBJUF9mYW1pbHkgewoJYWRkcl9JUHY0LAoJYWRkcl9JUHY2LAoJYWRkcl91bmtub3duCn07Cgpjb25zdCBjaGFyICp0b19zdHJpbmcgKElQX2ZhbWlseSBmKSB7Cglzd2l0Y2ggKGYpIHsKCWNhc2UgYWRkcl9JUHY2OgoJCXJldHVybiAiSVB2NiI7CgljYXNlIGFkZHJfSVB2NDoKCQlyZXR1cm4gIklQdjQiOwoJZGVmYXVsdDoKCQlyZXR1cm4gInVua25vd24iOwoJfQp9CgpJUF9mYW1pbHkgYWRkcl90eXBlIChjb25zdCBzdHJpbmcgJmFkZHIpIHsKCWlmIChhZGRyLmZpbmRfZmlyc3Rfb2YgKCc6JykgIT0gc3RyaW5nOjpucG9zKQoJCXJldHVybiBhZGRyX0lQdjY7CglpZiAoYWRkci5maW5kX2ZpcnN0X29mICgnLicpICE9IHN0cmluZzo6bnBvcykKCQlyZXR1cm4gYWRkcl9JUHY0OwoJcmV0dXJuIGFkZHJfdW5rbm93bjsKfQoKb3N0cmVhbSAmb3BlcmF0b3I8PCAob3N0cmVhbSAmb3MsIElQX2ZhbWlseSBmKSB7CglyZXR1cm4gb3MgPDwgdG9fc3RyaW5nIChmKTsKfQoKdm9pZCB0ZXN0IChjb25zdCBzdHJpbmcgJnN0cikgewoJY291dCA8PCAiXCIiIDw8IHN0ciA8PCAiXCIgaXMgIiA8PCBhZGRyX3R5cGUoc3RyKSA8PCBlbmRsOwp9CgppbnQgbWFpbigpIHsKCXRlc3QgKCI0Ni4yMjcuMTYuOCIpOwoJdGVzdCAoIjJhMDE6NmUwMDoxMDo0MTA6OjIiKTsKCXRlc3QgKCI0MiIpOwoJcmV0dXJuIDA7Cn0K