NYSIIS: Difference between revisions

35,965 bytes added ,  2 years ago
m
→‎{{header|Phix}}: syntax coloured
m (→‎{{header|Phix}}: syntax coloured)
Line 1,348:
=={{header|Phix}}==
{{trans|Go}}
<!--<lang Phix>function isVowel(integer bytephixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
return find(byte,"AEIOU")!=0
<span style="color: #008080;">function</span> <span style="color: #000000;">isVowel</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">byte</span><span style="color: #0000FF;">)</span>
end function
<span style="color: #008080;">return</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">byte</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"AEIOU"</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">0</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
function isRoman(string s)
if s == "" then
<span style="color: #008080;">function</span> <span style="color: #000000;">isRoman</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
return false
<span style="color: #008080;">if</span> <span style="color: #000000;">s</span> <span style="color: #0000FF;">==</span> <span style="color: #008000;">""</span> <span style="color: #008080;">then</span>
end if
<span style="color: #008080;">return</span> <span style="color: #004600;">false</span>
for i=1 to length(s) do
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if not find(s[i],"IVX") then
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
return false
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span><span style="color: #008000;">"IVX"</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
end if
<span style="color: #008080;">return</span> <span style="color: #004600;">false</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
return true
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end function
<span style="color: #008080;">return</span> <span style="color: #004600;">true</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
function nysiis(string word)
if word == "" then return "" end if
<span style="color: #008080;">function</span> <span style="color: #000000;">nysiis</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">word</span><span style="color: #0000FF;">)</span>
word = upper(word)
<span style="color: #008080;">if</span> <span style="color: #000000;">word</span> <span style="color: #0000FF;">==</span> <span style="color: #008000;">""</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #008000;">""</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
sequence ww = split_any(word, ", ")
<span style="color: #000000;">word</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">upper</span><span style="color: #0000FF;">(</span><span style="color: #000000;">word</span><span style="color: #0000FF;">)</span>
if length(ww)>1 then
<span style="color: #004080;">sequence</span> <span style="color: #000000;">ww</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">split_any</span><span style="color: #0000FF;">(</span><span style="color: #000000;">word</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">", "</span><span style="color: #0000FF;">)</span>
string last = ww[$]
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ww</span><span style="color: #0000FF;">)></span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span>
if isRoman(last) then
<span style="color: #004080;">string</span> <span style="color: #000000;">last</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">ww</span><span style="color: #0000FF;">[$]</span>
word = word[1..-length(last)-1]
<span style="color: #008080;">if</span> <span style="color: #000000;">isRoman</span><span style="color: #0000FF;">(</span><span style="color: #000000;">last</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
end if
<span style="color: #000000;">word</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">word</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..-</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">last</span><span style="color: #0000FF;">)-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
word = substitute_all(word, " ,'-", repeat("",4))
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
sequence eStrs = {"JR", "JNR", "SR", "SNR"}
<span style="color: #000000;">word</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">substitute_all</span><span style="color: #0000FF;">(</span><span style="color: #000000;">word</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">" ,'-"</span><span style="color: #0000FF;">,</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #008000;">""</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">))</span>
for i=1 to length(eStrs) do
<span style="color: #004080;">sequence</span> <span style="color: #000000;">eStrs</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"JR"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"JNR"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"SR"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"SNR"</span><span style="color: #0000FF;">}</span>
string ei = eStrs[i]
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">eStrs</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
integer lei = length(ei)
<span style="color: #004080;">string</span> <span style="color: #000000;">ei</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">eStrs</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
if length(word)>lei
<span style="color: #004080;">integer</span> <span style="color: #000000;">lei</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ei</span><span style="color: #0000FF;">)</span>
and word[-lei..$]=ei then
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">word</span><span style="color: #0000FF;">)></span><span style="color: #000000;">lei</span>
word = word[1..-lei-1]
<span style="color: #008080;">and</span> <span style="color: #000000;">word</span><span style="color: #0000FF;">[-</span><span style="color: #000000;">lei</span><span style="color: #0000FF;">..$]=</span><span style="color: #000000;">ei</span> <span style="color: #008080;">then</span>
end if
<span style="color: #000000;">word</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">word</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..-</span><span style="color: #000000;">lei</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
sequence fStrs = {{"MAC","MCC"}, {"KN","N"}, {"K","C"},
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
{"PH","FF"}, {"PF","FF"}, {"SCH","SSS"}}
<span style="color: #004080;">sequence</span> <span style="color: #000000;">fStrs</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #008000;">"MAC"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"MCC"</span><span style="color: #0000FF;">},</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"KN"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"N"</span><span style="color: #0000FF;">},</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"K"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"C"</span><span style="color: #0000FF;">},</span>
for i=1 to length(fStrs) do
<span style="color: #0000FF;">{</span><span style="color: #008000;">"PH"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"FF"</span><span style="color: #0000FF;">},</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"PF"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"FF"</span><span style="color: #0000FF;">},</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"SCH"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"SSS"</span><span style="color: #0000FF;">}}</span>
string {fi,rfi} = fStrs[i]
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fStrs</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
integer lfi = length(fi)
<span style="color: #004080;">string</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">fi</span><span style="color: #0000FF;">,</span><span style="color: #000000;">rfi</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">fStrs</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
if length(word)>lfi
<span style="color: #004080;">integer</span> <span style="color: #000000;">lfi</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fi</span><span style="color: #0000FF;">)</span>
and word[1..lfi]=fi then
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">word</span><span style="color: #0000FF;">)></span><span style="color: #000000;">lfi</span>
word[1..lfi] = rfi
<span style="color: #008080;">and</span> <span style="color: #000000;">word</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">lfi</span><span style="color: #0000FF;">]=</span><span style="color: #000000;">fi</span> <span style="color: #008080;">then</span>
end if
<span style="color: #000000;">word</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">lfi</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rfi</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if length(word)>=2 then
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
string l2 = word[-2..-1]
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">word</span><span style="color: #0000FF;">)>=</span><span style="color: #000000;">2</span> <span style="color: #008080;">then</span>
if find(l2,{"EE","IE"}) then
<span style="color: #004080;">string</span> <span style="color: #000000;">l2</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">word</span><span style="color: #0000FF;">[-</span><span style="color: #000000;">2</span><span style="color: #0000FF;">..-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
word[-2..-1] = "Y"
<span style="color: #008080;">if</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">l2</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">"EE"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"IE"</span><span style="color: #0000FF;">})</span> <span style="color: #008080;">then</span>
elsif find(l2,{"DT","RT","RD","NT","ND"}) then
<span style="color: #000000;">word</span><span style="color: #0000FF;">[-</span><span style="color: #000000;">2</span><span style="color: #0000FF;">..-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"Y"</span>
word[-2..-1] = "D"
<span style="color: #008080;">elsif</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">l2</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">"DT"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"RT"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"RD"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"NT"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ND"</span><span style="color: #0000FF;">})</span> <span style="color: #008080;">then</span>
end if
<span style="color: #000000;">word</span><span style="color: #0000FF;">[-</span><span style="color: #000000;">2</span><span style="color: #0000FF;">..-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"D"</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
integer initial = word[1]
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
string key = word[1..1]
<span style="color: #004080;">integer</span> <span style="color: #000000;">initial</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">word</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
word = word[2..$]
<span style="color: #004080;">string</span> <span style="color: #000000;">key</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">word</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
word = substitute_all(word,{"EV","KN","SCH","PH"},
<span style="color: #000000;">word</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">word</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">..$]</span>
{"AF","N", "SSS","FF"})
<span style="color: #000000;">word</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">substitute_all</span><span style="color: #0000FF;">(</span><span style="color: #000000;">word</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">"EV"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"KN"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"SCH"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"PH"</span><span style="color: #0000FF;">},</span>
string sb = key&word
<span style="color: #0000FF;">{</span><span style="color: #008000;">"AF"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"N"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"SSS"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"FF"</span><span style="color: #0000FF;">})</span>
integer le := length(sb)
<span style="color: #004080;">string</span> <span style="color: #000000;">sb</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">key</span><span style="color: #0000FF;">&</span><span style="color: #000000;">word</span>
for i=2 to le do
<span style="color: #004080;">integer</span> <span style="color: #000000;">le</span> <span style="color: #0000FF;">:=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sb</span><span style="color: #0000FF;">)</span>
switch sb[i] do
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #000000;">le</span> <span style="color: #008080;">do</span>
case 'E', 'I', 'O', 'U': sb[i] = 'A'
<span style="color: #008080;">switch</span> <span style="color: #000000;">sb</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">do</span>
case 'Q': sb[i] = 'G'
<span style="color: #008080;">case</span> <span style="color: #008000;">'E'</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">'I'</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">'O'</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">'U'</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">sb</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">'A'</span>
case 'Z': sb[i] = 'S'
<span style="color: #008080;">case</span> <span style="color: #008000;">'Q'</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">sb</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">'G'</span>
case 'M': sb[i] = 'N'
<span style="color: #008080;">case</span> <span style="color: #008000;">'Z'</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">sb</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">'S'</span>
case 'K': sb[i] = 'C'
<span style="color: #008080;">case</span> <span style="color: #008000;">'M'</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">sb</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">'N'</span>
case 'H': if (i> 1 and not isVowel(sb[i-1]))
<span style="color: #008080;">case</span> <span style="color: #008000;">'K'</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">sb</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">'C'</span>
or (i<le and not isVowel(sb[i+1])) then
<span style="color: #008080;">case</span> <span style="color: #008000;">'H'</span><span style="color: #0000FF;">:</span> <span style="color: #008080;">if</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">></span> <span style="color: #000000;">1</span> <span style="color: #008080;">and</span> <span style="color: #008080;">not</span> <span style="color: #000000;">isVowel</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sb</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]))</span>
sb[i] = sb[i-1]
<span style="color: #008080;">or</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;"><</span><span style="color: #000000;">le</span> <span style="color: #008080;">and</span> <span style="color: #008080;">not</span> <span style="color: #000000;">isVowel</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sb</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]))</span> <span style="color: #008080;">then</span>
end if
<span style="color: #000000;">sb</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">sb</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
case 'W': if isVowel(sb[i-1]) then
<span style="color: #008080;">end</span> sb[i]<span style="color: sb[i-1]#008080;">if</span>
<span style="color: #008080;">case</span> <span style="color: #008000;">'W'</span><span style="color: #0000FF;">:</span> <span style="color: #008080;">if</span> <span style="color: #000000;">isVowel</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sb</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">])</span> <span style="color: #008080;">then</span>
end if
<span style="color: #000000;">sb</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">sb</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
end switch
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">switch</span>
integer prev := initial
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
for j=2 to le do
<span style="color: #004080;">integer</span> <span style="color: #000000;">prev</span> <span style="color: #0000FF;">:=</span> <span style="color: #000000;">initial</span>
integer c := sb[j]
<span style="color: #008080;">for</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #000000;">le</span> <span style="color: #008080;">do</span>
if prev != c then
<span style="color: #004080;">integer</span> <span style="color: #000000;">c</span> <span style="color: #0000FF;">:=</span> <span style="color: #000000;">sb</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span>
key &= c
<span style="color: #008080;">if</span> <span style="color: #000000;">prev</span> <span style="color: #0000FF;">!=</span> <span style="color: #000000;">c</span> <span style="color: #008080;">then</span>
prev = c
<span style="color: #000000;">key</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">c</span>
end if
<span style="color: #000000;">prev</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">c</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if length(key)>=1 and key[$] == 'S' then key[$ ..$] = "" end if
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
if length(key)>=2 and key[-2..-1] == "AY" then key[$-1..$] = "Y" end if
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">key</span><span style="color: #0000FF;">)>=</span><span style="color: #000000;">1</span> <span style="color: #008080;">and</span> <span style="color: #000000;">key</span><span style="color: #0000FF;">[$]</span> <span style="color: #0000FF;">==</span> <span style="color: #008000;">'S'</span> <span style="color: #008080;">then</span> <span style="color: #000000;">key</span><span style="color: #0000FF;">[$</span> <span style="color: #0000FF;">..$]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if length(key)>=1 and key[$] == 'A' then key[$ ..$] = "" end if
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">key</span><span style="color: #0000FF;">)>=</span><span style="color: #000000;">2</span> <span style="color: #008080;">and</span> <span style="color: #000000;">key</span><span style="color: #0000FF;">[-</span><span style="color: #000000;">2</span><span style="color: #0000FF;">..-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">==</span> <span style="color: #008000;">"AY"</span> <span style="color: #008080;">then</span> <span style="color: #000000;">key</span><span style="color: #0000FF;">[$-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..$]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"Y"</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
return key
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">key</span><span style="color: #0000FF;">)>=</span><span style="color: #000000;">1</span> <span style="color: #008080;">and</span> <span style="color: #000000;">key</span><span style="color: #0000FF;">[$]</span> <span style="color: #0000FF;">==</span> <span style="color: #008000;">'A'</span> <span style="color: #008080;">then</span> <span style="color: #000000;">key</span><span style="color: #0000FF;">[$</span> <span style="color: #0000FF;">..$]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end function
<span style="color: #008080;">return</span> <span style="color: #000000;">key</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
constant tests = {
{ "Bishop", "BASAP" },
<span style="color: #008080;">constant</span> <span style="color: #000000;">tests</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span>
{ "Carlson", "CARLSAN" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Bishop"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"BASAP"</span> <span style="color: #0000FF;">},</span>
{ "Carr", "CAR" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Carlson"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"CARLSAN"</span> <span style="color: #0000FF;">},</span>
{ "Chapman", "CAPNAN" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Carr"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"CAR"</span> <span style="color: #0000FF;">},</span>
{ "Franklin", "FRANCLAN" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Chapman"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"CAPNAN"</span> <span style="color: #0000FF;">},</span>
{ "Greene", "GRAN" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Franklin"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"FRANCLAN"</span> <span style="color: #0000FF;">},</span>
{ "Harper", "HARPAR" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Greene"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"GRAN"</span> <span style="color: #0000FF;">},</span>
{ "Jacobs", "JACAB" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Harper"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"HARPAR"</span> <span style="color: #0000FF;">},</span>
{ "Larson", "LARSAN" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Jacobs"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"JACAB"</span> <span style="color: #0000FF;">},</span>
{ "Lawrence", "LARANC" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Larson"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"LARSAN"</span> <span style="color: #0000FF;">},</span>
{ "Lawson", "LASAN" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Lawrence"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"LARANC"</span> <span style="color: #0000FF;">},</span>
{ "Louis, XVI", "L" }, -- (see note)
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Lawson"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"LASAN"</span> <span style="color: #0000FF;">},</span>
{ "Lynch", "LYNC" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Louis, XVI"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"L"</span> <span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- (see note)</span>
{ "Mackenzie", "MCANSY" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Lynch"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"LYNC"</span> <span style="color: #0000FF;">},</span>
{ "Matthews", "MAT" }, -- (see note)
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Mackenzie"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"MCANSY"</span> <span style="color: #0000FF;">},</span>
{ "May jnr", "MY" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Matthews"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"MAT"</span> <span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- (see note)</span>
{ "McCormack", "MCARNAC" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"May jnr"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"MY"</span> <span style="color: #0000FF;">},</span>
{ "McDaniel", "MCDANAL" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"McCormack"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"MCARNAC"</span> <span style="color: #0000FF;">},</span>
{ "McDonald", "MCDANALD" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"McDaniel"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"MCDANAL"</span> <span style="color: #0000FF;">},</span>
{ "Mclaughlin", "MCLAGLAN" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"McDonald"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"MCDANALD"</span> <span style="color: #0000FF;">},</span>
{ "Morrison", "MARASAN" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Mclaughlin"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"MCLAGLAN"</span> <span style="color: #0000FF;">},</span>
{ "O'Banion", "OBANAN" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Morrison"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"MARASAN"</span> <span style="color: #0000FF;">},</span>
{ "O'Brien", "OBRAN" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"O'Banion"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"OBANAN"</span> <span style="color: #0000FF;">},</span>
{ "Richards", "RACARD" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"O'Brien"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"OBRAN"</span> <span style="color: #0000FF;">},</span>
{ "Silva", "SALV" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Richards"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"RACARD"</span> <span style="color: #0000FF;">},</span>
{ "Watkins", "WATCAN" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Silva"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"SALV"</span> <span style="color: #0000FF;">},</span>
{ "Wheeler", "WALAR" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Watkins"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"WATCAN"</span> <span style="color: #0000FF;">},</span>
{ "Willis", "WAL" }, -- (see note)
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Wheeler"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"WALAR"</span> <span style="color: #0000FF;">},</span>
{ "Xi", "X" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Willis"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"WAL"</span> <span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- (see note)</span>
{ "bevan", "BAFAN" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Xi"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"X"</span> <span style="color: #0000FF;">},</span>
{ "brown, sr", "BRAN" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"bevan"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"BAFAN"</span> <span style="color: #0000FF;">},</span>
{ "brown sr", "BRAN" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"brown, sr"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"BRAN"</span> <span style="color: #0000FF;">},</span>
{ "browne, III", "BRAN" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"brown sr"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"BRAN"</span> <span style="color: #0000FF;">},</span>
{ "browne, IV", "BRAN" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"browne, III"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"BRAN"</span> <span style="color: #0000FF;">},</span>
{ "evans", "EVAN" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"browne, IV"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"BRAN"</span> <span style="color: #0000FF;">},</span>
{ "knight", "NAGT" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"evans"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"EVAN"</span> <span style="color: #0000FF;">},</span>
{ "mitchell", "MATCAL" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"knight"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"NAGT"</span> <span style="color: #0000FF;">},</span>
{ "o'daniel", "ODANAL" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"mitchell"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"MATCAL"</span> <span style="color: #0000FF;">},</span>
{ "D'Souza", "DSAS" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"o'daniel"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"ODANAL"</span> <span style="color: #0000FF;">},</span>
{ "de Sousa", "DASAS" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"D'Souza"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"DSAS"</span> <span style="color: #0000FF;">},</span>
{ "Hoyle-Johnson", "HAYLAJANSAN" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"de Sousa"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"DASAS"</span> <span style="color: #0000FF;">},</span>
{ "Vaughan Williams", "VAGANWALAN" },
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Hoyle-Johnson"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"HAYLAJANSAN"</span> <span style="color: #0000FF;">},</span>
{ "de la Mare II", "DALANAR" } }
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"Vaughan Williams"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"VAGANWALAN"</span> <span style="color: #0000FF;">},</span>
 
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"de la Mare II"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"DALANAR"</span> <span style="color: #0000FF;">}</span> <span style="color: #0000FF;">}</span>
integer errors = 0
for i=1 to length(tests) do
<span style="color: #004080;">integer</span> <span style="color: #000000;">errors</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
string {name,expected} = tests[i],
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tests</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
name2 := nysiis(name)
<span style="color: #004080;">string</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">name</span><span style="color: #0000FF;">,</span><span style="color: #000000;">expected</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">tests</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span>
if name2!=expected then
<span style="color: #000000;">name2</span> <span style="color: #0000FF;">:=</span> <span style="color: #000000;">nysiis</span><span style="color: #0000FF;">(</span><span style="color: #000000;">name</span><span style="color: #0000FF;">)</span>
errors += 1
<span style="color: #008080;">if</span> <span style="color: #000000;">name2</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">expected</span> <span style="color: #008080;">then</span>
if length(name2) > 6 then
<span style="color: #000000;">errors</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
name2 = sprintf("%s(%s)", {name2[1..6], name2[7..$]})
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">name2</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">></span> <span style="color: #000000;">6</span> <span style="color: #008080;">then</span>
end if
<span style="color: #000000;">name2</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"%s(%s)"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">name2</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">6</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">name2</span><span style="color: #0000FF;">[</span><span style="color: #000000;">7</span><span style="color: #0000FF;">..$]})</span>
printf(1,"%-16s : %s\n", {name, name2})
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end if
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%-16s : %s\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">name</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">name2</span><span style="color: #0000FF;">})</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
printf(1,"All tests completed, %d errors\n",errors)</lang>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"All tests completed, %d errors\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">errors</span><span style="color: #0000FF;">)</span>
<!--</lang>-->
Note: After some careful consideration, I have decided that all three (see note) tests <i>are</i> in fact correct, or at least follow wp, specifically step 6 <i>before</i> step 7.
{{out}}
7,815

edits