जन्म संख्या का सत्यापन करें


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। यदि ऐसा है, तो संख्या अमान्य हो जाएगी।

यदि योग मापांक 11 के लिए 11 है k1या k211 है k1 = 11 - (11 mod 11), तो नियंत्रण अंक 0 होगा, 11 नहीं।

चुनौती

एक पत्र, Mया F(पुरुष या महिला), और इनपुट के रूप में एक ग्यारह अंकों की संख्या लें, और जांचें कि क्या जन्म संख्या ऊपर के नियमों के अनुसार वैध है।

  • इनपुट प्रारूप और आदेश वैकल्पिक है
  • 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?)
चिरू

@ चिरू, मान लें कि केवल एम या एफ को इनपुट के रूप में दिया गया है। अमान्य इनपुट के लिए अपरिभाषित व्यवहार ठीक है।
स्टेवि ग्रिफिन

जवाबों:


2

पायथन 3, 227 221 बाइट्स

फ़ंक्शन जो दो तर्क लेता है, लिंग 'एम' और जन्मजात 'एन', दोनों तार के रूप में। विशेष रूप से अंतिम पंक्ति में कुछ और गोल्फिंग हो सकते हैं। मैं इस पर काम करता रहूंगा।

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

जेएस, 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))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.