Überprüfen Sie die Geburtsnummer

9

Eine norwegische Geburtsnummer besteht aus 11 Ziffern, die wie folgt zusammengesetzt sind:

DDMMYYiiikk
  • DD ist der Tag (von 01-31)
  • MM ist der Monat (von 01-12)
  • YYist das Jahr (von 00-99). Es wird nicht zwischen 1900 und 2000 unterschieden
  • iii ist die "individuelle Nummer"
  • kk sind zwei Kontrollziffern

iii wird durch Geburtsjahr und Geschlecht folgendermaßen bestimmt

  • 0000-1900: Ignorieren Sie, es gibt einige Inkonsistenzen und Sonderfälle
  • 1900-1999: Bereich = 000-499
  • 2000-2039: Bereich = 500-999
  • Weiblich: Gerade Zahlen (und 000)
  • Männlich: Ungerade Zahlen

Die Kontrollnummern werden folgendermaßen ermittelt:

Nennen wir die 11 Ziffern:

d1 d2 m1 m2 y1 y2 i1 i2 i3 k1 k2

Dann können die Kontrollziffern unter Verwendung der Gleichungen berechnet werden:

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

Bei einigen Kombinationen können die Kontrollnummern k1oder k2werden 10. In diesem Fall ist die Nummer ungültig.

Wenn der Summenmodul 11 ​​für k1oder k211 ist, dh k1 = 11 - (11 mod 11), ist die Kontrollziffer 0, nicht 11.

Herausforderung

Nehmen Sie einen Buchstaben Moder F(männlich oder weiblich) und eine elfstellige Nummer als Eingabe und prüfen Sie, ob die Geburtsnummer gemäß den obigen Regeln gültig ist.

  • Eingabeformat und Reihenfolge sind optional
  • Die 11 Zahlen müssen eine einzelne Zahl oder eine fortlaufende Zeichenfolge sein (Sie können die Eingabe nicht als annehmen DD, MM, YY, iii, kk).
  • Sie können davon ausgehen, dass das Datum gültig ist (310699xxxxx wird nicht als Eingabe angegeben).
  • Die Ausgabe ist ein Wahrheits- / Falschwert (1/0, wahr / falsch usw.)
  • Programm oder Funktion
  • Es gelten alle Standardregeln

Sie finden alle gültigen Nummern auf dieser Seite (auf Norwegisch), indem Sie ein Datum auswählen.

Beispiele:

M, 01010099931
True

F, 01029042620
True

M, 0101009841
False

F, 01010051866
True  

F, 08021690849
True

M, 01029040105
True

M, 01029037473
False

Der kürzeste Code in Bytes gewinnt.

Stewie Griffin
quelle
Müssen wir mit anderen Geschlechtern als M und F umgehen? (Ist es gegen die Regeln, wenn ["Q", "01010099931"]zurückkommt true?)
Chiru
@Chiru, nehme an, dass nur M oder F als Eingabe angegeben wird. Undefiniertes Verhalten für ungültige Eingabe ist OK.
Stewie Griffin

Antworten:

2

Python 3, 227 221 Bytes

Funktion, die zwei Argumente verwendet, das Geschlecht 'm' und die Geburtsnummer 'n', beide als Zeichenfolgen. Möglicherweise muss noch mehr Golf gespielt werden, insbesondere in der letzten Zeile. Ich werde weiter daran arbeiten.

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)
Steve Eckert
quelle
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}

Tests :

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

Ungolfed :

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;
}
Chiru
quelle
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))
Nautilus
quelle