출생 번호 확인


9

노르웨이 출생 번호는 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

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


M과 F 이외의 성별을 처리해야합니까? (?를 ["Q", "01010099931"]반환 하면 규칙에 위배 true되는가?)
Chiru

@Chiru, M 또는 F 만 입력으로 가정합니다. 유효하지 않은 입력에 대해 정의되지 않은 동작은 정상입니다.
Stewie Griffin

답변:


2

파이썬 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)

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

1

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))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.