Programlama ile çözülebilecek zeka soruları

Bu başlık altına derslerde de öğrencilerimle paylaştığım programlama ile çözülebilecek zeka sorularını paylaşacağım. Cevaplarınızı istediğiniz programlama dilinde yapabilirsiniz. Zeka sorularını programlama ile çözmek iki yeteneğinizi de geliştirebilir. Hem soru, sorun çözme hem de programlama.

Programlarınızda kod satırlarını kullanınız tabiki. Sorularla ilgili mantık da yürütebilirsiniz illa programlama ile çözmek zorunda değilsiniz elbette. Serbestçe yazabileceğiniz bir alan olsun.

Elbette sizlerin de böyle soruları varsa lütfen ekleyin.

2 Beğeni

İlk sorumuz gelsin.

Bir adam elindeki çeki bozdurmak için bankaya gitti. Fakat veznedar bir yanlışlık yaptı ve çekin üzerinde yazılı liralar yerine kuruş ve kuruşlar yerine de lira vererek çeki ödedi. Adam da dikkat etmeden paraları cebine koydu. Eve giderken paranın 5 kuruşunu düşürdü. Bu vesile ile parasını saydı ve cebinde çekin değerinin tam iki katı parası olduğunun farkına vardı. Çekin üzerinde yazılı olan miktar ne kadardı?

Ben bu soruyu çözemedim algoritma ne olacaktı ki.

Döngü kullanabilirsin kuruş ve lira cinsinden.

Merhaba, 1 lira, kaç kuruşa tekamül etmektedir, 100 kuruş mu, 1000 kuruş mu, 1 kuruş mu? Öteki türlü elimde 4 bilinmeyenli bir denklem kalmaktadır.

k l

x y

xk + yl = A

yk + xl - 5k = 2A

yk + xl - 5k = 2xk + 2yl

yk + xl + -5k -2xk - 2yl = 0

k (y - 5 - 2x) + l (x - 2y) = 0

Vcek = L + K / 100

Vyanlis = L / 100 + K

Vevde = Vyanlis - .05
Vevde = L / 100 + K - .05

Vevde = 2 * Vcek
(L / 100 + K - .05) = 2 * (L + K / 100)

L + K * 100 - 5 = 200 * L + 2 * K
199L = 98K - 5

Tamsayi cozum bulmayi bilmiyorum ama brute force ile cikiyor. (63, 31)

1 Beğeni

ben bu problemi çözemedim acaba bir açıklama mı yapsanız.

cek_tutari = x * lira + y * kurus
bankadan_verilen = y * lira + x * kurus
dusen = 5 * kurus
elde kalan = bankadan_verilen - dusen
elde kalan = cek tutari * 2

1 lira = 100 * kurus olduğuna göre;

cek_tutari = x * lira + y * kurus
cek_tutari = x * 100 * kurus + y * kurus
cek_tutari = (100x + y) * kurus

bankadan_verilen = y * lira + x * kurus
bankadan_verilen = (100y + x) * kurus

dusen = 5 * kurus

elde kalan = (100y + x - 5) * kurus

elde kalan = cek tutari * 2

(100y + x - 5) * kurus = (100x + y) * kurus * 2

100y +x - 5 = 200x + 2y
98y -199x = 5

for x in range(100):
    for y in range(100):
        if ((98 * y) - (199 * x) == 5):
            print(f"x değeri: {x}, y değeri: {y}.\nÇek üzerinde yazılı değer: {x} Lira, {y} Kuruştur")

ÇIKTI:

x değeri: 31, y değeri: 63.
Çek üzerinde yazılı değer: 31 Lira, 63 Kuruştur

3 Beğeni

1 Lira 100 Kuruştur.
Eğer 1 Lira 1.000 Kuruş olsaydı çebimizde 1, 25, 50,100, 250,500,…vb kuruşluk bozuk para olmalıydı, oysa en büyük bozuk para 50 Kuruştur yani 2 adet 50 kuruş (100 kuruş) 1 Lira eder :slight_smile:

1 Beğeni

@m.halil ve @aib çözdüklerine göre yeni soruya geçebiliriz.

Bir okuldaki 100 kapalı dolabın önünde birer öğrenci duracak şekilde yerleşirler.

  1. düdük çaldığında 1 in katları olan tüm dolap kapakları açılır.
  2. düdük çaldığında 2 nin katları olan dolaplar açıksa kapanır kapalıysa açılır,
  3. düdük çaldığında 3 ün katları olan dolaplar yine aynı şekilde kapanır veya açılır,
    . . .
    Bu böylece 100. düdük çalana kadar devam eder. 100. düdük çaldığında sadece 100. dolap kapağı açıksa kapanır kapalıysa açılır.

Soru şu, bu işlemin sonucunda kaç dolap kapağı açık kalır?

Lira, kuruş sorusu için şu da yapılabilir doğrudan.

for lira in range(1,100):
    for kurus in range(1,100):
        if 2*(lira+(kurus/100))==kurus+(lira-5)/100:
            print(lira,kurus)

Diophantine equations olarak geçiyormuş.

