出生番号を確認する


9

ノルウェーの出生番号は11桁で構成され、次のように構成されています。

DDMMYYiiikk
  • DD 日です(01-31から)
  • MM 月(01-12から)
  • YY年です(00-99から)。1900年と2000年を区別しない
  • iii 「個人番号」
  • kk 2つの制御桁

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またはの合計係数11 k2が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

Python 3、227 221バイト

性別「m」と誕生日番号「n」の2つの引数を両方とも文字列として受け取る関数。特に最後の行では、さらにゴルフをする必要があるかもしれません。私はそれに取り組んでいきます。

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バイト

ゴルフ

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

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

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.