Verifikasi nomor kelahiran


9

Nomor Lahir Norwegia terdiri dari 11 digit, terdiri atas cara berikut:

DDMMYYiiikk
  • DD adalah hari (dari 01-31)
  • MM adalah bulan (dari 01-12)
  • YYadalah tahun (dari 00-99). Itu tidak dibedakan antara 1900 dan 2000
  • iii adalah "nomor individual"
  • kk dua digit kontrol

iii ditentukan oleh tahun lahir dan jenis kelamin dengan cara berikut

  • 0000-1900: Mengabaikan, ada beberapa kasus yang tidak konsisten dan khusus
  • 1900-1999: Kisaran = 000-499
  • 2000-2039: Kisaran = 500-999
  • Perempuan: Angka genap (dan 000)
  • Laki-laki: Angka ganjil

Angka kontrol ditentukan dengan cara berikut:

Mari kita sebut 11 digit:

d1 d2 m1 m2 y1 y2 i1 i2 i3 k1 k2

Kemudian digit kontrol dapat dihitung menggunakan persamaan:

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).

Untuk beberapa kombinasi, angka kontrol k1atau k2dapat menjadi 10. Jika itu masalahnya, nomor tersebut tidak valid.

Jika jumlah modulus 11 untuk k1atau k2adalah 11, yaitu k1 = 11 - (11 mod 11), maka digit kontrol akan menjadi 0, bukan 11.

Tantangan

Ambil satu huruf, Matau F(pria atau wanita), dan sebelas digit angka sebagai masukan, dan periksa apakah Nomor Lahir itu sah menurut aturan di atas.

  • Format dan pesanan input adalah opsional
  • 11 angka harus berupa angka tunggal atau string berurutan (Anda tidak dapat menerima input sebagai DD, MM, YY, iii, kk).
  • Anda dapat menganggap tanggal tersebut valid (310699xxxxx tidak akan diberikan sebagai masukan)
  • Output adalah nilai true / falsy (1/0, true / false dll.)
  • Program atau fungsi
  • Semua aturan standar berlaku

Anda dapat menemukan semua nomor yang valid di halaman ini (dalam bahasa Norwegia) dengan memilih tanggal.

Contoh:

M, 01010099931
True

F, 01029042620
True

M, 0101009841
False

F, 01010051866
True  

F, 08021690849
True

M, 01029040105
True

M, 01029037473
False

Kode terpendek dalam byte menang.


Apakah kita perlu menangani gender selain M dan F? (Apakah itu melanggar aturan jika ["Q", "01010099931"]kembali true?)
Chiru

@Chiru, anggaplah hanya M atau F yang diberikan sebagai input. Perilaku yang tidak terdefinisi untuk input yang tidak valid adalah OK.
Stewie Griffin

Jawaban:


2

Python 3, 227 221 byte

Fungsi yang mengambil dua argumen, jenis kelamin 'm', dan angka kelahiran 'n', keduanya sebagai string. Mungkin ada beberapa golf yang harus dilakukan, terutama di baris terakhir. Saya akan terus mengerjakannya.

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 Bytes

Golf :

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}

Tes :

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));
}

Tidak Disatukan :

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 Bytes

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))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.