Boya Karışımı Problemi

On sekiz farklı renkteki boya seti kullanılarak karışımlar oluşturulacaktır.

-Her karışım 6 farklı renkten oluşacaktır.
-Üç farklı rengin olduğu her kombinasyon en az bir karışımda bulunacaktır.

Bu kurallara göre oluşturulacak karışımların sayısı en az kaç olabilir?

Soru 6 renklik bir set, 3 renklik karışımlar ve 2 rengin yer aldığı kombinasyonlar için sorulsaydı cevap 6 olurdu:

(1-2-4), (1-3-6), (1-4-5), (2-3-5), (2-5-6), (3-4-6)

ben şu üç farklı rengin olduğu her kombinasyon kısmını anlayamadım

Üç farklı rengin olduğu kombinasyonları mümkün olduğunca aynı karışıma sığdırmaya çalışacağız.

6 renklik örnek için bunlar oluyor:

import itertools
for i in itertools.combinations((1,2,3,4,5,6), 2):
	print(i)

Ve asıl sorudaki 18 renk için bunlar:

import itertools
for i in itertools.combinations((i for i in range(1, 19)), 3):
	print(i)

Cevap 40’dan büyük olacak.

>>> import math
>>> def C(x, y):
    return math.factorial(x) / (math.factorial(x-y) * math.factorial(y))
>>> C(18, 3) / C(6, 3)
40.8
1 Beğeni

Evet ama nasıl ?
En az olması sıkıntı random ve itertools modülünü kullanarak rastgele belirleyebildim en azmı bilemiyorum

Evet bende öyle düşündüm doğru yaklaşım gibi ama hepside farklı yapılamaz illaki tekrarlar olacak

Bu işimizi görüyor mu acaba:

[{1, 2, 3, 4, 5, 6}, {1, 2, 3, 4, 7, 8}, {1, 2, 3, 4, 9, 10}, {1, 2, 3, 4, 11, 12}, {1, 2, 3, 4, 13, 14}, {16, 1, 2, 3, 4, 15}, {1, 2, 17, 18, 3, 4}, {1, 2, 5, 6, 7, 8}, {1, 2, 5, 6, 9, 10}, {1, 2, 5, 6, 11, 12}, {1, 2, 5, 6, 13, 14}, {16, 1, 2, 5, 6, 15}, {1, 17, 2, 18, 5, 6}, {1, 2, 7, 8, 9, 10}, {1, 2, 7, 8, 11, 12}, {1, 2, 7, 8, 13, 14}, {16, 1, 2, 7, 8, 15}, {1, 17, 2, 18, 7, 8}, {1, 2, 9, 10, 11, 12}, {1, 2, 9, 10, 13, 14}, {16, 1, 2, 9, 10, 15}, {1, 17, 18, 2, 9, 10}, {1, 2, 11, 12, 13, 14}, {16, 1, 2, 11, 12, 15}, {1, 17, 2, 18, 11, 12}, {16, 1, 2, 13, 14, 15}, {1, 17, 2, 18, 13, 14}, {16, 1, 17, 2, 18, 15}, {3, 4, 5, 6, 7, 8}, {3, 4, 5, 6, 9, 10}, {3, 4, 5, 6, 11, 12}, {3, 4, 5, 6, 13, 14}, {16, 3, 4, 5, 6, 15}, {17, 18, 3, 4, 5, 6}, {3, 4, 7, 8, 9, 10}, {3, 4, 7, 8, 11, 12}, {3, 4, 7, 8, 13, 14}, {16, 3, 4, 7, 8, 15}, {17, 18, 3, 4, 7, 8}, {3, 4, 9, 10, 11, 12}, {3, 4, 9, 10, 13, 14}, {16, 3, 4, 9, 10, 15}, {17, 18, 3, 4, 9, 10}, {3, 4, 11, 12, 13, 14}, {16, 3, 4, 11, 12, 15}, {17, 18, 3, 4, 11, 12}, {16, 3, 4, 13, 14, 15}, {17, 18, 3, 4, 13, 14}, {16, 17, 18, 3, 4, 15}, {5, 6, 7, 8, 9, 10}, {5, 6, 7, 8, 11, 12}, {5, 6, 7, 8, 13, 14}, {16, 5, 6, 7, 8, 15}, {17, 18, 5, 6, 7, 8}, {5, 6, 9, 10, 11, 12}, {5, 6, 9, 10, 13, 14}, {16, 5, 6, 9, 10, 15}, {17, 18, 5, 6, 9, 10}, {5, 6, 11, 12, 13, 14}, {16, 5, 6, 11, 12, 15}, {17, 18, 5, 6, 11, 12}, {16, 5, 6, 13, 14, 15}, {17, 18, 5, 6, 13, 14}, {16, 17, 18, 5, 6, 15}, {7, 8, 9, 10, 11, 12}, {7, 8, 9, 10, 13, 14}, {16, 7, 8, 9, 10, 15}, {17, 18, 7, 8, 9, 10}, {7, 8, 11, 12, 13, 14}, {16, 7, 8, 11, 12, 15}, {17, 18, 7, 8, 11, 12}, {16, 7, 8, 13, 14, 15}, {17, 18, 7, 8, 13, 14}, {16, 17, 18, 7, 8, 15}, {9, 10, 11, 12, 13, 14}, {16, 9, 10, 11, 12, 15}, {17, 18, 9, 10, 11, 12}, {16, 9, 10, 13, 14, 15}, {17, 18, 9, 10, 13, 14}, {16, 17, 18, 9, 10, 15}, {16, 11, 12, 13, 14, 15}, {17, 18, 11, 12, 13, 14}, {16, 17, 18, 11, 12, 15}, {16, 17, 18, 13, 14, 15}]

