Programlama ile çözülebilecek zeka soruları

Farklı harfler farklı rakamlara karşılık geliyor.

[1] * 100. Yukarda range ile yapilmisi da var.

Sayilar sagdan toplanir: K + I = K.

2 Beğeni
  KOPEK
   KEDI
 +-----
  KEMIK

K + I = [K, 10 + K]
I = 0
E + D = [0, 10]
E + D = 10
P + E + 1 = [M, 10 + M]
[O + K, O + K + 1] = [E, 10 + E]
K = K ∴ [O + K, O + K + 1] = E

P + E + 1 = M ∧ O + K = E

P + E + 1 = 10 + M ∧ O + K + 1 = E

Sanirim menzil ([1-9] + [1-9] + 1 = [3-19]) veya direk ihtimal (P=[2,3,4] + E=[3,4,5] = [5,7,9]) analizine girmek gerekiyor buradan sonra.

10000*k + 1000*o + ... for k,o,p,e,d,i in permutations(0..9, 6) daha kolay.

1 Beğeni

Merhaba, attığım linkin en sonunda bir kod var. Onu incelerseniz:

g = gcd(a, b)
ax + by = g

için

x = x0 + k.(b / g)
y = y0 - k.(a / g)

bu zaten cepte. Şimdi biz herhangi bir çözüm bulmuşsak, kendi belirlediğim herhangi bir aralıkta bu denklemi sağlayan kaç çözüm vardır ve bunlar nelerdir sorusuna(not: bunu derken mesela belirlenen aralıktaki en minimum x i bulabilirim. Kısaca biz ipin ucunu O(1) de yakalarız. Neyse çok uzattım) O(1) de yanıt verebilirim.

Şimdi ben [min_X, max_X]
aralığında denklemi sağlayan bir çözüm var mı diye bakıyorum. x0 dan min_X e doğru yolculuk yapmak için:

(min_X - x0) / b

kadar x0 a b/g eklemeliyim. Böylelikle eğer o aralıkta çözüm varsa bir iki oynamayla O(1) de hesaplanabilir. Kodda da zaten onu yapıyor. (en sonundaki lx değişkenini en başta yazdığım x = x0 + k.(b / g) ye yerleştirirseniz.) elimize verilen aralıktaki en küçük x i elde ederiz.

Bahsettiğim fonksiyondaki parametreleri şu şekilde doldurursak:

inf = 10^9 (veyahut 10^18)
minx = 0
maxx = inf
miny = 0
maxy = inf

dersek bence pekala O(log2n) de buluruz gibime geliyor. Ha kalkıp biri de 10^10^10 falan derse de beyninin %100’ünü kullanıyordur xd.

Özet:

find_any_solution → O(log2n)
find_all_solutions → O(1)


O(log2n)

Ben mi sizi yanlış anladım acaba?

Edit: Ha ben bütün çözümleri bulmak (çözüm sayısı değil çözümlerin listesi) istersem tabi bu O(n). Ben sadece bulduk birini, yetinelim onla diyorum.

Zeka Soruları Archives - Sonsuz Us

Güzel sorular elinize sağlık. Asıl kaynakları da bulmak isterdim. Acaba hangi kitaptan çevirmişlerdir. Bir ara literatür taraması yapmak gerekir.

Bu soruları tasarlayan yazarın kitabına bakmak isterdim.

Tek kaynaktan değil bir çok kaynaktan topladım. Kendi ürettiğim sorular da var aralarında.

Elinize sağlık. Ben sadece eminim ki bu konuda birileri çalışma yapmıştır. Özellikle sizin emeklerinizin linkini verdim. Ama diğer taraftan yapancı kaynaklara da bakmak gerekir.

Mesela sizin dolap sorusu, literatürde, 100 door problem diye geçiyor. Yani,algoritma soruları şeklinde birileri derlemiş midir asıl kaynaklara bakmak isterdim.

1 Beğeni

O zaman yeni sorumuz da gelsin. Her gün bir soru eklemeyi planlıyorum.

Her sayıyı oluşturan rakamlar birbirinden farklı olmak koşuluyla, kaç farklı doğal sayı vardır? (Sıfır dahil)

Örn:
0,1,2,3,4,5,6,7,8,9,10,12,13,…,98,102,103,104,105,106,107,108,109,123….,9876543210

Yine eğer beğenirseniz.

Bazı sitelerde bir problemin birden çok dilde çözümü de olanı var.

100 doors - Rosetta Code

En sevdiğim sitelerdendir, bu şekilde birden fazla dilde çözüm kodları da görülebiliyor.

Altında bir çok dilde çözümleme bulunabilir.

100 doors - Rosetta Code

Python için de linki yukarı bıraktım.

Blok yada sitenize ara sıra göz atmak isterim, yazı ve çözümlemelerinizi derler toplar bir araya koyarsanız elimin altında okumaktan zevk alabileceğim bir derleme olacağını düşünüyorum.

Tekrar emeğinize sağlık.

Bir de söylediğim gibi bu tür algoritma problemlerinin bir yerlerde derli toplu durduğuna eminim, bulursam bunun linkini de atarım.

Tabi siz bulursanız ondan da faydalanmak isterim.

geekforgeeks oldukça iyi bu konuda. Her türlü programlama konusu ve sorusu içeriyor.

3 Beğeni

Sorulara devam edelim.

Evrenin gizemli bir yerinde Diven diye bir gezegende Azanyum ve Sazanyum adlı iki türlü yaratık yaşıyordu. Her yılın son günü her Azanyum, bir sazanyum ve bir azanyum yaratacak şekilde bölünüyordu. Bir sazanyum ise bir azanyum iki sazanyuma bölünmekteydi. Bu gezegende hayatın tek bir azanyum ile başladığı bilinmekteydi.

İncemeler şunu gösterdiki Sazanyum/Azanyum oranı 5/3 ü aştığında bu gezegende yaşam son bulacak. Sizce Diven gezegeninde yaşam bir gün son bulur mu?

(Bu arada bölünen Azanyum ve Sazanyumlar yaşamaya devam ediyor)

1 Beğeni
                      [2 1]
[aₙ sₙ] = [aₙ₋₁ sₙ₋₁] [1 2]
[a₀ s₀] = [1 0]
                 [2 1]ⁿ
lim(n→∞) f([1 0] [1 2] ) | f([a s]) = s/a

Cevap “hayir”, oran 1’e gidiyor, ama kanitlayamam.

Hocam sonsuza gittikçe altın orana yaklaştığımızı fark ettim.
Normal basit bir program yazdım ve oranlara baktım.

rate:  0.0
rate:  0.5
rate:  1.0
rate:  1.3333333333333333
rate:  1.5
rate:  1.5714285714285714
rate:  1.6
rate:  1.6111111111111112
rate:  1.6153846153846154
rate:  1.6170212765957446
rate:  1.6176470588235294
rate:  1.6178861788617886
rate:  1.6179775280898876
rate:  1.6180124223602483
rate:  1.6180257510729614
rate:  1.6180308422301304
rate:  1.618032786885246
rate:  1.6180335296782964
rate:  1.6180338134001253
rate:  1.6180339217722395
rate:  1.6180339631667064
rate:  1.6180339789779863
rate:  1.618033985017358
rate:  1.6180339873241927
rate:  1.618033988205325
rate:  1.6180339885418877
rate:  1.6180339886704431
rate:  1.618033988719547
rate:  1.618033988738303
rate:  1.6180339887454671
rate:  1.6180339887482036
rate:  1.6180339887492488
rate:  1.6180339887496482
rate:  1.6180339887498005
rate:  1.618033988749859
rate:  1.6180339887498811
rate:  1.6180339887498896
rate:  1.618033988749893
rate:  1.618033988749894
rate:  1.6180339887498945
rate:  1.6180339887498947
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895
rate:  1.618033988749895

Zaten bu soruyu ilk gördüğümde bana fibonacciyi anımsatmıştı. Ama bir türlü fibonacci mantığını oturtamadım. Bence fibonacci kullanmalıyız. Ama nasıl, çözümleri merakla takip ediyor olacağım?

Bu arada şöyle bir şey yapmaya çalıştım ama muhtemelen buradan gidilmemeli.

1 Beğeni

Elimizde 10 cm boyunda olan ve sonsuza dek gerip uzatabileceğimiz özdeş bir lastik ip var. Bu ipin A ucunu bir duvara bağlıyoruz. B ucunu da bir arabaya bağlıyoruz. A ucuna bir solucan yerleştiriyoruz. Solucan ipin B ucuna doğru gidiyor. Saniyede 1 cm yol alıyor.

