Xác nhận số sinh


9

Số sinh Na Uy bao gồm 11 chữ số, bao gồm các cách sau:

DDMMYYiiikk
  • DD là ngày (từ 01-31)
  • MM là tháng (từ 01-12)
  • YYlà năm (từ 00-99). Nó không được phân biệt giữa 1900 và 2000
  • iii là "số cá nhân"
  • kk là hai chữ số kiểm soát

iii được xác định bởi năm sinh và giới tính theo cách sau

  • 0000-1900: Bỏ qua, có một số trường hợp không nhất quán và đặc biệt
  • 1900-1999: Phạm vi = 000-499
  • 2000-2039: Phạm vi = 500-999
  • Nữ: Số chẵn (và 000)
  • Nam: số lẻ

Các số kiểm soát được xác định theo cách sau:

Hãy gọi 11 chữ số:

d1 d2 m1 m2 y1 y2 i1 i2 i3 k1 k2

Sau đó, các chữ số điều khiển có thể được tính bằng các phương trình:

k1 = 11 - ((3 * d1 + 7 * d2 + 6 * m1 + 1 * m2 + 8 * y1 + 9 * y2 + 4 * i1 + 5 * i2 + 2 * i3) mod 11)

k2 = 11 - ((5 * d1 + 4 * d2 + 3 * m1 + 2 * m2 + 7 * y1 + 6 * y2 + 5 * i1 + 4 * i2 + 3 * i3 + 2 * k1) mod 11).

Đối với một số kết hợp, các số điều khiển k1hoặc k2có thể trở thành 10. Nếu đó là trường hợp, số sẽ không hợp lệ.

Nếu mô đun tổng 11 cho k1hoặc k2là 11, tức là k1 = 11 - (11 mod 11), chữ số điều khiển sẽ là 0, không phải 11.

Thử thách

Lấy một chữ cái, Mhoặc F(nam hoặc nữ), và một số mười một chữ số làm đầu vào, và kiểm tra xem Số sinh có hợp lệ theo các quy tắc trên không.

  • Định dạng đầu vào và thứ tự là tùy chọn
  • 11 số phải là một số đơn hoặc một chuỗi liên tiếp (bạn không thể lấy đầu vào là DD, MM, YY, iii, kk).
  • Bạn có thể cho rằng ngày hợp lệ (310699xxxxx sẽ không được cung cấp làm đầu vào)
  • Đầu ra là một giá trị trung thực / sai lệch (1/0, đúng / sai, v.v.)
  • Chương trình hoặc chức năng
  • Tất cả các quy tắc tiêu chuẩn được áp dụng

Bạn có thể tìm thấy tất cả các số hợp lệ trên trang này (bằng tiếng Na Uy) bằng cách chọn một ngày.

Ví dụ:

M, 01010099931
True

F, 01029042620
True

M, 0101009841
False

F, 01010051866
True  

F, 08021690849
True

M, 01029040105
True

M, 01029037473
False

Mã ngắn nhất trong byte thắng.


Chúng ta có cần xử lý các giới tính khác ngoài M và F không? (Có trái với quy định nếu ["Q", "01010099931"]trở về truekhông?)
Chiru

@Chiru, giả sử chỉ M hoặc F được đưa ra làm đầu vào. Hành vi không xác định cho đầu vào không hợp lệ là OK.
Stewie Griffin

Câu trả lời:


2

Python 3, 227 221 byte

Hàm lấy hai đối số, giới tính 'm' và số sinh 'n', cả hai dưới dạng chuỗi. Có thể có thêm một số golf để được thực hiện, đặc biệt là trong dòng cuối cùng. Tôi sẽ tiếp tục làm việc với nó.

def a(m,n):
 o=[3,7,6,1,8,9,4,5,2];t=[5,4,3,2,7,6,5,4,3,2];n=list(map(int,n));y=z=b=0;q=11
 for i in n[:9]:z+=o[b]*i;y+=t[b]*i;b+=1
 print((q-z%q)%q==n[9] and (q-(y-z-z)%q)%q==n[-1] and len(n)<12 and ord(m)%2==n[8]%2)

2

JavaScript (ES2016), 275 259 255 254 252 byte

Golfed :

f=(g,I)=>{[,d,m,y,i,k]=/(..)(..)(..)(...)(..)/.exec(I.padEnd(12)),v=g.charCodeAt()%2!=i%2|y<=39&i<500,s=k=>11-([...I].slice(0,-2).map((e,i)=>e*[..."376189452543276543"][i+!k|9]).reduce((a,b)=>a+b)+2*k)%11,[s(0),s(s(0))].map((s,i)=>v&=k[i]!=s);return!v}

Các xét nghiệm :

for (let args of [
    ["M", "01010099931"], // true
    ["F", "01029042620"], // true
    ["M", "0101009841"],  // false
    ["F", "01010051866"], // true
    ["F", "08021690849"], // true
    ["M", "01029040105"], // true
    ["M", "01029037473"]  // false
]) {
    console.log(f(...args));
}

Ung dung :

let f = (g, input) => {

    /* Sanitize input, destructure arguments via RegExp */
    let [, d, m, y, i, k] = /(..)(..)(..)(...)(..)/.exec(input.padRight(12));

    /* Validate gender and year */
    let violation = g.charCodeAt() % 2 != i % 2 | y <= 39 & i < 500;

    let n = [..."376189452543276543"];
    /* This function computes k1 if given no arguments, k2 if given one argument */
    let s = k => 11 - ([...input].slice(0, -2).map((e, i) => e * n[i + !k | 9]).reduce((a, b) => a + b) + 2 * k) % 11;

    /* Validate the control numbers k */
    [s(0), s(s(0))].map((s, i) => violation &= k[i] != s);

    return !violation;
}

1

JS, 343 byte

x=prompt().replace(/F/,1).replace(/M/,2).match(/\d{1}/g);v=Math.abs((x[0]-x[9])%2);v++;t=x[5]*10+x[6]*1;i=x[7]*1;if(t>39&&i>4){v--}if((11-(3*x[1]+7*x[2]+6*x[3]+1*x[4]+8*x[5]+9*x[6]+4*x[7]+5*x[8]+2*x[9])%11)%11===x[10]*1&&(11-(5*x[1]+4*x[2]+3*x[3]+2*x[4]+7*x[5]+6*x[6]+5*x[7]+4*x[8]+3*x[9]+2*x[10])%11)%11===x[11]*1){v++}alert(Math.floor(v/3))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.