출생 번호 확인 9 * y2 + 4 * i1

노르웨이 출생 번호는 11 자리 숫자로 구성되며 다음과 같이 구성됩니다.

DDMMYYiiikk
  • DD 오늘은 (01-31)
  • MM 월입니다 (01-12)
  • YY연도입니다 (00-99). 1900 년과 2000 년 사이에 구분되지 않습니다
  • iii “개별 번호”입니다
  • kk 두 자리수

iii 생년월일과 성별에 따라 다음과 같이 결정됩니다.

  • 0000-1900 : 무시, 일부 불일치 및 특수 사례가 있음
  • 1900-1999 : 범위 = 000-499
  • 2000-2039 : 범위 = 500-999
  • 여성 : 짝수 (및 000)
  • 남성 : 홀수

제어 번호는 다음과 같이 결정됩니다.

11 자리를 호출 해 봅시다 :

d1 d2 m1 m2 y1 y2 i1 i2 i3 k1 k2

그런 다음 방정식을 사용하여 제어 자릿수를 계산할 수 있습니다.

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

일부 조합의 경우, 제어 번호 k1또는 k2될 수 있습니다 10. 이 경우 숫자가 유효하지 않습니다.

k1또는 k2에 대한 합 계수 11 이 11 인 경우 즉 k1 = 11 - (11 mod 11), 제어 숫자는 11이 아니라 0이됩니다.

도전

문자, M또는 F(남성 또는 여성), 그리고 11 자리 숫자를 입력으로 받아, 위의 규칙에 따라 출생 번호가 유효한지 확인하십시오.

  • 입력 형식과 순서는 선택 사항입니다
  • 11 개의 숫자는 단일 숫자이거나 연속적인 문자열이어야합니다 (입력을로 사용할 수 없음 DD, MM, YY, iii, kk).
  • 날짜가 유효하다고 가정 할 수 있습니다 (310699xxxxx는 입력으로 제공되지 않음)
  • 출력은 참 / 거짓 값입니다 (1/0, 참 / 거짓 등)
  • 프로그램 또는 기능
  • 모든 표준 규칙이 적용됩니다

날짜를 선택하면 이 페이지 에서 모든 노르웨이어 번호를 찾을 수 있습니다 .

예 :

M, 01010099931
True

F, 01029042620
True

M, 0101009841
False

F, 01010051866
True

F, 08021690849
True

M, 01029040105
True

M, 01029037473
False

바이트 단위의 최단 코드가 이깁니다.



답변

파이썬 3, 227 221 바이트

성별 ‘m’과 출생 번호 ‘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)

답변

자바 스크립트 (ES2016) 275 259 255 254 252 바이트

골프 :

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}

테스트 :

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

언 골프 :

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

답변

JS, 343 바이트

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