Satranç tahtası ve piyonlar

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))))
1 Beğeni

İ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
1 Beğeni

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 :slightly_smiling_face:

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)))
1 Beğeni

evet bu kodla çok kolay da işte ben cevabı merak ettiğim için bunu bekliyecek kadar vaktim yok :slight_smile: 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))
1 Beğeni

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)

1 Beğeni
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 :sweat_smile: 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 :slight_smile:

1 Beğeni