Doğum numarasını doğrulayın


9

Norveç Doğum Numarası 11 basamaktan oluşur ve aşağıdaki şekilde oluşturulur:

DDMMYYiiikk
  • DD gün (01-31 arası)
  • MM ay (01-12 arası)
  • YYyıl (00-99 arası). 1900 ile 2000 arasında ayrım yapılmamıştır
  • iii "bireysel numara"
  • kk iki kontrol basamağı

iii birthyearear ve cinsiyet tarafından aşağıdaki şekilde belirlenir

  • 0000-1900: Yok say, bazı tutarsızlıklar ve özel durumlar var
  • 1900-1999: Aralık = 000-499
  • 2000-2039: Aralık = 500-999
  • Kadın: Çift sayılar (ve 000)
  • Erkek: Tek sayılar

Kontrol numaraları aşağıdaki şekilde belirlenir:

11 basamağı arayalım:

d1 d2 m1 m2 y1 y2 i1 i2 i3 k1 k2

Daha sonra kontrol basamakları denklemler kullanılarak hesaplanabilir:

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

Bazı kombinasyonlar için kontrol numaraları k1veya k2olabilir 10. Bu durumda, numara geçersiz olacaktır.

Toplam modülü 11 k1veya 11 için k2ise, yani k1 = 11 - (11 mod 11), kontrol basamağı 11 değil 0 olacaktır.

Meydan okuma

Bir harf Mveya F(erkek veya kadın) ve on bir basamaklı sayı girin ve Doğum Numarasının yukarıdaki kurallara göre geçerli olup olmadığını kontrol edin.

  • Giriş formatı ve sırası isteğe bağlıdır
  • 11 sayı tek bir sayı veya ardışık bir dize olmalıdır (girişi şu şekilde alamazsınız DD, MM, YY, iii, kk).
  • Tarihin geçerli olduğunu varsayabilirsiniz (310699xxxxx giriş olarak verilmez)
  • Çıktı gerçek / yanlış bir değerdir (1/0, doğru / yanlış vb.)
  • Program veya işlev
  • Tüm standart kurallar geçerlidir

Bu sayfada (Norveççe) geçerli tüm numaraları bir tarih seçerek bulabilirsiniz.

Örnekler:

M, 01010099931
True

F, 01029042620
True

M, 0101009841
False

F, 01010051866
True  

F, 08021690849
True

M, 01029040105
True

M, 01029037473
False

Bayt kazanmak için en kısa kod.


M ve F dışındaki cinsiyetleri ele almamız gerekiyor mu? (Eğer kurallara karşı mı ["Q", "01010099931"]getiri true?)
Chiru

@Chiru, giriş olarak yalnızca M veya F verildiğini varsayın. Geçersiz giriş için tanımlanmamış davranış TAMAM.
Stewie Griffin

Yanıtlar:


2

Python 3, 227222 bayt

Her ikisi de dize olarak 'm' cinsiyeti ve 'n' doğum numarası olmak üzere iki argüman alan işlev. Özellikle son satırda daha fazla golf yapılabilir. Üzerinde çalışmaya devam edeceğim.

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 Bayt

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}

Testler :

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

Kurtulmamış :

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 Bayt

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))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.