Sorting list numerically in Cadence SKILL Language

Status
Not open for further replies.

pancho_hideboo

Advanced Member level 5
Joined
Oct 21, 2006
Messages
2,847
Helped
767
Reputation
1,536
Reaction score
733
Trophy points
1,393
Location
Real Homeless
Activity points
17,490
a = '(11 9 11 8 7 9 12 1 0 -5 11 6 7)

I want to sort above list, a and then generate new list, b.

b = '(-5 0 1 6 7 7 8 9 9 11 11 11 12)

And I want to remove duplicate elements and then generate new list, c

c = '(-5 0 1 6 7 8 9 11 12)

How can I do these tasks elegantly in Cadence SKILL Language ?

"sort(a, nil)" is not valid.

I can do these tasks for list very easily in Microsoft .NET enviroment by invoking sort method and association list, e.g. "hash table"or "dictionary".
 

Self follow.
Code:
procedure( list_sort(l_list,
	     @optional (my_mode 0), (rm_duplicate 0)
	   ); list_sort
prog( (k, ii, jj, n, p, my_value)
  n = length(l_list)

  declare(p[n])
  for(k, 0, n-1
    p[k] = nth(k, l_list)
  ); for

  for(ii, 0, n-2
    my_value = p[ii]
    k = ii
    for(jj, ii+1, n-1
    prog( ()
	if(my_mode == 0 then
	  when( my_value < p[jj], return() ) ; ascend
	else
	  when( my_value > p[jj], return() ) ; descend
	); if
	my_value = p[jj]
	k = jj
    ); prog
    ); for
    p[k] = p[ii]
    p[ii] = my_value
  ); for

  my_value = p[0]
  l_list = list(my_value)
  for(k, 1, n-1
    if(rm_duplicate != 0 then
	when(p[k] != my_value
	  my_value = p[k]
	  l_list = append1(l_list, my_value)
	); when
    else
	l_list = append1(l_list, p[i])
    ); if
  ); for
  return(l_list)
); prog
); procedure
\i list_sort('(2 11 11 11 10 10 9 9 4 0 -1), 0)
\t (-1 0 2 4 9
\t 9 10 10 11 11
\t 11
\t )
\p >
\i list_sort('(2 11 11 11 10 10 9 9 4 0 -1), 0, 1)
\t (-1 0 2 4 9
\t 10 11
\t )
\p >
\i list_sort('(2 11 11 11 10 10 9 9 4 0 -1), 1)
\t (11 11 11 10 10
\t 9 9 4 2 0
\t -1
\t )
\p >
\i list_sort('(2 11 11 11 10 10 9 9 4 0 -1), 1, 1)
\t (11 10 9 4 2
\t 0 -1
\t )
 

Status
Not open for further replies.
Cookies are required to use this site. You must accept them to continue using the site. Learn more…