updates from MirBSD CVS
[shellsnippets/shellsnippets.git] / ksh / permute
1 #!/bin/mksh
2 # $MirOS: contrib/code/Snippets/permute,v 1.4 2008/05/03 01:09:24 tg Exp $
3 #-
4 # Copyright (c) 2006
5 #       Thorsten Glaser <tg@mirbsd.de>
6 #
7 # Provided that these terms and disclaimer and all copyright notices
8 # are retained or reproduced in an accompanying document, permission
9 # is granted to deal in this work without restriction, including un-
10 # limited rights to use, publicly perform, distribute, sell, modify,
11 # merge, give away, or sublicence.
12 #
13 # This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
14 # the utmost extent permitted by applicable law, neither express nor
15 # implied; without malicious intent or gross negligence. In no event
16 # may a licensor, author or contributor be held liable for indirect,
17 # direct, other damage, loss, or other issues arising in any way out
18 # of dealing in the work, even if advised of the possibility of such
19 # damage or existence of a defect, except proven that it results out
20 # of said person's immediate fault when using the work as intended.
21 #-
22 # Achtung: dieses Skript gibt n! Zeilen (n = $#) aus! (n-Fakult├Ąt)
23
24 function permute
25 {
26         integer i=0
27         integer num
28
29         set -A all $*
30         num=${#all[*]}
31         if (( num == 2 )); then
32                 print $1 $2
33                 print $2 $1
34                 return 0
35         fi
36         if (( num == 1 )); then
37                 print $1
38                 return 0
39         fi
40         while (( i < num )); do
41                 local x= y sp=
42                 integer j=0
43                 while (( j < num )); do
44                         if (( j == i )); then
45                                 y=${all[j]}
46                         else
47                                 x=$x$sp${all[j]}
48                                 sp=" "
49                         fi
50                         let j++
51                 done
52                 permute $x | sed "s\ 1^\ 1$y \ 1"
53                 let i++
54         done
55 }
56
57 (( $# > 0 )) || return 0
58 permute $*