2016-07-04 7 views
0

varを配列数で割り切れない場合は、できるだけ均等に分割しようとしています。可能な限り均等にvarで定義された値を可変長配列に分割します。

私は以下のことを試しました。これは、配列項目に丸められた分割を与えます。私は余りを識別し、各配列のインデックス値にできるだけ均等に分割する方法を探しています。

for n in ${!variableLengthArray[@]} ; do 

     divideCount=$((${variableLengthArray[$n]}/$var)) 

     variableLengthArray[$n]=$(echo "($divideCount+0.5)/1" | bc) 

    done 

EXAMPLE1:

入力:

var=11 
    variableLengthArray[0]=0 
    variableLengthArray[1]=0 
    variableLengthArray[2]=0 

理想的な出力:

variableLengthArray[0]=4 
    variableLengthArray[1]=4 
    variableLengthArray[2]=3 

EXAMPLE2:

入力:

var=33 
    variableLengthArray[0]=0 
    variableLengthArray[1]=0 
    variableLengthArray[2]=0 
    variableLengthArray[3]=0 
    variableLengthArray[4]=0 
    variableLengthArray[5]=0 

理想的な出力:

variableLengthArray[0]=6 
    variableLengthArray[1]=6 
    variableLengthArray[2]=6 
    variableLengthArray[3]=5 
    variableLengthArray[4]=5 
    variableLengthArray[5]=5 
+4

私もあるかもしれませんまずそれを言う...あなたは何を試しましたか? (そして、ボーナスとして、「可能な限り均等に」定義することができれば素晴らしいでしょう。) – jas

+1

あなたの「ルール」が何であるかを口頭で説明すると、このQをあいまいにするのに役立ちます。私は4つの入力と3つの出力を見る。私には「均等に分割」され、2つのアウトプットを意味します。ここでも、3入力ではなく6入力と6出力です。入力の最初の行、つまり 'var = 33 'は入力の一部です(出力ではありません)。そうでなければ、問題の文脈ではどういう意味ですか? – shellter

+0

ご迷惑をおかけしますが、ご意見、ご感想などをご覧ください – user1654528

答えて

1

あなただけの出力スロット数で入力を分割する必要があります。シェルは整数除算だけを実行するので、結果は各スロットに格納する数値になります。除算の残りの部分は、結果がに1つプラスを加えたスロット数を示します。

、あなたの配列変数のインデックスと仮定すると

$ var=11 
$ slots=3 
$ result=$((var/slots)) 
$ k=$((var % slots)) 
$ for ((i=0; i<k; i++)); do 
> variableLengthArray[i]=$((result + 1)) 
> done 
$ for ((i=k; i < slots; i++)); do 
> variableLengthArray[i]=$result 
> done 
1

は0から始まり、次のコードは、あなたがやりたいだろう連続している具体的な例としては:

n=${#variableLengthArray[@]} 
ratio=$(($var/$n)) 
rem=$(($var % $n)) 
for i in ${!variableLengthArray[@]} ; do 
    variableLengthArray[$i]=$(($ratio + ($i < $rem ? 1 : 0))) 
done 
関連する問題