using System;using System.Linq;publicclassKata{publicstaticintNextProduct(int[] dr,int[] ast){
Console.WriteLine(string.Join(",", dr.Select(x => x)));
Console.WriteLine(string.Join(",", ast.Select(x => x)));int maxD = dr.Sum();int maxS = ast.Sum();
dr = dr.Select(x => x *100/ maxD).ToArray();
ast = ast.Select(x => x *100/ maxS).ToArray();int r = dr[0]- ast[0];int ans =0;int j =0;if(dr[0]- ast[0]==0) j++;for(int i =1; i < dr.Length; i++){int temp =(dr[i]- ast[i]);if(temp ==0) j++;if(temp < r && temp >0){ r = temp; ans = i;}elseif(temp > r){ r = temp; ans = i;}if(j == dr.Length) ans =-1;}return ans;}}
答案3:
using System.Linq;using System;publicclassKata{publicstaticintNextProduct(int[] desiredRatio,int[] actualStock){double sumDesired =(double)desiredRatio.Sum();int sumAcutual = actualStock.Sum();double[] desireDecimal =ConvertToDecimal(desiredRatio, sumDesired);double[] actualeDecimal =ConvertToDecimal(actualStock, sumAcutual);if(differentPossibility(desireDecimal, actualeDecimal)==0){return-1;}double[] diffRatio =newdouble[actualStock.Length];for(int i =0; i < actualStock.Length; i++){int[] copy = actualStock.Select(x => x).ToArray();
copy[i]= copy[i]+1;
actualeDecimal =ConvertToDecimal(copy,sumAcutual+1);
diffRatio[i]=differentPossibility(desireDecimal, actualeDecimal);}int result =0;double minD = diffRatio[0];for(int i =0; i < diffRatio.Length; i++){if(diffRatio[i]< minD){
minD = diffRatio[i];
result = i;}}return result;}privatestaticdouble[]ConvertToDecimal(int[] ratio,double sumRatio ){return ratio.Select(x => x / sumRatio).ToArray();}privatestaticdoubledifferentPossibility(double[] desireDecimal,double[] actualeDecimal){double diff =0;for(int i =0; i < desireDecimal.Length; i++){
diff += Math.Abs(desireDecimal[i]- actualeDecimal[i]);}return diff;}}
答案4:
using System;publicclassKata{publicstaticintNextProduct(int[] desiredRatio,int[] actualStock){double[] desiredPercentage =newdouble[desiredRatio.Length];int sum =0;foreach(int i in desiredRatio) sum += i;for(int i =0; i < desiredRatio.Length; i++)
desiredPercentage[i]=100.0* desiredRatio[i]/ sum;double[] possibleDiffs =newdouble[actualStock.Length];
sum =0;foreach(int i in actualStock) sum += i;double diff =0;for(int i =0; i < actualStock.Length; i++)
diff += Math.Abs(100.0* actualStock[i]/ sum - desiredPercentage[i]);if(diff ==0)return-1;for(int i =0; i < actualStock.Length; i++){
diff =0;for(int j =0; j < actualStock.Length; j++){int stock = actualStock[j];if(i == j) stock++;double offset =(100.0* stock)/(sum +1)- desiredPercentage[j];if(offset <0) diff -= offset;else diff += offset;}
possibleDiffs[i]= diff;}double min =100.0;int index =-1;for(int i =0; i < possibleDiffs.Length; i++){if(possibleDiffs[i]< min){
min = possibleDiffs[i];
index = i;}}return index;}}
答案5:
using System;using System.Collections.Generic;using System.Linq;publicclassKata{publicstaticintNextProduct(int[] desiredRatio,int[] actualStock){var desiredPercentages = desiredRatio.Select(element => element *100/(double)desiredRatio.Sum());var actualPercentages = actualStock.Select(element => element *100/(double)actualStock.Sum());if(desiredPercentages.SequenceEqual(actualPercentages)){return-1;}var differences =newList<double>();for(var i =0; i < actualStock.Length; i++){
actualStock[i]+=1;var producedPercentages = actualStock.Select(element => element *100/ actualStock.Sum()).ToArray();
differences.Add(producedPercentages.Zip(desiredPercentages,(i1, i2)=> Math.Abs(i2 - i1)).Sum());
actualStock[i]-=1;}return differences.LastIndexOf(differences.Min());}}