Solucan 1 saniye süreyle gidince duruyor. Solucan durunca araba lastik ipi çekerek B ucunu 10 cm ileriye götürüyor ve duruyor. Araba durunca solucan yine 1 saniye süreyle gidiyor ve duruyor. Solucan durunca araba lastik ipin B ucunu yine 10 cm ileriye götürüyor ve duruyor. Ve bu olay hiç durmadan böyle tekrarlanıyor.

Solucan lastik ipin B ucunu yakalayabilir mi?

Yakalayamazsa neden?

Yakalarsa ne zaman yakalar.

Bazı kabullere yaparak çözmeye çalışacağım,

Kabuller:

  1. A ve B noktaları, Dünya üzerinde Ekvator kısmındadır
  2. Araç kara, deniz ve havada gidebilmektedir :slight_smile:
  3. Solucan hareketini bitirir bitirmez araç milisaniyeler içerisinde hareket edip durmaktadır (yani neredeyse aynı saniye içerisinde sırayla hareket etmektedirler)

solucan ve araç arasında 10 cm mesafe (fark) var
solucan 1 saniye hareket ediyor (1. saniye) ;
(solucanın konum: 1, aracın konumu: 10, Fark: 9 cm’ye düşürüyor ve arac milisaniye içerisinde 10cm daha ilerliyor. solucanın konum: 1, aracın konumu: 20, Fark: 19 cm

solucan 1 saniye daha hareket ediyor (2. saniye) ;
(solucanın konum: 2, aracın konumu: 20, Fark: 18 cm’ye düşürüyor ve arac milisaniye içerisinde 10cm daha ilerliyor. solucanın konum: 2, aracın konumu: 30, Fark: 28 cm

solucan hareket edip durunca (henüz araba hareket etmeden önce) en yakın mesafeye yaklaşıyor.
Görüldüğü üzere aradaki mesafe sürekli 9’un katı olarak artıyor.

Ekvatorun çevre uzunluğu : 40.075,017 km (4007501700 cm) olduğuna göre;

cevre_ = 4007501700 # cm  40.075,017 km ekvator cevre uzunlugu
cevre = 4007501700 # cm  40.075,017 km ekvator cevre uzunlugu
katsayi = 1

while True:
    if cevre % 9 == 0:
        print(f"Solucan ve arabanın aynı noktada buluşması için ekvator çevresinde en az {katsayi} tur yol katedilmeli")
        break
    
    else:
        katsayi += 1
        cevre *= katsayi

ÇIKTI;

Solucan ve arabanın aynı noktada buluşması için ekvator çevresinde 3 tur yol katedilmeli

Ekvator çevresinde 3 tur yol katedilmesi demek = 4.007.501.700 cm * 3 = 12.022.505.100 cm
Solucanın her saniye 1 cm yol katetmesi demek = 12.022.505.100 cm / 60 (saniye/cm)) anlamına gelir

print(f"solucanın B noktasına varma konumu : {cevre_ * katsayi} cm yani {cevre_ * katsayi / 100000} km")
print(f"solucanın B noktasına varma zamanı : {cevre_ * katsayi / (60*60*24* 365)} yıl")

ÇIKTI:

solucanın B noktasına varma konumu : 12.022.505.100 cm yani 120.225.051 km
solucanın B noktasına varma zamanı : 381.23 yıl

cevabın yanlış olma ihtimali büyük :slight_smile:

Lastiğin uzamasından dolayı solucanın konum değişikliğini ihmal etmişsin gibi görünüyor. :slight_smile:

Örneğin ilk harekette solucan 1 cm ilerliyor. Araba lastiği 10 cm çektiğinde yani iki kat arttırmış oluyor. Dolayısı ile solucanın A duvarı ile arasındaki mesafe 2 cm , arabaya olan uzaklığı da 18 santimdir.

1 Beğeni

Cevabı 10 milyar mı değilse de nasıl çözülüyor ?

Cevapların ne olduğundan çok kodlarınızı istiyorum aslında. Yani amaç cevabı bulmaktan çok algoritmayı nasıl kurduğunuz.

class Soru:
    def __init__(self):
        self.s = 0  # Solucanın doğu yönünde, A noktasından ne kadar uzak olduğunu belirten değişken. (cm)
        self.l = 10  # İpin uzunluğu (cm)
        self.u = 10  # İpin uzama miktarı (cm)
        self.v = 1  # Solucanın hızı. (cm/s)
        self.y = (self.l + 10)/self.l  # İp uzadığında solucanın yapacağı yer değiştirmeyi sağlayacak oran

    def ilerlet(self):  # Her saniye gerçekleşecek işlem.
        self.y = (self.l + 10)/self.l
        self.s += self.v
        self.s *= self.y
        self.l += self.u

    def hesapla(self):
        n = 0
        while True:
            print(f"{n} >> {self.s} | {self.l} | {self.l - self.s}")
            if self.s >= self.l:
                print("Solucan, sona vardı.")
                print(f"Solucanın A'ya göre Doğu yönündeki uzaklığı: {self.s}")
                print(f"İpin uzunluğu: {self.l}")
                break
            self.ilerlet()
            n += 1

M = Soru()

M.hesapla()

Çözümü şu şekilde örnekleyebiliriz:

  1. saniyede solucan, uzunluğu 10 cm olan ipin üzerinde 1 cm ilerliyor. Buna göre yolun %10’luk bir kısmını gitmiş oluyor. 1. saniyenin sonunda ise ip 10 cm daha uzuyor. Fakat ip uzarken solucan da hareket edeceği için, ip uzadıktan sonra solucan yine yolun %10’luk kısmını gitmiş olacak.
    Buna göre solucan A noktasından 2 cm uzakta olacak.

  2. saniyede solucan 2 cm’nin üzerine 1 cm daha gidecek. Böylelikle yolun 3/20’lik kısmını gitmiş olacak. İp 10 cm daha uzadığında solucanın yeni konumu 3 * (30/20) olacak. Bu da 4.5 eder.

  3. saniyede solucan 4.5 cm’nin üzerine 1 cm daha gidecek. Böylelikle yolun 5.5/30’luk kısmını gitmiş olacak. İp 10 cm daha uzadığında solucanın yeni konumu 5.5 * (40/30) olacak. Bu da 7.33 eder.
    .
    .
    .
    *12367. saniyede solucan 123669.5 cm’nin üzerine 1 cm daha gidecek. Böylelikle yolun 123670.5/123670’lık bir kısmını gitmiş olacak. Böylece ip uzamadan önce B noktasına (ipin ucuna) varmış olacak. (İp uzasa bile 123680.53 > 123680 olacağından cevap yine 12367 çıkacaktır.)

*Noktadan sonraki kısımlar çok uzun olduğundan burada belirtmedim ama aşağıdaki çıktıda görebilirsiniz.

Cevap 12367’dir.

0 >> 0 | 10 | 10
1 >> 2.0 | 20 | 18.0
2 >> 4.5 | 30 | 25.5
.
.
.
12367 >> 123680.53192635531 | 123680 | -0.5319263553101337
Solucan, sona vardı.
Solucanın A'ya göre Doğu yönündeki uzaklığı: 123680.53192635531
İpin uzunluğu: 123680

Sınıf kullanmak yerine şu şekilde daha sade bir çözüm uygulunabilir.

A, B, t = 0, 10, 1

def ilerlet():
    global A, B
    Y = (B + 10) / B
    A = (A + 1) * Y
    B = B + 10

while A < B:
    ilerlet()
    print(f"{t} >> {A} | {B} | {A > B}")
    t = t + 1

A: Solucanın konumu,
B: İpin uzunluğu
t: zaman (saniye)

2 Beğeni

Sonsuz Us’un düzenlediği bir matematik yarışmasına 81 ilden (her ilden en az 1 en çok 10 öğrenci olmak üzere) bilinmeyen sayıda öğrenciler katılmıştır. Bütün öğrencilere yarışma salonuna girme sıralarına göre 1 ‘den başlamak üzere sırayla giriş numaraları verilmiştir. (Salona ilk girene 1, İkinci girene 2, vb.) Yarışma sonunda birinciliği kazanan öğrenci ye giriş numarası sorulduğunda şu cevabı vermiştir:

“Salona benden önce gelen arkadaşların giriş numaralarının toplamıyla benden sonra gelenlerin giriş numaralarının toplamı birbirine eşittir. Benim numaramı buradan bulabilirsiniz.”

Öğrencinin giriş numarasını bulabilir misiniz?