Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 8bff86e

Browse files
Created: TheFiscalCode Solution
1 parent ec9cce2 commit 8bff86e

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
function fiscalCode(data) {
2+
const monthsConversion = {
3+
'01': 'A', '02': 'B', '03': 'C', '04': 'D', '05': 'E', '06': 'H',
4+
'07': 'L', '08': 'M', '09': 'P', '10': 'R', '11': 'S', '12': 'T'
5+
};
6+
7+
// Helper function to generate code for names and surnames
8+
function generateCode(name, isSurname) {
9+
const vowels = 'AEIOU';
10+
let consonants = '';
11+
let code = '';
12+
13+
// Helper function to check if a character is a consonant
14+
function isConsonant(char) {
15+
return /[BCDFGHJKLMNPQRSTVWXYZ]/.test(char);
16+
}
17+
18+
for (let i = 0; i < name.length && consonants.length < 3; i++) {
19+
const char = name[i].toUpperCase();
20+
if (isConsonant(char)) {
21+
consonants += char;
22+
}
23+
}
24+
25+
if (consonants.length < 3) {
26+
for (let i = 0; i < name.length && consonants.length < 3; i++) {
27+
const char = name[i].toUpperCase();
28+
if (vowels.includes(char)) {
29+
consonants += char;
30+
}
31+
}
32+
}
33+
34+
if (consonants.length < 3) {
35+
consonants += 'X'.repeat(3 - consonants.length);
36+
}
37+
38+
code = consonants;
39+
40+
if (isSurname) {
41+
code += 'XXX';
42+
} else {
43+
code += name.length >= 3 ? name[0] + name[2] + name[3] : name + 'XX';
44+
}
45+
46+
return code;
47+
}
48+
49+
const surnameCode = generateCode(data.surname, true);
50+
const nameCode = generateCode(data.name, false);
51+
52+
const year = data.dob.split('/')[2].slice(-2);
53+
const month = monthsConversion[data.dob.split('/')[1]];
54+
const day = (data.gender === 'F' ? 40 + parseInt(data.dob.split('/')[0]) : parseInt(data.dob.split('/')[0])).toString().padStart(2, '0');
55+
56+
return `${surnameCode}${nameCode}${year}${month}${day}`;
57+
}
58+
59+
// Examples
60+
console.log(fiscalCode({
61+
name: "Matt",
62+
surname: "Edabit",
63+
gender: "M",
64+
dob: "1/1/1900"
65+
})); // ➞ "DBTMTT00A01"
66+
67+
console.log(fiscalCode({
68+
name: "Helen",
69+
surname: "Yu",
70+
gender: "F",
71+
dob: "1/12/1950"
72+
})); // ➞ "YUXHLN50T41"
73+
74+
console.log(fiscalCode({
75+
name: "Mickey",
76+
surname: "Mouse",
77+
gender: "M",
78+
dob: "16/1/1928"
79+
})); // ➞ "MSOMKY28A16"

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /