Sherlock Harf / Kelime Efekti Kodu, Shakespeare, Şeyh Pir ve Evrim

maxresdefault (3)

Selam arkadaşlar,

Şu aralar BBC’nin şaheseri, Benedict Cumberbatch’in her zamanki gibi tanrılaştığı rollerden biri olan Sherlock’u 3. defa baştan sona izleme sürecindeyim. Cuma cuma okuldan çıkmışım, yorgunum, hiçbir şey yapmak istemiyorum falan… Derken, Sherlock’taki hastası olduğum “harf/kelime efekti” geldi aklıma. Hani şu bir şeyi düşünürken gözünün önüne kelimeler geliyor da, böyle harfler rastgele değişerek sonunda bulması gereken kelimeye (ya da bir tahmine) dönüşüyor falan. Şu harflerin “değişmesi” olayı kısaca… 🙂 Durun, düzgün anlatamadım. En iyisi size özel bir video hazırlayayım. Sonuna da sürpriz koydum, umarım beğenirsiniz. 😉

 

 

Anladınız mı demek istediğimi?  Hah…

İşte onu MATLAB’da yapan ufak bir kod yazmak istedim, canım başka bir şey istemediğinden bugün. Kısa sürede çıktı ortaya, kısacık bir şey. Dileyenler için SherlockEffect adını verdiğim kod burada:

function []=SherlockEffect(word)

% word=’MONKEYS CAN WRITE HAMLET’; %give a word or a sentence to match
alphabet=[‘a’:’z’,’A’:’Z’,num2str(0:9),’ ‘]; %define the English alphabet and add numbers
alphabet=[alphabet(alphabet~=’ ‘),’ ‘]; %get rid of extra spaces, add just 1 space to capture word spacing in sentences

r=randi(length(alphabet),1,length(word)); %pick random numbers between 1-63 (26 uppercase letters + 26 lowercase letters + 10 numbers + 1 space) for each letter
randword=alphabet(r); %pick random characters from the alphabet
check=word==randword; %check if they match and create a check matrix

foundword=zeros(length(word)); %initialize foundword for speed

while ~all(check) %as long as there are letters that did not match
check=word==randword; %check if they match and create a check matrix
pos=find(check==1); %get the positions of the matching characters

foundword(pos)=word(pos); %create a foundword array with the correct values

r=randi(length(alphabet),1,length(word)); %pick random numbers between 1-37 (26 uppercase letters + 26 lowercase letters + 10 numbers + 1 space) for each letter
randword=alphabet(r); %pick random characters from the alphabet

randword(pos)=foundword(pos); %replace the random letters with previously found once to prevent overwriting

fprintf(‘%s\n’,randword) %print the current estimation
pause(0.05) %pause a bit to show humans
clc %clear the command window for a nice effect
end
fprintf(‘%s\n’,randword) %print the final word
fprintf(‘Code terminated.\n’) %termination message
end

Burada commentler düzgün gözükmediği için okuması zor olabilir; ancak MATLAB’a kopyalayıp yapıştırırsanız okuması çok daha kolay kodu burada gözüktüğünden. Açıkça yorumladım; ancak Türkçe mealini de vereyim hemen kısaca:

Kullanıcı, uyuşturmak istediği (efekti uygulamak istediği) kelimeyi fonksiyon adıyla birlikte çağırıyor. Örnek: SherlockEffect(‘maymun’)

Kodun yaptığı epey basit. Başta alfabeyi (büyük küçük harfleri), 0-9 arası rakamları ve bir de boşlukları tanımlıyoruz ve “alphabet” isimli değişken içine atıyoruz. Sonra 1-63 arasında rastgele sayılar çekiyoruz. Neden 63? Çünkü İngiliz alfabesinin 26 büyük harfi, 26 küçük harfi var. Etti mi 52? 10 tane de 0-9 arası rakam koydunuz. Oldu mu size 62. E bir de cümle girilirse boşluklar olacak cümlede haliyle, 1 tane de boşluk ekledik o nedenle. Etti mi size 63? Tabii geliştirebilirsiniz virgül, nokta, vs. ekleyerek. Bunlar sonrasının işleri.

