Bash 스크립트를 사용하여 컬렉션의 모든 하위 집합을 인쇄하는 방법. 예: {} , {1} , {2} , {1,2} for A={1,2} 이것은 제가 이미 작성한 내용이지만 항상 스크립트에 더 좋은 방법이 있을 것이라고 생각했습니다. 또한 인쇄만 가능합니다. 구성원이 1~2명이지만 전부는 아닌 하위 집합
이 스크립트를 완료하거나 다시 작성하는 데 도움을 주시면 매우 감사하겠습니다.
#!/bin/bash
# Created By: Amirreza Firoozi
# License : GPL3+
power() {
echo $(( $1 ** $2 ))
}
update(){
a=${SET[i]}
b=${SET[j]}
}
read -p "Please Enter the set like A={1,q,9} : " TSET
echo "$TSET" | sed -e 's/.*=//' -e 's/[{}]//g' -e 's/,/\n/g' > TSET.txt
MEM_NUM=$(cat "TSET.txt" | wc -l)
ZIR_NUM=$(power 2 $MEM_NUM)
mapfile -t SET <TSET.txt
for i in "" ${SET[@]};do
echo "{$i}"
done
RESIGN(){
i=0
j=1
}
RESIGN
m2(){
while [ 1 == 1 ];do
if [ $i == $(($MEM_NUM - 1)) ];then
break
fi
while [ "$j" != $MEM_NUM ];do
update
echo "{$a,$b}"
((j++))
done
((i++))
j=$(($i+1))
done
}
m2
RESIGN
답변1
binary
각 하위 집합에 대한 표시 함수로 배열을 사용합니다 .
#!/bin/bash
# Prepare the indicator, set to all zeros.
binary=()
for (( i=0; i<=$#; i++ )) ; do
binary[i]=0
done
while (( ! binary[$#] )) ; do
# Print the subset.
printf '{ '
for (( j=0; j<$#; j++ )) ; do
(( i=j+1 ))
(( binary[j] )) && printf '%s ' ${!i}
done
printf '}\n'
# Increment the indicator.
for (( i=0; binary[i]==1; i++ )) ; do
binary[i]=0
done
binary[i]=1
done
답변2
다음은 프로그램의 작동 버전입니다.
#!/bin/bash
# Created By: Amirreza Firoozi
# License : GPL3+
read -p "Please Enter the set like A={1,q,9} : " TSET
echo "$TSET" | sed -e 's/.*=//' -e 's/[{}]//g' -e 's/,/\n/g' > TSET.txt
MEM_NUM=$(cat "TSET.txt" | wc -l)
ZIR_NUM=$(( 2 ** MEM_NUM))
mapfile -t SET <TSET.txt
# Created By: Petr Skocik
# License : Public Domain
IFS=,; for((i=0;i<ZIR_NUM;i++)); do
combo=()
for((j=0;j<MEM_NUM;j++));do
(( (i & 2**j) == 0 )) || combo+=( "${SET[j]}" )
done
printf '{%s}\n' "${combo[*]}"
done