Excel Forum

Excel Forum (http://www.excel.web.tr/index.php)
-   Beyin Fırtınası (http://www.excel.web.tr/forumdisplay.php?f=142)
-   -   Tüm İhtimalleri Bulma (http://www.excel.web.tr/showthread.php?t=68024)

xxcell 17-04-2009 12:21

Tüm İhtimalleri Bulma
 
Herkese Selam,

İhtiyaç duyduğum bir konuda aşağıda anlatacağım husus hakkında bir kod geliştirmem gerekti ve birkaç değişik alternatif ile sorunumu çözdüm.

Sonra bu konunun Kod Geliştirme Açısından güzel bir konu olduğunu, Beyin Fırtınası açısından iyi bir örnek teşkil ettiği kanaatine nayil olup, tarafınıza yayınlamayı uygun buldum.

Soru şu'dur;

3 Haneli, 1 – 2 – A karakterlerinden oluşan bir Metinsel İfadenin alabileceği değerler.

1 1 1
1 1 2
1 1 A
1 2 1
1 2 2
1 2 A
1 A 1
1 A 2
1 A A
2 1 1
2 1 2
2 1 A
2 2 1
2 2 2
2 2 A
2 A 1
2 A 2
2 A A
A 1 1
A 1 2
A 1 A
A 2 1
A 2 2
A 2 A
A A 1
A A 2
A A A

Yukarıdaki gibi olup toplam 27 tanedir.

Örneğin toplam uzunluğu 6 Haneli, Herhangi Bir Harf Ya da Sayılardan oluşan bir Metinsel İfadenin Alabileceği Değerleri bulan Kod (yada fonksiyon) alternatifleri nelerdir?

Herkese iyi çalışmalar.

tufan03 18-04-2009 13:25

Mesela basit şifreleri çözmede kullanılabilir.

xxcell 18-04-2009 13:41

Tufan Bey,

Benim ihtiyaç duyduğum konu da bu olmuştu. Maalesef şifre kırma konusu sitede yasaklı konulardan. O yüzden ona yakın bir örnek ve çözüm önerisi veremiyeceğim. Ama yukarıdaki gibi bir sorunun bir sakıncası yok diye düşünüyorum arkadaşlar önerilerini verince bende çözüm alternatifimi söyleyeceğim.

Kendim, şifreli bir excel dosyasına girmek için; internetten Şifre Kırma Dosyası araştırırken, bu dosyalarda en büyük sorunun, güvenilir olmayan sitenelerde yayınlanması oldu. Sonra düşündüm, Neden kendi şifre kırma Kodu Mu yazmıyorum? diye

ve çok güzel bir kod yazdım. Maalesef site prensipleri açısından yayınlayamıyorum.
Ne yazıkkı Hırsızlık yasaklanırken maalesef Çilingirlik de yasaklanıyor doğal olarak.

Ama can alıcı kısmı Tüm İhtimaller Nasıl bulunur? bu konuda Beyin Cimnastiği yapmak istedim.

Levent Menteşoğlu 18-04-2009 14:35

Sn xxcell

İyi niyetli amaçlar için bir çalışma yaptığınızdan hiç şüphem yok. Ancak şifre kırma gibi konulara kurallarımız gereği izin vermiyoruz. Ancak yukarıdaki gibi temeli matematiğe dayanan başlıkları elbette açabilirsiniz.

leumruk 19-04-2009 12:40

2 Eklenti(ler)
Selamlar,
6'lı döngü kullanarak bir çözüm ürettim.
Kod:

Sub dene()
Sat = 1
    For x = 1 To 6
        For y = 1 To 6
            For z = 1 To 6
                For q = 1 To 6
                    For w = 1 To 6
                        For r = 1 To 6
                        Cells(Sat, "h") = Cells(1, x) & Cells(1, y) & Cells(1, z) & Cells(1, q) & Cells(1, w) & Cells(1, r)
                        Sat = Sat + 1
                        Next
                    Next
                Next
            Next
        Next
    Next
End Sub

Hane sayısı arttığında, döngüyü sayıya göre artırmanız gerekir veya sayı azalıyorsa azaltmalısınız.

xxcell 19-04-2009 18:50

Matematik'te Basamak Kavramını kullanarak Tüm İhtimalleri Bulma

Onluk Sayı sisteminde Örn. 1.000 ile 1.500 arasındaki tüm sayıları bulmak için
sayıları birer arttırırız. Bu işlemin Algoritması şöyle ilerler

a) en son hane Olabilecek Maximum Karaktere gelinceye kadar bir arttır

1000
1001
1002
1003
1004
1005
1006
1007
1008
1009

Son hane olabilecek En yüksek ihtimale gediğinde, Ondan önceki karakteri bir arttır ve arttırdığın karakterden sonraki tüm karakterleri sıfır (0) yap

yani 1010 yap

ve döngüyü başa al. Yani son hane 9 oluncaya kadar döndür, ve yine son hane en yüksek ihtimale geldiğinde, ondan önceki karakteri bir arttır ve arttırdığın karakterden sonraki tüm karakteri minimum karakter yap ve döngüyü tekrar başa al.

bu şekilde

1099 sayısına ulaşınca, Son hane 9 olduğu için bir önceki hane'ye bakıyor ve o da olabilecek en yüksek değeri aldığı için ondan bir öncekine bakıyor ve eğer o en yüksek değer değilse o haneyi bir arttırıp ondan sonraki tüm haneleri sıfırlıyor ve yine son haneyi arttırma işlemini yapıyor.

Matematikte Onluk, Onaltılık, ikilik veya tüm sayı sistemlerinde arttırma bu şekilde yapılır.

Sayının alabileceği tüm ihttimaller Her hane (digit) için olabilecek ihtimallerin çarpınıa eşittir, yukarıda 4 dijit söz konusu ve 9 x 6 x 10 x 10 = 5.400 adet ihtimal var. (1 nci hane 1 ile 9 , 2 nci hane 0 ile 6 diğer haneler 0 ile 9 arası değerler alıyor)

Bende bu kavramı temel alarak Şifreyi bir arttır şeklinde bir döngü kurdum istenilen örneğe uyarlanmış ekteki öneği geliştirdim.

Benim örneğim A - Z arası harfleri, a - z arası harfleri, 0 - 9 arası sayılarını kapsıyor. Bu kapsamı belirten en kestirme yol, Ascıı kod sayfasındaki 48 ile 122 nci karakterler arasıdır. Asc(48) SIFIR karakteridir. Asc(122) küçük z harfidir.

Yani benim örneğim için her hane 75 değişik değer alabilir, 6 hane için
75 x 75 x 75 x 75 x 75 x 75 = 1,78E+11 adet ihtimal vardır.

Ben bu ihtmallere şifre kırmak için ulaşmıştım. Makinenin her ihtimali teker teker denerek şifre kırması bu yüzden biraz zaman alabilir.

Aşağıdaki fonksiyon; Minimum karakteri ve Maximum Karakteri bellirli bir şifreden sonra gelecek şifreyi üretir.

Kod:

Function SonrakiSifre(sifre As String, MinimumKarakter As Integer, MaximumKarakter As Integer)
Dim DerlenenDigit As Integer
DerlenenDigit = Len(sifre)

Do While DerlenenDigit > 0
If Asc(Mid(sifre, DerlenenDigit, 1)) >= MaximumKarakter Then DerlenenDigit = DerlenenDigit - 1 Else Exit Do
Loop

SifreUzunlugu = Len(sifre)

If DerlenenDigit > 0 Then
    sifre = Left(sifre, DerlenenDigit - 1) & Chr(Asc(Mid(sifre, DerlenenDigit)) + 1)
    Do While Len(sifre) < SifreUzunlugu
    sifre = sifre & Chr(MinimumKarakter)
    Loop
Else
    sifre = ""
    For n = 1 To SifreUzunlugu + 1
    sifre = sifre & Chr(MinimumKarakter)
    Next
End If

SonrakiSifre = sifre

End Function

Bu fonksiyon yardımıyla basit bir döngü kurarak olabilecek tüm ihtimaller excel sayfasına alalım, BEKLEMEKTEN SIKILDIĞINIZDA KODU DEBUG YAPINIZ

Kod:

Sub SifreBul()
Dim sifre As String

sifre = "000000"
satir = 1
sutun = 1

Do

sifre = SonrakiSifre(sifre, Asc("0"), Asc("z"))

Cells(satir, sutun) = sifre

satir = satir + 1
If satir = 65536 Then
satir = 1
sutun = sutun + 1
End If

Loop

End Sub


xxcell 19-04-2009 18:59

1 Eklenti(ler)
Örnek Dosyası Ektedir

sinankayan 10-07-2009 12:30

SifreyiBul isimli makroyu çalıştırınız diyor nasıl gerçekleştireceğiz bunu

sergions 07-08-2009 12:13

Araçlar > Makro > Makrolar'a gelin ve Açılan Penceredeki SifreBul yazısına çift tıklayın.

baydeniro 07-08-2009 13:20

Çok teşekkürler. İlginç bir çalışma


Saat 21:30

Powered by vBulletin Version 3.7.2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.