Python Alıştırma Sorusu. Algoritma Kuramıyorum

Genişliği a birim ve b birim olan iki farklı türde çitler birleştirilerek bir bahçenin k birim uzunluğundaki
bir kenarına çakılmak isteniyor.
Örneğin, genişliği 4 birim ve 5 birim olan çitler ile bir bahçenin 22 birim uzunluğundaki bir kenarı 3 adet
4 birim uzunluğundaki çit ve 2 adet 5 birim uzunluğundaki çit kullanılarak (4 + 4 + 4 + 5 + 5 = 22)
çevrilebilir.
Bahçenin çevrilmek istenilen kenarının uzunluğunu ve kullanılmak istenen iki farklı çitin genişliklerini
ardarda üç satırda tam sayı olarak alan ve bahçenin kenarının çevrilip çevrilemeyeceğini belirleyen bir
Python programı yazınız.

Olası tüm permütasyonlara bakmam gerekiyor. itertools.permutations kullanarak denedim ancak yine beceremedim yol gösterirseniz çok sevinirim.

Merhaba hoş geldiniz.

Bu örnekte permütasyonu nasıl kullanacağınızı pek bilmiyorum. Doğrusu gerek olmadığını da düşünüyorum. Aslında burada basit bir eşitlik ile de cevaba ulaşabilirsiniz.

Elinizde şöyle bir denklem var:

ax + by = c

a, b ve c değişkenlerinin değerlerini zaten fonksiyonu çağırırken siz vereceksiniz. Burada x ve y değişkenlerinin değerlerinin her ikisinin tipinin int olduğu ve a * x + b * y = c durumunun sağlandığı bir durum olup olmadığını test ediyorsunuz. O halde şöyle bir fonksiyon yazılabilir diye düşünüyorum.

def cit_cevrilebilir_mi(a, b, c):
    # Başlangıç olarak x'in değerini 1 yapalım.
    x = 1
    # a * x'in, c'den küçük veya eşit olduğu sürece çalışan bir 
    # döngü tanımlayalım.
    while a * x <= c:
        # eldeki değişkenlere göre b ile çarpılacak sayıyı hesaplayalım.
        y = (c - (a * x)) / b
        # Eğer y, 0 değilse ve float(y), int(y)'ye eşit ise
        if y and float(y) == int(y):
            # Çit çevrilebilir ve fonksiyondan True değeri döner.
            return True
        # Döngünün başına giderken, a ile çarpılacak sayıyı 1 birim
        # artıralım.
        x += 1
    # Döngünün çalışmasına izin veren koşul altında eğer True değeri
    # dönmemişse, çit verilen değerlere göre çevrilemez
    # ve False değeri döner.
    return False
    
    
print(cit_cevrilebilir_mi(a=4, b=5, c=22))
print(cit_cevrilebilir_mi(a=4, b=5, c=21))
print(cit_cevrilebilir_mi(a=4, b=5, c=20))
2 Beğeni

Çok teşekkür ederim yardımcı olduğunuz için. Dediğim gibi çok yeniyim. Açıklamalar, ilerleme ve düşünce şeklini oturtma açısından çok yardımcı oldu.

Sorunun python’la tek alakasi cevabinin senden python dilinde istenmis olmasi sanirim. Neyse, alistirma olsun diye matematikce cozmeye calistim:

// ax + by = c
assert a < b
(k, r) = c ÷ a
(d, r') = k ÷ (b - a)
if r' ≠ 0 return None
if d > k return None
return Some (k - d, d)

Neyin permutasyonlari?

Denedigin kodu ve neyi beceremedigini bize gostermen lazim. Ozellikle neyin permutasyonlarini kullandigini merak ediyoruz.

Burada 4 tane conversion/coercion var. Ifade etmek istedigini matematik domain’inden cikmadan, dilin ogrenmesi zor ve degismesi kolay olan kurallarina girmeden ifade edersen kod okunabilir ve daha future-proof olur.

2 Beğeni

Selam, bu mesaj bana mı yazıldı acaba? Şayet öyleyse, anlamakta biraz zorluk çektim. :thinking:

Evet. Burada demek istedigin “(c - (a * x)) sifirdan buyukse ve b’ye tam bolunuyorsa” gibi bir sey sanirim. Bunu y’yi uc farkli ture cevirip bir takim python incelikleri yaparak ifade etmissin. Calisiyor oldugunu varsayiyorum, fakat okunabilir degil ve dilin bir takim inceliklerine dayaniyor.

Oysa problem matematik domain’inde. Python’dan bagimsiz ve cozmek icin python’a ozel “incelikli” kurallari/implementasyon detaylarini kullanmaya gerek yok. Negatif olmayan tamsayilarda sifir/esitlik kontrolu icin == ve > 0 var mesela. Bolunebilirlik kontrolu icin % var. // de bi yerde kullanilir kesin. Ustelik bunlarin calisma kurallari (ozellikle negatif olmayan tamsayilar icin) kesin ve bir suru programlama dilinde ayni. Degismeleri de cok zor.

1 Beğeni

Orada aslında el alışkanlığından ötürü kodu kısalttım. Daha matematiksel bir gösterimle daha anlaşılır yazılabilirdi elbette.

Öneri ve yardım için teşekkür ederim. itertools.permitations kullandığım kodlarımı maalesef sildim. Önerin üzerine tekrar bakıp atmaya çalışacağım. Matematik bölümünde okuduğum için python ile kodlamayı, matematik ile bağdaştırıp olabildiğince mantıklı ve düzgün algoritmalar yazmaya çalışıyorum. O sebeple “tüm permütasyonlara bakmam gerekiyor” dedim. Şöyle ki ax + by = c denklemindeki x ve y’nin denklemi sağlayan tüm değerlerine, kullanıcının belirlediği bir c değeri için bakmanın bir yöntemi var mı? Bunu yapmaya çalışmıştım.