123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- #!/usr/bin/ruby
- # Author: Trizen
- # License: GPLv3
- # Date: 14th November 2013
- # https://trizenx.blogspot.com
- # First argument (if defined) or default CNP
- var cnp = (ARGV[0] \\ '2940823432049');
- # Should have length() == 13
- cnp.len == 13 ||
- die "Invalid CNP: trebuie să conțină exact 13 caractere!\n";
- # Should not contains non-digits
- cnp ~~ /[^0-9]/ &&
- die "Invalid CNP: trebuie să conțină doar numere!\n";
- # Transform it into an array of numbers
- cnp.chars!.map!{Num(_)}
- var years = :(
- 1 => :(era => 1900),
- 2 => :(era => 1900),
- 3 => :(era => 1800),
- 4 => :(era => 1800),
- 5 => :(era => 2000),
- 6 => :(era => 2000),
- 7 => :(
- era => 0,
- cet => "Străin rezident în România",
- ),
- 8 => :(
- era => 0,
- cet => "Străin rezident în România",
- ),
- 9 => :(
- era => 0,
- cet => "Persoană străină",
- ),
- );
- var juds = :(
- '01' => 'Alba',
- '02' => 'Arad',
- '03' => 'Argeș',
- '04' => 'Bacău',
- '05' => 'Bihor',
- '06' => 'Bistrița-Năsăud',
- '07' => 'Botoșani',
- '08' => 'Brașov',
- '09' => 'Brăila',
- '10' => 'Buzău',
- '11' => 'Caraș-Severin',
- '12' => 'Cluj',
- '13' => 'Constanța',
- '14' => 'Covasna',
- '15' => 'Dâmbovița',
- '16' => 'Dolj',
- '17' => 'Galați',
- '18' => 'Gorj',
- '19' => 'Harghita',
- '20' => 'Hunedoara',
- '21' => 'Ialomița',
- '22' => 'Iași',
- '23' => 'Ilfov',
- '24' => 'Maramureș',
- '25' => 'Mehedinți',
- '26' => 'Mureș',
- '27' => 'Neamț',
- '28' => 'Olt',
- '29' => 'Prahova',
- '30' => 'Satu Mare',
- '31' => 'Sălaj',
- '32' => 'Sibiu',
- '33' => 'Suceava',
- '34' => 'Teleorman',
- '35' => 'Timiș',
- '36' => 'Tulcea',
- '37' => 'Vaslui',
- '38' => 'Vâlcea',
- '39' => 'Vrancea',
- '40' => 'București',
- '41' => 'București S.1',
- '42' => 'București S.2',
- '43' => 'București S.3',
- '44' => 'București S.4',
- '45' => 'București S.5',
- '46' => 'București S.6',
- '51' => 'Călărași',
- '52' => 'Giurgiu',
- );
- var months = %w(
- Ianuarie
- Februarie
- Martie
- Aprilie
- Mai
- Iunie
- Iulie
- August
- Septembrie
- Octombrie
- Noiembrie
- Decembrie
- );
- (var days = Hash()){months...} = (
- 31,
- 29,
- 31,
- 30,
- 31,
- 30,
- 31,
- 31,
- 30,
- 31,
- 30,
- 31,
- );
- var magic = [2, 7, 9, 1, 4, 6, 3, 5, 8, 2, 7, 9];
- var sum = 0;
- magic.range.each { |i|
- sum += magic[i]*cnp[i];
- }
- var cc = (sum % 11);
- cc == 10 && (cc = 1);
- if (cc != cnp[-1]) {
- "Cifra de control e incorectă!\n".die;
- }
- var year = (cnp[1]*10 + cnp[2]);
- var month = (cnp[3]*10 + cnp[4]);
- var day = (cnp[5]*10 + cnp[6]);
- var jud = "%02d".sprintf(cnp[7]*10 + cnp[8]);
- var nationality = "Română";
- var era = years{cnp[0]}{:era};
- var current = Time.local;
- if (era == 0) {
- era = [1900, 2000][year < (current.year - 2000)];
- nationality = years{cnp[0]}{:cet};
- }
- var birth_year = (year + era);
- var month_name = months[month-1];
- if (day > days{month_name} || (day < 1)) {
- "Ziua de naștere e invalidă!\n".die;
- }
- if (!juds.exists(jud)) {
- "Codul județului e invalid!\n".die
- }
- if (month == 2 && (day == 29)) {
- if (!(birth_year % 400 == 0 || (birth_year % 4 == 0 && (birth_year % 100 != 0)))) {
- "Anul #{birth_year} nu a fost un an bisect!\n".die;
- }
- }
- var age = (current.year - birth_year);
- if (current.month < month || (month == current.month && (day < current.day))) {
- age--;
- }
- print (<<'EOT' + <<EOT + <<"EOF");
- ==============================
- EOT
- Data Nașterii: #{day} #{month_name} #{birth_year}
- Cetațenie: #{nationality}
- Sexul: #{cnp[0] == 9 ? "Necunoscut" : ["Feminin", "Masculin"][cnp[0] % 2]}
- Vârsta: #{age}
- Județul: #{juds{jud}}
- EOT
- ==============================
- EOF
|