0

「製品」と言う表示インターフェイスを作成しています。この例では、ディスプレイに最大 4 つの製品が表示されるとします。製品のソースはさまざまです。ソースの数が、表示する製品の数よりも大きくなることはありません (この例では最大 4 つのソース)。各ソースには 1 つ以上の製品が含まれます。目標は、表示される製品の数をソース全体に均等に分配することです。

4 つの製品のロジックは次のように処理されます。

  • ソースが1 つの場合、そのソースから 4 つの項目が選択されます。 (4x1)
  • ソースが4 つある場合は、各ソースから 1 つのアイテムが選択されます。(1x1+1x1+1x1+1x1)
  • 2 つのソースがある場合、各ソース (2x1+2x1) から 2 つのアイテムが選択されます。一方のソースに製品が 1 つしかない場合を除き、(1x1+3x1) のようになります
  • 3 つのソースがある場合、2 つのソースから 1 つのアイテムが選択され、1 つのソースから 2 つのアイテムが選択されます(2x1+1x1+1x1)。

製品を出力するためのループを開始する前に、ソースのコレクションと各ソースの項目数を取得します。

私の質問は:

各ソースをループして適切な量の製品を出力する最も簡単な方法は何ですか?

各ソースには 1 つの製品しかない可能性があるため、4 つの製品を選択できない可能性があることに注意してください。

4

2 に答える 2

2

製品を選択するための簡単な Python コードを次に示します。

ソースをループして、一度に 1 つの製品を追加することで機能します。

これにより、ソース間で公平な分配が行われるはずです。

コードが遅すぎる場合は、コードをより効率的にすることができます。

Z=[1,10,10]       # Number of products available for each source
Y=len(Z)          # Number of sources
X=4               # number of products to output
B=[0]*Y           # Number of products to select for each source

a=0               # Next source to try and take a product from
while sum(B)<min(sum(Z),X):
    a=(a+1)%Y     # Change to a different source for the next product
    if B[a]<Z[a]: # Check that this source still has products left
        B[a]+=1   # Note that we have taken a product from source a

print B

この例では、印刷します

[1, 2, 1]

最初のソースから 1 つの製品、2 番目のソースから 2 つ、3 番目のソースから 1 つの製品を取得することを意味します。

于 2012-11-27T20:01:19.650 に答える
1

これはC#で記述されたプログラムのサンプルで、IDで識別されるソース、各ソースで利用可能な製品の数、および選択された製品(それぞれにソースIDが付加されている)を証明として出力します。

using System.Linq;
using System.Collections.Generic;
using System;

namespace ConsoleApplication1
{
    class Product
    {
        public int Ordinal { get; set; }
        public Source Source { get; set; }
        public Product(int ordinal)
        {
            Ordinal = ordinal;
        }
    }
    class Source : List<Product>
    {
        public int Id { get { return this.GetHashCode(); } }
        public int AvailableProducts { get { return this.Count; } }
        public Source(int availableProducts)
        {
            for (int i = 0; i < availableProducts; i++)
            {
                var p = new Product(i);
                p.Source = this;
                this.Add(p);
            }
        }
    }

    class Sources : List<Source>
    {
    }


    class Program
    {
        static void Main(string[] args)
        {
            var sources = new Sources();
            var productsToBeSelected = 4;
            var sourceNumber = Math.Min(productsToBeSelected, 4);
            var maxProductsPerSource = 5;

            for (int i = 0; i < sourceNumber; i++)
            {
                var source = new Source((new Random(i + Int32.Parse(DateTime.Now.Ticks.ToString().Substring(DateTime.Now.Ticks.ToString().Length - 6)))).Next(maxProductsPerSource));
                sources.Add(source);
            }

            var candidateProducts=new List<Product>();
            sources.ForEach(i=>i.ForEach(p=>candidateProducts.Add(p)));

            var selectedProducts = candidateProducts.OrderBy(i => i.Ordinal).Take(productsToBeSelected);

            foreach (var item in sources)
            {
                Console.WriteLine("Source ID: {0}, {1} products",item.Id, item.Count);
            }

            foreach (var item in selectedProducts)
            {
                Console.WriteLine("Product ordinal: {0} from source {1}", item.Ordinal , item.Source.Id);
            }
        }
    }
}
于 2012-11-27T21:06:58.020 に答える