배열이 정의된 쉘 스크립트가 있습니다. 배열에 2개 이상의 요소가 포함되어 있습니다. 배열의 모든 요소의 조합을 찾아야 합니다. 내 배열에 요소가 있다고 가정해 보겠습니다.{12345, 56789, 98765}
, 출력을 얻으려고 노력 중입니다.
12345, 56789
12345, 98765
56789, 98765
나는 PHP 코드를 시도했다여기.
<?php
function pc_permute($items, $perms = array( )) {
if (empty($items)) {
print join(' ', $perms) . "\n";
} else {
for ($i = count($items) - 1; $i >= 0; --$i) {
$newitems = $items;
$newperms = $perms;
list($foo) = array_splice($newitems, $i, 1);
array_unshift($newperms, $foo);
pc_permute($newitems, $newperms);
}
}
}
pc_permute(split(' ', '12345 56789 98765'));
?>
내가 얻는 결과는 다음과 같습니다.
12345 56789 98765
56789 12345 98765
12345 98765 56789
98765 12345 56789
56789 98765 12345
98765 56789 12345
2가지 요소 크기의 출력 조합을 얻을 수 있습니까? 순서는 상관없으니 만약에A B
조합으로 얻어지므로 그 반대는 필요하지 않습니다(B A
).
답변1
당신에게 필요한 것은 printf.
그것 뿐입니다 print function
. 그리고 그것이 바로 그것입니다.
printf '%s\t%s\n' ${array[@]}
당신은 이렇게 합니다:
( set -- 12345 56789 98765; for i ; do
eval set -- $(printf '"$%s" ' `seq 2 $#` 1)
echo "$*"
done )
산출
56789 98765 12345
98765 12345 56789
12345 56789 98765
그럴 필요는 없어요 eval
. 그건 멍청한 짓이에요. 더 나은 방법은 다음과 같습니다.
( set -- 12345 56789 98765 ;
until [ $((i=i+1)) -gt $# ] ; do
set -- $(s=$1 ; shift ; printf '%s\n' "$@" "$s")
printf '%s ' "$@" ; echo
done)
산출
56789 98765 12345
98765 12345 56789
12345 56789 98765
그런 다음 두 개의 요소만 원하는 경우 약간만 변경하면 됩니다. 한 줄만 더 추가하면 됩니다.
( set -- 12345 56789 98765 ;
until [ $((i=i+1)) -ge $# ] ; do
set -- $(s=$1 ; shift ; printf '%s\n' "$@" "$s")
v="${v}$(printf '%s ' "$@")"
done ; printf "%s\t%s\n" $v
)
산출
56789 98765
12345 98765
12345 56789
나는 항상 그렇게 하지만 결코 부끄러워하지 않습니다. 저는 항상 실제 쉘 배열을 사용하여 작업하므로 이를 익히는 데 몇 분이 걸렸습니다.
다음은 다른 답변을 위해 제가 작성한 작은 스크립트입니다.
abc="a b c d e f g h i j k l m n o p q r s t u v w x y z"
for l in $abc ; do {
h= c= ; [ $((i=i+1)) -gt 26 ] && n=$((n+26)) i=
xyz=$(x=${xyz:-$abc} ;\
printf %s\\n ${x#?} $l)
mid=$(set -- $xyz ; eval echo \$$((${#}/4))) ;\
echo "$mid $l" >&2 ;
[ $(((i+n)%${mod=3})) -eq 0 ] && c="$mid" h="${xyz%"$mid"*}"
line="$(printf '%s ' $h $c ${xyz#"$h"})"
printf "%s$(printf %s ${xyz#?}${mid})\n" \
${line} >|/tmp/file$((i+n))
} ; done
그러면 26개의 파일이 작성됩니다. 이는 다음과 같습니다. 각 파일에 대해 증가했습니다.
bcdefghijklmnopqrstuvwxyzag
ccdefghijklmnopqrstuvwxyzag
dcdefghijklmnopqrstuvwxyzag
ecdefghijklmnopqrstuvwxyzag
fcdefghijklmnopqrstuvwxyzag
gcdefghijklmnopqrstuvwxyzag
hcdefghijklmnopqrstuvwxyzag
icdefghijklmnopqrstuvwxyzag
jcdefghijklmnopqrstuvwxyzag
kcdefghijklmnopqrstuvwxyzag
lcdefghijklmnopqrstuvwxyzag
mcdefghijklmnopqrstuvwxyzag
ncdefghijklmnopqrstuvwxyzag
ocdefghijklmnopqrstuvwxyzag
pcdefghijklmnopqrstuvwxyzag
qcdefghijklmnopqrstuvwxyzag
rcdefghijklmnopqrstuvwxyzag
scdefghijklmnopqrstuvwxyzag
tcdefghijklmnopqrstuvwxyzag
ucdefghijklmnopqrstuvwxyzag
vcdefghijklmnopqrstuvwxyzag
wcdefghijklmnopqrstuvwxyzag
xcdefghijklmnopqrstuvwxyzag
ycdefghijklmnopqrstuvwxyzag
zcdefghijklmnopqrstuvwxyzag
acdefghijklmnopqrstuvwxyzag
답변2
두 가지 요소 크기의 조합으로 요소를 인쇄하는 방법을 찾았습니다. PHP 코드는 다음과 같습니다.
<?php
function pc_array_power_set($array) {
// initialize by adding the empty set
$results = array(array( ));
foreach ($array as $element)
foreach ($results as $combination)
array_push($results, array_merge(array($element), $combination));
return $results;
}
$set = array('12345', '56789', '98765');
$power_set = pc_array_power_set($set);
foreach (pc_array_power_set($set) as $combination) {
if (2 == count($combination)) {
print join("\t", $combination) . "\n";
}
}
?>
위의 코드는 출력을 다음과 같이 인쇄합니다.
56789 12345
98765 12345
98765 56789
위 코드에 대한 참조는 다음과 같습니다.여기.