Programlama ile çözülebilecek zeka soruları

Size de merhaba.

Biraz geç fark ettim :sweat_smile: Belirttiğiniz için teşekkürler.

1 Beğeni

Hocam benim aklıma da merge sort gibi sort mekanizması geldi ama üzerinde pek düşünemedim. Elimizdeki topları ikişerli gruba ayırıp sıralamasını bulmak için üçüncü bir topu boş yere kullansak bile O(nlogn) den 15.ceil(log15) ten falan 60 bulabiliriz gibi geldi. Yani bana kalırsa 105 tane işlem yapmaya hiç gerek yok. Bana Max 60 işlem yapmamiz lazım gibi geldi. Anlatamadım ama anlamışsınızdır. Kısaca zaten merge sort u biliyorsunuzdur. En temelinde iki top karşılaştırırız, tartan şahsa ayıp olmasın diye random bir top sokariz. Ne düşünüyorsunuz? (Bu yazdığım şeyler, sorunun cevabı değil ama ben de acaba böyle yapabilir miyiz diye düşündüm. Bu arada da quick sort düşündüm ama onda da en kötü ihtimal O(n²) oluyor. Optimizasyon nasıl yapılır düşünemedim merge de. )

1 Beğeni

Valla 3. (4.?) editle gelen wiki makalesi kafami karistirdi. 15’lik seti sort etmek icin gereken minimum karsilastirma sayisi 42’ymis. O halde cevap 21-42 arasinda.

Teorik log(2, 15!) minimumuna o kadar yakin ki uclu tartmanin da teorik log(15!) / log(3!) minimumuna yakin oldugunu dusunmeye basladim.

Brute force tartma kombinasyonlari deneyip elde edilen bilgileri toplayan bir kod yazilabilir belki, 15! isleme yaklasmasina gerek yok.

2 Beğeni

Bir çubuğu rastgele 2 noktasından kırıp 3 parça elde ediyoruz. Bu 3 parçadan bir üçgen oluşturma olasılığı nedir?

Çok iyi düşünemedim şu olasılığı ama eğer çubukta belirlenen noktalardan biri çubuğun tam orta noktasına gelirse o çubuk üçgen olmaz.

Programlama yapmadım ama

(1/2)(1/2) + (1/2)(1/2)

olmalı bence

@Gok_Mavisi_Anka ne karşı acele ediyom😅 xd jdjdjd

Edit: yanlış düşünmüşüm. Eğer cubukta belirlenen noktalar çubuğun bir yarısında toplanmissa üçgen olmamalı o üç parça. Acele işe şeytan karışıyor.

Çubuk kırıldıktan sonra oluşan parçaları a, b ve c olarak isimlendirecek olursak,
Üçgenin oluşması için gereken şu basit kuralı uygulayabiliriz.
a + b + c = çubuğun uzunluğu
a < b + c and b < a + c and c < a + b

Brute-Force olmadan yaşayamam:

cubuk = 100  # Diyelim ki 100 cm.
# Çubuğun her bir parçasının minimum 1 cm olacağını varsayalım.
# Öyleyse maksimum da 98 cm'dir. (100 - 1 - 1)

tum_durum = 0
ucgen_olusma_durumu = 0

for a in range(1, 99):
   for b in range(1, 99):
       for c in range(1, 99):
           if a + b + c == cubuk:
               tum_durum += 1
               if a < b + c and b < a + c and c < a + b:
                   ucgen_olusma_durumu += 1
print(f"Tüm Durumların Sayısı: {tum_durum}")
print(f"Üçgenin Oluştuğu Durum Sayısı: {ucgen_olusma_durumu}")
print(f"Üçgen Oluşma Olasılığı: %{round((ucgen_olusma_durumu/tum_durum)*100, 3)}")
Tüm Durumların Sayısı: 4851
Üçgenin Oluştuğu Durum Sayısı: 1176
Üçgen Oluşma Olasılığı: %24.242

Sizin için işlemcime kıydım, çubuğun uzunluğunu 1000 ile değiştirerek de denedim. Böylece çubukların maksimum uzunlukları 998’e yükseldi.

