2016-07-04 7 views
0

Ich versuche, den Rest so gleichmäßig wie möglich aufzuteilen, wobei var nicht in die Array-Anzahl teilbar ist.Teilen Sie den in var definierten Wert so gleichmäßig wie möglich in ein Array variabler Länge.

Ich habe Folgendes versucht, was mir eine abgerundete Aufteilung in den Array-Artikel gibt. Ich suche nach einer Möglichkeit, den Rest zu identifizieren und dann so gleichmäßig wie möglich in jeden Array-Indexwert aufzuteilen.

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

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

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

    done 

Beispiel1:

Input:

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

Ideal Output:

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

EXAMPLE2:

Input:

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

Ideal Ausgang:

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

ich auch sein könnte, die Zuerst, um es zu sagen ... Was hast du probiert? (Und als Bonus wäre es großartig, wenn Sie "so gleichmäßig wie möglich" definieren könnten.) – jas

+1

einige verbale Beschreibung dessen, was Ihre "Regel" ist, könnte dazu beitragen, dieses Q weniger zweideutig zu machen. Ich sehe 4 Eingänge und 3 Ausgänge. "Gleichmäßig geteilt" bedeutet für mich 2 Ausgänge. Wiederum 6 Eingänge und 6 Ausgänge, nicht 3? Und macht die erste Zeile der Eingabe, d. H. "Var = 33" Teil der Eingabe (aber nicht ausgegeben), oder was bedeutet es im Zusammenhang mit Ihrem Problem? – shellter

+0

Entschuldigung, bitte Änderungen und Danke für Feedback – user1654528

Antwort

1

Sie müssen nur die Eingabe durch die Anzahl der Ausgabeschlitze teilen. Die Shell führt nur Integer-Divisionen aus, daher ist das Ergebnis die Nummer, die in jedem Slot gespeichert wird. Der Rest der Division sagt Ihnen, wie viele Steckplätze das Ergebnis plus eine erhalten.

Als konkretes Beispiel

$ 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

dass Indizierung Ihrer Array-Variable beginnt bei 0 Unter der Annahme, und ist der folgende Code zusammenhängenden wird tun, was Sie wollen:

n=${#variableLengthArray[@]} 
ratio=$(($var/$n)) 
rem=$(($var % $n)) 
for i in ${!variableLengthArray[@]} ; do 
    variableLengthArray[$i]=$(($ratio + ($i < $rem ? 1 : 0))) 
done 
Verwandte Themen