1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
#include <cinttypes>
#include <cstdio>
#include <iostream>
#include <string>
#include <string_view>
#include <vector>
using std::cout;
using std::endl;
using std::string;
using std::string_view;
using std::vector;
constexpr string_view letter0 = "AEIOUHWYaeiouhwy";
constexpr string_view letter1 = "BFPVbfpv";
constexpr string_view letter2 = "CGJKQSXZcgjkqsxz";
constexpr string_view letter3 = "DTdt";
constexpr string_view letter4 = "Ll";
constexpr string_view letter5 = "MNmn";
constexpr string_view letter6 = "Rr";
string letter_to_digit(string number, char c) {
if (letter0.contains(c)) {
number.push_back('0');
return number;
} else if (letter2.contains(c)) {
number.push_back('2');
return number;
} else if (letter3.contains(c)) {
number.push_back('3');
return number;
} else if (letter4.contains(c)) {
number.push_back('4');
return number;
} else if (letter5.contains(c)) {
number.push_back('5');
return number;
} else if (letter6.contains(c)) {
number.push_back('6');
return number;
} else {
return number;
}
}
string name_to_number(string name) {
string number;
for (char c : name) {
number = letter_to_digit(number, c);
}
return number;
}
string coalesce(string number) {
string simplified_number;
for (size_t i = 0; i < number.size(); i++) {
if (i == 0) {
simplified_number.push_back(number[i]);
} else {
if (number[i] == number[i - 1]) {
} else {
simplified_number.push_back(number[i]);
}
}
}
return simplified_number;
}
string replace_first_digit(string number, char first_letter) {
number[0] = first_letter;
return number;
}
string discard0(string letter_number) {
string discard0_letter_number;
for (size_t i = 0; i < letter_number.size(); i++) {
if (letter_number[i] == '0') {
} else {
discard0_letter_number.push_back(letter_number[i]);
}
}
return discard0_letter_number;
}
string make_length4(string letter_number) {
int size = letter_number.size();
if (size == 4) {
} else if (size > 4) {
letter_number.erase(4);
} else if (size < 4) {
int n = 4 - size;
letter_number.append(n, '0');
}
return letter_number;
}
string soundex(string name) {
string number = name_to_number(name);
number = coalesce(number);
number = replace_first_digit(number, name[0]);
number = discard0(number);
number = make_length4(number);
return number;
}
int main(int argc, char *argv[]) {
// string number;
// string number1;
// number = letter_to_digit(number, 'A');
// number.push_back('a');
//
// number1 = name_to_number("AfaILODR'M[");
// cout << number1 << endl;
// cout << number << "\n";
// string number2 = coalesce("222025");
// cout << number2 << endl;
// cout << discard0("200233") << endl;
string name1 = "Curie";
string number1 = soundex(name1);
string name2 = "O’Conner";
string number2 = soundex(name2);
cout << number1 << endl;
cout << number2 << endl;
}
|