Sort a list of object identifiers: Difference between revisions

m
→‎{{header|REXX}}: added the REXX language.
(Added Elixir)
m (→‎{{header|REXX}}: added the REXX language.)
Line 355:
.1.3.6.1.4.1.11150.3.4.0.21</pre>
 
 
=={{header|REXX}}==
This REXX version doesn't assume a leading decimal point.
<lang rexx>/*REXX program performs a sort of OID (Object IDentifiers <── used in Network data). */
$= .1.3.6.1.4.1.11.2.17.19.3.4.0.10 .1.3.6.1.4.1.11150.3.4.0.2 ,
.1.3.6.1.4.1.11.2.17.19.3.4.0.19 .1.3.6.1.4.1.11150.3.4.0.1 ,
.1.3.6.1.4.1.11.2.17.19.3.4.0.22 .1.3.6.1.4.1.11.2.17.19.3.4.0.2 ,
.1.3.6.1.4.1.11150.3.4.0.11 .1.3.6.1.4.1.11.2.17.19.3.4.0.1 ,
.1.3.6.1.4.1.11.2.17.3773.0.2 .1.3.6.1.4.1.11.2.17.19.2.0.79 ,
.1.3.6.1.4.1.11150.3.4.0.21 .1.3.6.1.4.1.11.2.17.19.2.0.9 ,
.1.3.6.1.4.1.11.2.17.19.3.4.0.25 .1.3.6.1.4.1.11.2.17.19.3.4.0.32 ,
.1.3.6.1.4.1.11.2.17.19.3.4.0.4 .1.3.6.1.4.1.11.2.17.19.3.4.0.31 ,
.1.3.6.1.4.1.11.2.17.19.3.4.0.3 .1.3.6.1.4.1.11.2.17.3773.0.1
#=words($) /*#: the number of OIDs in the $ list.*/
a=; do i=1 for #; @.i=word($, i); a=a @.i /*build the @ array; build a composite.*/
end /*i*/ /*A will be a list of all internal #s.*/
 
a=translate(a, , .); n=words(a) /*remove all the decimal points in A. */
w=0 /*W: the widest decimal number in A. */
do m=1 for n; w=max(w, length(word(a,m))) /*find width of widest num. in all OIDs*/
end /*m*/
 
call show 'before sort ───► ' /*display the @ array before sorting.*/
say copies('▒', 75) /*display a fence, sep the before&after*/
call norma 1 /*expand all the internal OID numbers. */
call bSort # /*invoke bubble sort to sort numbers. */
call norma 0 /*shrink all the internal OID numbers. */
call show ' after sort ───► ' /*display the @ array after sorting. */
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
bSort: procedure expose @.; parse arg n; m=n-1 /*N: the number of array elements. */
do m=m for m by -1 until ok; ok=1 /*keep sorting the @ array until done. */
do j=1 for m; k=j+1; if @.j<=@.k then iterate /*Not out─of─order? */
_=@.j; @.j=@.k; @.k=_; ok=0 /*swap two elements; flag as not done.*/
end /*j*/
end /*m*/
return
/*──────────────────────────────────────────────────────────────────────────────────────*/
show: do s=1 for #; say " OID number" right(s,length(#)) arg(1) @.s; end; return
/*──────────────────────────────────────────────────────────────────────────────────────*/
norma: parse arg LZ; do j=1 for #; x=@.j; y=left(., left(x, 1)==.)
if y==. then x=substr(x,2) /*X have leading dot?*/
do while x\==''; parse var x z "." x /*extract number.*/
if LZ then y=y || right(z, w, 0). /*added leading 0's ?*/
else y=y || z+0 || . /*elide " " */
end /*while*/
@.j=strip(y, 'T', .) /*use new Y version.*/
end /*i*/ /*LZ: Leading Zero(es)*/
return /*── ─ ─ */</lang>
'''output''' &nbsp; when using the (internal) default numbers:
<pre>
OID number 1 before sort ───► .1.3.6.1.4.1.11.2.17.19.3.4.0.10
OID number 2 before sort ───► .1.3.6.1.4.1.11150.3.4.0.2
OID number 3 before sort ───► .1.3.6.1.4.1.11.2.17.19.3.4.0.19
OID number 4 before sort ───► .1.3.6.1.4.1.11150.3.4.0.1
OID number 5 before sort ───► .1.3.6.1.4.1.11.2.17.19.3.4.0.22
OID number 6 before sort ───► .1.3.6.1.4.1.11.2.17.19.3.4.0.2
OID number 7 before sort ───► .1.3.6.1.4.1.11150.3.4.0.11
OID number 8 before sort ───► .1.3.6.1.4.1.11.2.17.19.3.4.0.1
OID number 9 before sort ───► .1.3.6.1.4.1.11.2.17.3773.0.2
OID number 10 before sort ───► .1.3.6.1.4.1.11.2.17.19.2.0.79
OID number 11 before sort ───► .1.3.6.1.4.1.11150.3.4.0.21
OID number 12 before sort ───► .1.3.6.1.4.1.11.2.17.19.2.0.9
OID number 13 before sort ───► .1.3.6.1.4.1.11.2.17.19.3.4.0.25
OID number 14 before sort ───► .1.3.6.1.4.1.11.2.17.19.3.4.0.32
OID number 15 before sort ───► .1.3.6.1.4.1.11.2.17.19.3.4.0.4
OID number 16 before sort ───► .1.3.6.1.4.1.11.2.17.19.3.4.0.31
OID number 17 before sort ───► .1.3.6.1.4.1.11.2.17.19.3.4.0.3
OID number 18 before sort ───► .1.3.6.1.4.1.11.2.17.3773.0.1
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
OID number 1 after sort ───► .1.3.6.1.4.1.11.2.17.19.2.0.9
OID number 2 after sort ───► .1.3.6.1.4.1.11.2.17.19.2.0.79
OID number 3 after sort ───► .1.3.6.1.4.1.11.2.17.19.3.4.0.1
OID number 4 after sort ───► .1.3.6.1.4.1.11.2.17.19.3.4.0.2
OID number 5 after sort ───► .1.3.6.1.4.1.11.2.17.19.3.4.0.3
OID number 6 after sort ───► .1.3.6.1.4.1.11.2.17.19.3.4.0.4
OID number 7 after sort ───► .1.3.6.1.4.1.11.2.17.19.3.4.0.10
OID number 8 after sort ───► .1.3.6.1.4.1.11.2.17.19.3.4.0.19
OID number 9 after sort ───► .1.3.6.1.4.1.11.2.17.19.3.4.0.22
OID number 10 after sort ───► .1.3.6.1.4.1.11.2.17.19.3.4.0.25
OID number 11 after sort ───► .1.3.6.1.4.1.11.2.17.19.3.4.0.31
OID number 12 after sort ───► .1.3.6.1.4.1.11.2.17.19.3.4.0.32
OID number 13 after sort ───► .1.3.6.1.4.1.11.2.17.3773.0.1
OID number 14 after sort ───► .1.3.6.1.4.1.11.2.17.3773.0.2
OID number 15 after sort ───► .1.3.6.1.4.1.11150.3.4.0.1
OID number 16 after sort ───► .1.3.6.1.4.1.11150.3.4.0.2
OID number 17 after sort ───► .1.3.6.1.4.1.11150.3.4.0.11
OID number 18 after sort ───► .1.3.6.1.4.1.11150.3.4.0.21
</pre>
 
=={{header|Ring}}==
Line 502 ⟶ 591:
 
</pre>
 
 
=={{header|zkl}}==