SORU1:Bir satranç tahtasına üç piyon kaç farklı şekilde yerleştirilir,(piyonlar aynı kabul edilecek)?
SORU2:Bir satranç tahtasına üç piyon yerleştirilecek ama herhangi bir piyonun üstünde altında sağında solunda çaprazında başka bir piyon olmayacak bu durum kaç farklı şekilde gerçekleşir?
yanlış gönderdim doğrusu bu soru 1 için eğer 3*3 lük satranç tahtası olsaydı;
import itertools
a=itertools.permutations([1,1,1,0,0,0,0,0,0],9)
print(len(set(list(a))))
İlk soru kolay, kombinasyon ile hallediliyor. Piyonlar özdeş olduğu için tek yapmamız gereken 64 kare içinden 3 tanesini seçmek:
import math
F = math.factorial
def C(x, y):
return F(x) / (F(x-y) * F(y))
>>> C(64, 3)
41664.0
evet ilki kolay basit bi kombinasyon işlemi ile kaç durum olduğu bulunur .Benim isteğim ilk soru için o 41664 durumun hepsinide veren kodu yazmak
2.soru için ise hem cevabı bulmak hem kodu yazmak çok daha zor
Yoo kodu yazmak çok kolay, sadece işlem uzun sürüyor
import itertools
satranç_tahtası = [1,1,1] + [0 for i in range(61)]
olasılıklar = itertools.permutations(satranç_tahtası, 64)
print(len(set(olasılıklar)))
evet bu kodla çok kolay da işte ben cevabı merak ettiğim için bunu bekliyecek kadar vaktim yok Tahminen ne kdar sürer az sürecekse bekleyeyim
onun için cevabı daha kısa sürede verecek alternatif bişey arıyorum
birde o code 1.soru için cevap oluyor sadece
Bu durumları tam olarak hangi formatta istiyorsunuz? Eğer yorumlamayı biliyorsanız bu da o durumların hepsini verir:
import itertools
olasılıklar = list(itertools.combinations(range(64), 3))
siz kaçıncı yerde 1 olmalı onu veren kodu verdiniz ben onlarıda o listeye eklemek istyorum
mesela 3*3 lük için (1,1,1,0,0,0,0,0,0) gibi
Sanırım bu ikinci soruyu çözüyor:
import itertools
olasılıklar = itertools.combinations(range(64), 3)
class Taş():
__slots__ = ("x", "y")
def __init__(self):
self.x, self.y = 0,0
def __repr__(self):
return f"Taş({self.x}, {self.y})"
t1, t2, t3 = (Taş() for i in range(3))
sonuç = []
for olasılık in olasılıklar:
t1.y , t1.x = divmod(olasılık[0], 8)
t2.y , t2.x = divmod(olasılık[1], 8)
t3.y , t3.x = divmod(olasılık[2], 8)
if t1.x == t2.x or t1.x == t2.x or t2.x == t3.x:
continue
if t1.y == t2.y or t1.y == t2.y or t2.y == t3.y:
continue
sonuç.append(olasılık)
import itertools
olasılıklar = itertools.combinations(range(64), 3)
liste = [0 for i in range(64)]
sonuç = []
for i in olasılıklar:
l = liste.copy()
for j in i:
l[j] = 1
sonuç.append(l)
harika teşekkür ederim
2.soru için bu çok kullanışlı olacaktır onun için bunu 1.soru yapmıştım sağolun
burada tam olarak anlayamadım ne olup bittiğini
Bu şartı kontrol ediyordu ama çaprazı unutmuşum, bu kod sadece sağında solunda üstünde ve altında için kontrol ediyor. (onda da hatalı kontrol ediyor, kopyaladığım bir yeri düzeltmeyi unutmuşum)
aynı satırda ve sütunda olup olmadığını kontrol ediyor gibi geldi bana
Sizin istediğiniz o değil mi zaten?
mayın tarlası gibi düşünün çevreleyen 8 taneden birinde olmayacak (ortada olan için)
Keşke en başta söyleseydiniz Benim anladığım şekli ile çözümü bu:
import itertools
olasılıklar = itertools.combinations(range(64), 3)
class Taş():
__slots__ = ("x", "y")
def __init__(self):
self.x, self.y = 0,0
def __repr__(self):
return f"Taş({self.x}, {self.y})"
t1, t2, t3 = (Taş() for i in range(3))
sonuç = []
for olasılık in olasılıklar:
t1.y , t1.x = divmod(olasılık[0], 8)
t2.y , t2.x = divmod(olasılık[1], 8)
t3.y , t3.x = divmod(olasılık[2], 8)
if t1.x == t2.x or t1.x == t3.x or t2.x == t3.x:
continue
if t1.y == t2.y or t1.y == t3.y or t2.y == t3.y:
continue
if abs(t1.y - t2.y) != abs(t1.x - t2.x) and abs(t1.y - t3.y) != abs(t1.x - t3.x) and abs(t2.y - t3.y) != abs(t2.x - t3.x):
sonuç.append(olasılık)
Onu da siz yapın istiyorsanız.
tam olarak anlatamadım kendimi yordum sizide kusura bakmayın ama gerçekten çok yardımcı oldunuz ben biraz daha kafa yorayım bulucam inşallah