Sort a list of object identifiers: Difference between revisions

m
→‎{{header|Phix}}: added syntax colouring the hard way, phix/basics
m (→‎{{header|Phix}}: added syntax colouring the hard way, phix/basics)
Line 1,588:
 
=={{header|Phix}}==
{{libheader|Phix/basics}}
This is a variation on a standard tagsort, but performed a bit more explicitly.
<!--<lang Phix>-->
<lang Phix>sequence strings = {"1.3.6.1.4.1.11.2.17.19.3.4.0.10",
<span style="color: #004080;">sequence</span> <span style="color: #000000;">strings</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"1.3.6.1.4.1.11.2.17.19.3.4.0.10"</span><span style="color: #0000FF;">,</span>
"1.3.6.1.4.1.11.2.17.5.2.0.79",
<span style="color: #008000;">"1.3.6.1.4.1.11.2.17.195.3.42.0.479"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"1.3.6.1.4.1.1115011.2.17.19.3.4.0.14"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"1.3.6.1.4.1.11.2.17.1911150.3.4.0.1"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"1.3.6.1.4.1.1115011.2.17.19.3.4.0.1"</span><span style="color: #0000FF;"}>,</span>
<span style="color: #008000;">"1.3.6.1.4.1.11150.3.4.0"</span><span style="color: #0000FF;">}</span>
 
constant len = length(strings)
<span style="color: #008080;">constant</span> <span style="color: #000000;">len</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">strings</span><span style="color: #0000FF;">)</span>
sequence sortable = repeat(0,len)
<span style="color: #004080;">sequence</span> <span style="color: #000000;">sortable</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">len</span><span style="color: #0000FF;">)</span>
 
for i=1 to len do
<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: #000000;">len</span> <span style="color: #008080;">do</span>
sequence si = split(strings[i],'.')
<span style="color: #004080;">sequence</span> <span style="color: #000000;">si</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">split</span><span style="color: #0000FF;">(</span><span style="color: #000000;">strings</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span><span style="color: #008000;">'.'</span><span style="color: #0000FF;">)</span>
for j=1 to length(si) do
<span style="color: #008080;">for</span> <span style="color: #000000;">j</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;">si</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
si[j] = to_number(si[j])
<span style="color: #000000;">si</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">to_number</span><span style="color: #0000FF;">(</span><span style="color: #000000;">si</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">])</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
sortable[i] = {si,i}
<span style="color: #000000;">sortable</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: #0000FF;">{</span><span style="color: #000000;">si</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">}</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
sortable = sort(sortable)
<span style="color: #000000;">sortable</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sort</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sortable</span><span style="color: #0000FF;">)</span>
for i=1 to len do
<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: #000000;">len</span> <span style="color: #008080;">do</span>
?strings[sortable[i][2]]
<span style="color: #0000FF;">?</span><span style="color: #000000;">strings</span><span style="color: #0000FF;">[</span><span style="color: #000000;">sortable</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">][</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]]</span>
end for</lang>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end for<!--</lang>-->
{{out}}
<pre>
"1.3.6.1.4.1.11.2.17.5.2.0.79"
Line 1,621 ⟶ 1,625:
===alternative===
This is very similar to the above, but without using any tags/indexes at all.
<!--<lang Phix>-->
<lang Phix>constant strings = {"1.3.6.1.4.1.11.2.17.19.3.4.0.10",
<span style="color: #008080;">constant</span> <span style="color: #000000;">strings</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"1.3.6.1.4.1.11.2.17.19.3.4.0.10"</span><span style="color: #0000FF;">,</span>
"1.3.6.1.4.1.11.2.17.5.2.0.79",
<span style="color: #008000;">"1.3.6.1.4.1.11.2.17.195.3.42.0.479"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"1.3.6.1.4.1.1115011.2.17.19.3.4.0.14"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"1.3.6.1.4.1.11.2.17.1911150.3.4.0.1"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"1.3.6.1.4.1.1115011.2.17.19.3.4.0.1"</span><span style="color: #0000FF;"}>,</span>
<span style="color: #008000;">"1.3.6.1.4.1.11150.3.4.0"</span><span style="color: #0000FF;">}</span>
 
function each(string original)
<span style="color: #008080;">function</span> <span style="color: #000000;">each</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">original</span><span style="color: #0000FF;">)</span>
sequence sortable = apply(split(original,'.'),to_number)
<span style="color: #004080;">sequence</span> <span style="color: #000000;">sortable</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">split</span><span style="color: #0000FF;">(</span><span style="color: #000000;">original</span><span style="color: #0000FF;">,</span><span style="color: #008000;">'.'</span><span style="color: #0000FF;">),</span><span style="color: #7060A8;">to_number</span><span style="color: #0000FF;">)</span>
return {sortable,original}
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">sortable</span><span style="color: #0000FF;">,</span><span style="color: #000000;">original</span><span style="color: #0000FF;">}</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #000080;font-style:italic;">-- sort on sortable, then use vslice to extract the originals:</span>
printf(1,"%s\n",join(vslice(sort(apply(strings,each)),2),"\n"))</lang>
<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;">"%s\n"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">vslice</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sort</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #000000;">strings</span><span style="color: #0000FF;">,</span><span style="color: #000000;">each</span><span style="color: #0000FF;">)),</span><span style="color: #000000;">2</span><span style="color: #0000FF;">),</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">))</span>
<!--</lang>-->
{{out}}
<pre>
7,818

edits