//我国公民的身份证号码特点如下:
//1、 长度为18位;
//2、 第1~17位只能为数字;
//3、 第18位可以是数字或者小写英文字母x。
//4、 身份证号码的第7~14位表示持有人生日的年、月、日信息。
//例如:511002198808080111或51100219880808011x。
//请实现身份证号码合法性判断的函数。除满足以上要求外,需要对持有人生日的年、月、日信息进行校验。年份大于等于1900年,
//小于等于2100年。需要考虑闰年、大小月的情况。所谓闰年,能被4整除且不能被100整除 或 能被400整除的年份,闰年的2月份为29天,
//非闰年的2月份为28天。其他情况的合法性校验,考生不用考虑。函数返回值:
//1) 如果身份证号合法,返回0;
//2) 如果身份证号长度不合法,返回1;
//3) 如果身份证号第1~17位含有非数字的字符,返回2;
//4) 如果身份证号第18位既不是数字也不是英文小写字母x,返回3;
//5) 如果身份证号的年信息非法,返回4
//6) 如果身份证号的月信息非法,返回5;
//7) 如果身份证号的日信息非法,返回6(请注意闰年的情况);
#include<iostream>
#include<string>
using namespace std;
int getResult(string s )
{
int len=s.size();
int y=0;
int m=0;
int d=0;
if(len==18)
{
for(int i=0;i<17;i++)
{
if(!isdigit(s[i]))
return 2;
}
if(!isdigit(s[17])&&s[17]!='x')
return 3;
for(int i=6;i<10;i++)
{
y=y*10+s[i]-'0';
}
if(y>2100||y<1900)
return 4;
for(int i=10;i<=11;i++)
{
m=m*10+s[i]-'0';
}
if(m>12||m<1)
return 5;
for(int i=12;i<=13;i++)
{
d=d*10+s[i]-'0';
}
if(d<1||d>31)
return 6;
if(d==31&&(m==4||m==6||m==9||m==11))
return 6;
if(d==30&&(m==1||m==3||m==5||m==7||m==8||m==10||m==12))
return 6;
if(m==2)
{
if(d==29)
if(y%4!=0||(y%400!=0&&y%100==0))
return 6;
}
}
else
return 1;
return 0;
}
void main()
{
string s;
getline(cin,s);
cout<<getResult(s)<<endl;
}