Altıgenler ve 2020

Tzv oyun eski yıllar soruları ,sorumaratonu soruları,puzzleup,emrehan halicinin zeka oyunları kitaplarından birde projecteuler sitesinden genelde
Bu soru Tzv oyun2020 yarıfinal sorusuydu

Ne yapmak istediğinizi anlayamadım

Benim de ne yapmam gerektiğini anlamam zaman almıştı :smile:

Cevabımdan eminim bir yandan sizede güveniyorum bilemedim :slight_smile:
Mesela üç hücreyi bağlama ne oluyor

Arama işinin çok az kod içerdiğini fark etmişsinizdir, bunu yapmamı sağlayan şey her hücrenin etrafındaki hücreleri bir liste olarak barındırması.

Şöyle bir mantıkmı var yani her hücrenin etrafındakileri bir listeye alıp
Eğer hücre 2ise hücrenin listesine gir ordan 0 ı seç bu sefer sıfırın listesine gir oradan 2yi seç
Şeklinde ilerlediniz?

Evet.

Aslında şekil simetrik olduğundan sadece 3 tane hücrenin sonuçlarını bulunca 6ile çarpmak yeterli budavar Ortadaki 2ve dışdakilerden ortadaki ile kenardakini

Simetriye dayanırsak olasılıklar eksik çıkar diye düşünüyorum.

Matematiksel olarak mesela en üstteki 2 ile en alttaki 2den oluşan 2020 sayısı aynı sayma işlemini kolaylaştırmak için simetriden faydalanmak işi kolaylaştırır ama
Algoritma üzerine etkisi nasıl olur siz daha iyi bilirsiniz

Algoritmayı koda yanlış aktarmış olabilirim, şimdi ufak sayılarla deniyorum.

Evet bir hata var.

Tebrik ediyorum :smile:

class Cell(list):
    def __init__(self, t):
        self.t = t
        list.__init__(self)

    def connect(self, l): # üç hücreyi birbirine bağlama
        k, n = l
        self.append(k)
        self.append(n)
        k.append(self)
        k.append(n)
        n.append(k)
        n.append(self)
        

    def __repr__(self):
        return f"{self.__class__.__name__}({self.t})"

def build(l):
    cells = [[Cell(j) for j in i] for i in l]
    for satır_index, satır in enumerate(cells[:-1]):
        alt_satır = cells[satır_index+1]
        for i, c in enumerate(satır):
            c.connect(alt_satır[i:i+2])
    other = cells

    cells = [[Cell(j) for j in i] for i in l[:-1]]
    for satır_index, satır in enumerate(cells[:-1]):
        alt_satır = cells[satır_index+1]
        for i, c in enumerate(satır):
            c.connect(alt_satır[i:i+2])

    alt_satır = other[-1]
    satır = cells[-1]
    for i, c in enumerate(satır):
        k, n = alt_satır[i:i+2]
        c.append(k)
        c.append(n)
        k.append(c)
        n.append(c)
    
    return [j for i in cells + other for j in i]


l = [(0, 0, 0, 0), (0,2,2,2,0), (0,2,0,0,2,0), (0,2,0,2,0,2,0)]

##l = [(0,), (0, 2)]
cells = build(l)


# buraya kadar şekli oluşturduk, şimdi kontrol ediyoruz
twos = [i for i in cells if i.t == 2]

check = lambda c, s = (0,2,0): sum(check(i, s[1:]) for i in c if i.t == s[0]) if len(s) > 1 else sum(1 for i in c if i.t == s[0])

print(sum(check(i) for i in twos))
1 Beğeni

Bende sizi tebrik ediyorum bravo :slight_smile:
Sonra detaylıca inceleyip anlamaya çalışıcam kodunuzu

1 Beğeni