Tüm Durumların Sayısı: 498501
Üçgenin Oluştuğu Durum Sayısı: 124251
Üçgen Oluşma Olasılığı: %24.925

Görüldüğü üzere sonuç çok daha isabetli çıktı.

Ben de edecektim ama Some brute-force problems :slight_smile:

Edit: %0.24925 falan demişim de 100 ile çarpmayı unutmuşum…

2 Beğeni

Kırılma noktalarına göre yapsan daha kolay olmaz mıydı?

1 Beğeni

Benim dediğim şekilde yaparsak deneysel olasılık %50 civarı oluyor.

#include <bits/stdc++.h>

using namespace std;
using ll = long long;


int simulate()
{
    double x1 = (double)rand() / RAND_MAX;
    double x2 = (double)rand() / RAND_MAX;

    if (x1 > x2)
        swap(x1, x2);

    if (x1 >= 0.5)
        return 0;
    
    if (x2 - x1 >= 0.5)
        return 0;

    if (1 - x2 >= 0.5)
        return 0;
    
    return 1;    
}

int main()
{
    srand(time(0));
    ll simulationNumber = 100000000;
    ll triangleNumber = 0;
    
    for (ll i = 0; i < simulationNumber; i++)
        triangleNumber += simulate();


    cout << triangleNumber << " " << simulationNumber << endl;
    cout << "Probability: " << (double)triangleNumber / simulationNumber << endl;
}

edit: Kodumu güncelledim ve ayriyeten fikrimi de değiştiriyorum. Eğer bir parçanın uzunluğu, çubuğun boyunun yarısına eşit veya daha fazla ise üçgen oluşamaz. Ama hala oranım değişmiş değil. Oranım %50

edit2: kodda hata yapmışım. Tekte doğru yazsam şaşardım. 0.5 yazmam gerekirken 05 yazmışım. kodu düzeltiyorum ve oranı %75 e çıkarıyorum. Var mı artıran :slight_smile:

Edit3: üçgen olmama olasılığını hesaplamisim. Oysaki olma olasılığını hesaplamam gerekirdi. Kodu son olarak guncelliyorum.

2 Beğeni

Gidişat güzel ama sonuç yanlış gibi görünüyor.

merhaba, kodda hata yapmışım. o hatayı düzelttim. oranı %75 bulmaktayım şimdi.

Çubuk uzunluğu: l

1.kenar
a = x

2.kenar
b = y

3.kenar
c = l - x - y

1. eşitsizlik
x + y > l - x - y

x + y > (l / 2)

-(l / 2) > -(x + y)

l - (l / 2) > l - (x + y)

l / 2 > c
2. eşitsizlik
(l - x - y) + x > y

l - y > y

(l / 2) > y

(l / 2) > b
3.eşitsizlik

(l - x - y) + y > x

l - x > x

(l / 2) > x

l / 2 > a

kanıtım da bu.

Spoiler

Cevap %25’miş.


kaynak: http://webéducation.com/wp-content/uploads/2019/11/A.-M.-Yaglom-I.-M.-Yaglom-Challenging-mathematical-problems-with-elementary-solutions.-Volume-1-Dover-1987.pdf
221. ve 222. sayfalar.

1 Beğeni

Tamam ya, hay aksi, ben üçgen olmama olasılığını hesaplamisim. Ben de diyorum acaba nerede hata yaptım? Şimdi üstteki kodu son olarak editliyorum. (Nihayet :sweat_smile:)

2 Beğeni

Olasılık simülasyonlarına devam o zaman.

Bir düzlemde birbirine paralel doğrular çiziyoruz. Aralarındaki mesafe 1 birim sonra 1 birim uzunluğunda bir çubuk alıyor ve bunu düzleme atıyoruz. Bu çubuğun paralel doğrulardan birine değme olasılığı nedir?

1 Beğeni

Evet, for döngüsünü 1 tane bile azaltmak epey bir fark ediyor.