1-63 arasında kaç tane rastgele sayı çekiyoruz? Kullanıcının girdiği kelime ya da cümledeki karakter sayısı kadar (boşluklar da sayılıyor). Atıyorum “maymun” sözcüğünde 6 tane karakter var. “Baban maymun” cümlesinde 12 karakter var. Bunun gibi…

Sonrasında bu rastgele karakterleri bir while döngüsü içerisinde girilen kelime/cümlenin karakterleri ile kıyaslıyoruz. Tutanları “foundword” içerisinde saklıyoruz ki, rastgele karakterler üretirken halihazırda zaten bulduklarımızın üzerine yazmayalım, bulduklarımızı kaybetmeyelim.

Sonra “alphabet” içerisinden rastgele karakterler çekmeye devam ediyoruz sürekli. Ta ki tüm karakterler, kullanıcı tarafından girilen ile uyuşana kadar. Bu süreçte Command Window’umuzda efekt belirmiş oluyor. Uyuşan karakterler artık değişmiyor. Diğerleri ise rastgele değişmeyi sürdürüyor, ta ki uyana kadar! Hemen “maymun” örneğini görelim, bir video çaktım sizlere:

 

Evet, görebileceğiniz gibi epey havalı. Tabii ki yazı tipini falan değiştirerek çok daha şekilli hale getirebilirsiniz, şüphesiz. Ancak ben şu etapta sadece olayın özünü göstermek istedim.

Fark etmiş olabileceğiniz gibi bazı harflerin bulunması epey uzun sürüyor, zira algoritma tamamen “Brute Force” üzerine kurulu, yani hiçbir eleme mantığı yok, tamamiyle rastgele deniyor. Elbette ki bu kodu çok daha hızlandırmak adına yapılması gereken en kolay yol, denenen ve başarısız olan harflerin o harf pozisyonu için alfabeden elenmesi. Ama dediğim gibi, yorgun ve başka bir şey yapmak istemediğim bir anda yazdığım bir kod bu, o nedenle çok zaman kaybetmek istemedim, üzerinde çalışacağım önümüzdeki günlerde.

Bu kodun özel bir anlamı da var, zira evrimi anlatmak konusunda çok kullanışlı bir kod! Evrim düşmanı cahiller konunun özünden o kadar uzaklar ki, tarih boyunca “Tuşlara rastgele basan maymunlar Shakespeare’in (Şeyh Pir) ‘Hamlet’ (aslı Ham-ül Beyt) isimli eserini yazabilir mi? Hı? Demek ki evrim yok.” gibi argümanlar üretmişlerdir. Süper zeka!

Aslına bakarsanız eğer ki Hamlet’i yazmak “daktiloda bir şeyler yazmak” işi dahilinde “avantajlı” bir şey olsaydı ve onu yazabilenler yaşayıp, onu yazamayanlar ölseydi ve en fazla sayıda doğru harfe basanlar seçilseydi, maymunlar da Hamlet’i yazabilirdi, develer de… Evrim, bir şeylerin “rastgele denenmesi”nden ibaret değildir. Evrim, büyük oranda rastgele olan çeşitliliğin, halihazırda var olan çevrenin sınavına tutulması ve bu sınavdan en başarılı çıkanların seçilip, diğerlerinin elenmesi sürecidir. Yani evrimin kendisi rastlantısal değildir; sadece çeşitliliğin yaratımı büyük oranda rastlantısaldır (mutasyonlar, vs.). O çeşitliliğin çevreyle uyumluysa avantaj sağlayıp bireyi daha uzun yaşatması ve daha kolay üretmesi “rastlantısal” değildir.

İşte aynı şekilde, eğer ki “seçilim” işin içine dahil edilirse, rastgele harf denemeleri anlamlı sözcükler ve cümleler yaratabilir. Göstereyim mi?

 

Demiştim.

Advertisements