>>> from sympy.solvers.diophantine.diophantine import diophantine
>>> from sympy.abc import x, y, t
>>> from sympy import Eq, Symbol
>>> solutions = list(diophantine(Eq(199 * x, 98 * y - 5), syms = (x, y)))
>>> solutions[0]
(98*t_0 - 165, 199*t_0 - 335)
>>> t_0 = 2
>>> (98*t_0 - 165, 199*t_0 - 335)
(31, 63)
>>> 
kapaklar = [False for i in range(100)]

def düdük(kapaklar, n):
    for i in range(0, len(kapaklar), n):
        kapaklar[i] = not kapaklar[i]

for i in range(1, 101):
    düdük(kapaklar, i)

print(sum(kapaklar))
1 Beğeni

Suna bakarken okumustum ama hazir Wiki linkini es gecemeyecegim, tekrar okuyorum :slight_smile: Tesekkurler

Kutuphane olmadan nasil cozulur (cozulur mu) merak ediyordum. 199/98 sayisiyla biraz oynadim, kusuratlari tamsayilara cevirmeye filan calistim ama cok basarili olamadim.

Lokal minimum/maksimum bulmak icin turev alip 0’a esitlersin, veya ne bileyim polinomu/derecesini bulmak icin ardisik degerleri birbirinden cikartirsin ya, oyle basit bir yontemi var mi merak ediyorum. (Bolmede kalani bulmak icin kusurlu cevabin kusurunu bolenle carpmak hala kullandigim bir yontem mesela.)

1 Beğeni

Burada 5.1.6 başlığı altında bu soru çözülmüş. Wikipedia’da yazan Linear Diophantine equation çözümünü uygulamış ve anlaşılan genel formüle ulaşmak için ilk önce kendimiz denklemi sağlayan bir çözüm bulmak zorundayız.

Sizce ben 1 Türk Lirasının kaç kuruş ettiğini bilmiyor muyum? Burada dikkat çekmeye çalıştığım şey, bir sürü lira çeşidi var. Ben nereden bileyim sorudaki karakterin yaşadığı ülkede 1 lira kaç kuruş eder? Belki hikayedeki ortam Türkiye, belki Suriye, belki de kafdagi. TL ise TL denilmesi gerekiyordu. Ama soruda sadece lira denmiş. Neyse uzatmayayım konu dışına geçiyoruz.

Çok incelemeye vaktim yok ama şu işinize yarayabilir belki. Ama bu algoda O(log2n) karmaşıklık var, @aib de brute force yazınca herhalde logn li bir bruteforce yazmıştır diye düşünmüştüm :confused:

https://cp-algorithms.com/algebra/linear-diophantine-equation.html

2 Beğeni

Evet, bu kod ile sonuç alabiliyoruz:

def gcd(a, b):
    if b == 0:
        return a, 1, 0
    d, x1, y1 = gcd(b, a % b)
    x = y1
    y = x1 - y1 * (a // b)
    return d, x, y

def find_a_solution(a, b, c):
    g, x, y = gcd(abs(a), abs(b))
    if c % g:
        return None

    x *= c / g
    y *= c / g
    if a < 0:
        x = -x
    if b < 0:
        y = -y
        
    return g, x, y

# ax + by = c
a, b, c = -199, 98, 5
g, x, y = find_a_solution(a, b, c)
print(f"({x} + t*{b // g}, {y} + t*{-a // g})")

(-165.0 + t*98, -335.0 + t*199)
>>> t = 2
>>> (-165.0 + t*98, -335.0 + t*199)
(31.0, 63.0)
>>> 

Bu algoritma gayet iyi, EBOB büyük sayılar için bile oldukça hızlı hesaplanıyor. Hem O(log2n) en kötü ihtimal, eğer sayılar birbirini tam bölüyor ise öklid algoritması O(1)'lik bir zaman karmaşıklığına sahip oluyor. Denklemi sağlayan tek bir değer çifti bulmak genel formülü elde etmek için yeterli zaten, formül bilindikten sonra da problem basit bir eşitsizlik ile çözülebilir:

0 <= 199*t - 355 < 100
355 <= 199 * t < 455
355 / 199 <= t < 455 / 199
1.7839195979899498 <= t < 2.28643216080402

O(log n)'lik bir brute force nasıl yazılabilir ki bu durumda, aklınızda bir yöntem var mı @Cihat_Altiparmak?

1 Beğeni
liste = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]

index = 0
dongu = 0
toplam = 0
durum = True

while durum:

    liste[index] = liste[index] * -1

    index += dongu + 1

    if dongu > len(liste)-2:

        for i in liste:

            if i == -1:

                toplam += 1

        print("AÇIK KALAN DOLAP SAYISI >> {}".format(toplam))

        durum=False

    elif index >= 100:
        
        dongu += 1
        index = dongu

Uygun mudur?

liste içindeki 100 tane 1 rakamını daha kolay nasıl yazabilirdim? range() ile olmadı.

1 Beğeni

Yeni sorumuz gelsin.

KÖPEK + KEDİ = KEMİK

Eşitliğini sağlayan sayılar nedir? (Her harf farklı bir rakamı temsil ediyor)

K = 0
E = 0
Ö = 0
İ = 0

P-D-M hakkında fikir üretemedim.