for k1 in range(1, cubuk):
   for k2 in range(1, cubuk):
       a, b, c = k1, abs(k1 - k2), cubuk - k2
       if a + b + c == cubuk and k1 != k2:
           tum_durum += 1
           if a < b + c and b < a + c and c < a + b:
               ucgen_olusma_durumu += 1
# cubuk = 100 için,
# Kırılma noktalarına göre:
Tüm Durumların Sayısı: 4851
Üçgenin Oluştuğu Durum Sayısı: 1176
Üçgen Oluşma Olasılığı: %24.242
İşlemler 0.01 saniyede tamamlandı.

# Uzunluklara göre:
Tüm Durumların Sayısı: 4851
Üçgenin Oluştuğu Durum Sayısı: 1176
Üçgen Oluşma Olasılığı: %24.242
İşlemler 0.16 saniyede tamamlandı.
# cubuk = 1000 için,
# Kırılma noktalarına göre:
Tüm Durumların Sayısı: 498501
Üçgenin Oluştuğu Durum Sayısı: 124251
Üçgen Oluşma Olasılığı: %24.925
İşlemler 0.8 saniyede tamamlandı.

# Uzunluklara göre:
Tüm Durumların Sayısı: 498501
Üçgenin Oluştuğu Durum Sayısı: 124251
Üçgen Oluşma Olasılığı: %24.925
İşlemler 239.36 saniyede tamamlandı.
# cubuk = 10000 için,
# Kırılma noktalarına göre:
Tüm Durumların Sayısı: 49985001
Üçgenin Oluştuğu Durum Sayısı: 12492501
Üçgen Oluşma Olasılığı: %24.992
İşlemler 81.88 saniyede tamamlandı.

# Uzunluklara göre:
:')
1 Beğeni

Bir de iki noktadan rastgele kırıp 10binlik simülasyon u test eder misin? Sonuç ve saniye cinsinden.

Bu değil mi? Uzunluklara göre mi istiyorsunuz? Saatler sürer muhtemelen.

Şunu demiştim.

import random
olay=0
for i in range(10000):
    k = [random.random(),random.random()]
    k.sort()
    a, b, c = k[0], k[1]-k[0], 1 - k[1]
    if a < b + c and b < a + c and c < a + b:
        olay += 1

print(olay/10000)

Şu top sorusu ile ben de uğraşmaya başladım. Daha önce yaklaşık değerler bulmuştum ama kesin değeri ve yöntemi bulmamıştım. 15 topun her biri ile ilişkisini bulmak 120 durumu ortaya çıkarmamız gerekiyor. İlk tartıda her top için 3 durum ortaya çıkıyor. Yani a<b, b<c ve a<c . 40 tartıda zaten dümdüz her birini kombilesek buluruz. Ama ilerleyen tartılarda a<b den küçükse b<d den ise a<d olacaktır bunu tartmamıza gerek kalmayacaktır. Bu yüzden tartı sayısının 10 ile 20 arasında olduğu zaten tahmin edilebilir bir şey.

0 ile 1 arasında rastgele seçilmiş iki noktanın ortalama mesafesi kaçtır?

1 Beğeni

B-Brute Force :drooling_face:

end_point = 1
aralik = 10000
farklar = []

for x in (round((end_point/aralik) * number, 2) for number in range(aralik + 1)):
    for y in (round((end_point/aralik) * number, 2) for number in range(aralik + 1)):
        farklar.append(abs(x - y))

ortalama = round(sum(farklar) / len(farklar), 4)
print(f"Toplam: {sum(farklar)}, Eleman sayısı: {len(farklar)}")
print(f"Ortalama: {ortalama}")
# Çubuk üzerinde seçilebilecek 10001 farklı nokta için test edilmiştir.
Toplam: 33345144.000074223 , Eleman sayısı: 100020001
Ortalama: 0.3334  # 4 basamağa yuvarlanmış halde.

Sonuç git gide 0.3333’e yaklaşıyor. Muhtemelen 1/3 gibi bir şey olacaktır.

         / 1/3 \
|-------o-------o-------|
 \ 1/3 /         \ 1/3 /

# Belki bununla bir alakası vardır.
1 Beğeni