kontrol ettim yazdığınız küme sağlıyor.Ama en küçük olduğunu garanti edebilirmiyiz sıkıntı orda.Ayrıca benden çok daha az elemanlı bulmuşsunuz tebrikler :slight_smile:

istenen=False
while istenen==False:
    a=itertools.combinations(range(1,19),6)
    b=itertools.combinations(range(1,19),3)
    c=[(1, 2, 3, 4, 5, 6), (1, 2, 3, 4, 7, 8), (1, 2, 3, 4, 9, 10), (1, 2, 3, 4, 11, 12), (1, 2, 3, 4, 13, 14), (1, 2, 3, 4, 15, 16), (1, 2, 3, 4, 17, 18), (1, 2, 5, 6, 7, 8), (1, 2, 5, 6, 9, 10), (1, 2, 5, 6, 11, 12), (1, 2, 5, 6, 13, 14), (1, 2, 5, 6, 15, 16), (1, 2, 5, 6, 17, 18), (1, 2, 7, 8, 9, 10), (1, 2, 7, 8, 11, 12), (1, 2, 7, 8, 13, 14), (1, 2, 7, 8, 15, 16), (1, 2, 7, 8, 17, 18), (1, 2, 9, 10, 11, 12), (1, 2, 9, 10, 13, 14), (1, 2, 9, 10, 15, 16), (1, 2, 9, 10, 17, 18), (1, 2, 11, 12, 13, 14), (1, 2, 11, 12, 15, 16), (1, 2, 11, 12, 17, 18), (1, 2, 13, 14, 15, 16), (1, 2, 13, 14, 17, 18), (1, 2, 15, 16, 17, 18), (3, 4, 5, 6, 7, 8), (3, 4, 5, 6, 9, 10), (3, 4, 5, 6, 11, 12), (3, 4, 5, 6, 13, 14), (3, 4, 5, 6, 15, 16), (3, 4, 5, 6, 17, 18), (3, 4, 7, 8, 9, 10), (3, 4, 7, 8, 11, 12), (3, 4, 7, 8, 13, 14), (3, 4, 7, 8, 15, 16), (3, 4, 7, 8, 17, 18), (3, 4, 9, 10, 11, 12), (3, 4, 9, 10, 13, 14), (3, 4, 9, 10, 15, 16), (3, 4, 9, 10, 17, 18), (3, 4, 11, 12, 13, 14), (3, 4, 11, 12, 15, 16), (3, 4, 11, 12, 17, 18), (3, 4, 13, 14, 15, 16), (3, 4, 13, 14, 17, 18), (3, 4, 15, 16, 17, 18), (5, 6, 7, 8, 9, 10), (5, 6, 7, 8, 11, 12), (5, 6, 7, 8, 13, 14), (5, 6, 7, 8, 15, 16), (5, 6, 7, 8, 17, 18), (5, 6, 9, 10, 11, 12), (5, 6, 9, 10, 13, 14), (5, 6, 9, 10, 15, 16), (5, 6, 9, 10, 17, 18), (5, 6, 11, 12, 13, 14), (5, 6, 11, 12, 15, 16), (5, 6, 11, 12, 17, 18), (5, 6, 13, 14, 15, 16), (5, 6, 13, 14, 17, 18), (5, 6, 15, 16, 17, 18), (7, 8, 9, 10, 11, 12), (7, 8, 9, 10, 13, 14), (7, 8, 9, 10, 15, 16), (7, 8, 9, 10, 17, 18), (7, 8, 11, 12, 13, 14), (7, 8, 11, 12, 15, 16), (7, 8, 11, 12, 17, 18), (7, 8, 13, 14, 15, 16), (7, 8, 13, 14, 17, 18), (7, 8, 15, 16, 17, 18), (9, 10, 11, 12, 13, 14), (9, 10, 11, 12, 15, 16), (9, 10, 11, 12, 17, 18), (9, 10, 13, 14, 15, 16), (9, 10, 13, 14, 17, 18), (9, 10, 15, 16, 17, 18), (11, 12, 13, 14, 15, 16), (11, 12, 13, 14, 17, 18), (11, 12, 15, 16, 17, 18), (13, 14, 15, 16, 17, 18)]
    ekle=[]
    for i in c:
        d=itertools.combinations(i,3)
        for j in d:
            ekle.append(j)
    if set(ekle)==set(b):
        print(set(ekle))
        print(len(c))
        istenen=True
1 Beğeni

Bence de daha az elemanlı bulunabilir ama nasıl bir yol izlemeliyiz bilmiyorum, o sonucu da şu kodla bulmuştum:

from itertools import combinations

boya_sayısı = 18
kombinasyonlardaki_boya_sayısı = 3
karışımdaki_boya_sayısı = 6

boyalar = [i for i in range(1, boya_sayısı + 1)]

üçlü_kombinasyonlar = list(combinations(boyalar, kombinasyonlardaki_boya_sayısı))

son_karışımlar = []

while üçlü_kombinasyonlar:
    karışım = set()
    index = 0
    ilk_set = set(üçlü_kombinasyonlar[0])
    while len(karışım) != karışımdaki_boya_sayısı and karışım not in son_karışımlar:
        index += 1
        karışım = ilk_set | set(üçlü_kombinasyonlar[index])
        
    son_karışımlar.append(karışım)

    üçlü_kombinasyonlar.pop(0)
    üçlü_kombinasyonlar.pop(index - 1)


sonuç = []

for i in son_karışımlar:
    if i not in sonuç:
        sonuç.append(i)

print(sonuç)
print("\n", len(sonuç))
#84

Bir de bir dahakine sorularınızı daha açıklayıcı bir şekilde sorun istiyorsanız.