geri

Özgür Hanoi kurgu belgesi

11/10/2007

kalktı ve silkindi üşengeçliğinden.
yeraltı kodlayıcı uzun bir geceye daha uyanıyordu. içindeki his yeni bir projenin doğum sancılarını anımsatır gibiydi. garip bir sıkıntı sarmıştı dört yanını. aynaya baktı, sonra döndü ve şöyle dedi:

-hanoi kuleleri...

bilinmezdi yeraltı kodlayıcının aklından geçenler. zordu anlaşılması gözlerindeki ışığın. bilinen tek şey, amacının bilgiyi her ne olursa olsun insanlarla paylaşmak olduğuydu. ona göre bilgi tüm insanlığın malıydı ve bilgi saklayanlar onun en büyük düşmanıydı. yeraltı kodlayıcının düşmanı olmak: hayatta en son isteyeceğim şey...

peki ama neydi bu hanoi kuleleri?



ve şöyle dedi yeraltı kodlayıcı:

- bir oyundur hanoi kuleleri, eski dostum. bilmiyor olman ne garip...

asıl garip olan kendisiydi ama bunu yüzüne söyleyip bana vereceği yanıtlardan mahrum kalmak istemedim. ben sustukça anlatmaya devam etti.

- her şey kainatın yaratılışıyla başladı. bir tapınak vardı ve 64 altın taş. kainatın sonunu getirecek 64 taş... taşlar her gün bir taş hareket ettirmek koşuluyla eski kadim ırkların en bilgili rahiplerinin korumasına verildi. bu taşlar bir kıyamet sayacı gibiydi. 2^64-1 gün sonra kıyamet kopacaktı. hangi hareketin yapılacağı yalnızca rahipler tarafından biliniyor ve bu bilgi bir sır gibi saklanıyordu. ve ben, eski dostum, bu sırrı çözeceğim.

- ama bu sırrı çözmek kainatın sonu demek değil mi?

- bu bilgi kötü insanların eline geçerse, evet, ama ben bunu yalnızca bilgiye ulaşmak için yapacağım. benim susuzluğum bilgiyedir dostum, iyi bilirsin.

- haklısın. her oyunun olduğu gibi bu oyunun da kuralları olmalı sanırım...

- "yanyana dikilmiş üç kutsal gümüş çubuk, en soldakine üstüste dizilmiş 64 altın taş, hepsi farklı büyüklükte, büyük taş altta, küçük taş üstte... bütün taşlar en sağdaki çubuğa dizilecek, büyük taş altta, küçük taş üstte. hiç bir zaman, hiç bir büyük taş, hiç bir küçük taşın üstüne gelmeyecek." der saklı kitap.

- anladım. ne yapacaksın? kodlayacak mısın?

- elbette eski dostum. bana yeraltı kodlayıcı derler. bir çok güçlükle karşılaşacağımı şimdiden sezebiliyorum. bu da bu işi daha zevkli kılıyor. görebiliyorum. n-1 tane taşı alacağım ve ortadaki çubuğa koyacağım. n.taşı alıp en sağdaki çubuğa koyacağım. sonra da n-1 tane taşı alıp o taşın üstüne koyacağım.

- bir seferde yalnızca bir taşı hareket ettirebileceğimizi düşünmüştüm ben.

- doğru düşünmüşsün. ben de farklı bir şey söylemiyorum dostum, yalnızca çözmeye çalıştığımız problemi genellemeye çalışıyorum. şimdi genelden özele doğru ineceğiz ya da başka bir deyişle her adımda problemi alt problemlere böleceğiz. örneğin n-1 taşı ortadaki çubuğa yerleştirmek için önce n-2 tane taşı sağdaki çubuğa yerleştirmek, (n-1). taşı ortadaki çubuğa koymak, sonra da sağdaki çubuğa koyduğumuz n-2 tane taşı ortadaki çubuğun üstüne koymak gerek.

- anlıyorum. hem de çok iyi anlıyorum yeraltı kodlayıcı.

- buna sevindim kadim dostum. o zaman söyle bakalım bu problemi hangi kodlama yöntemiyle çözeceğiz?

- özyineleme?

- hadi yapalım o zaman...

yeraltı kodlayıcı lambayı söndürdü ve en büyük dostunun karşısına oturdu. kısa bir aradan sonra heyecanlı tuş sesleri gelmeye başlamıştı bile.

önce çözümü sağlayan özyinelemeli fonksiyonu yazdı ve bu fonksiyon içinde taşların hareketini ekrana çizdirdi. her bir hareket arasına belli bir gecikme süresi ekledi. daha sonra bu süreyi çalışma esnasında değiştirebilmeyi istedi. yani uygulamanın aynı anda kulanıcıdan da girdi alması gerekiyordu. ancak ortada büyük bir sorun vardı. özyinelemeli fonksiyon çağrıldıktan sonra ancak çözüm bittiğinde geri dönüyordu. bu durumda aklına foksiyonu bir thread içinde çalıştırmak geldi. ama sdl, thread içinde çizim yapmaya izin vermiyordu. bu durumda çizim için ayrı bir süreç yaratmaya karar verdi. bu süreç içinde bir de thread yaratıp bir pipe aracılığı ile ilk yaratılan süreçten kullanıcıdan alınan girdileri okumaya karar verdi. bu yöntem çalıştı ancak çok karmaşık olduğu için kontrolü zordu. oluşan hataları bulmak çok uzun zaman alıyordu. bu yüzden yeni bir yöntem geliştirmenin gerekliliğine karar verdi.

çözüm için yeni bir thread yaratmaya karar verdi yeraltı kodlayıcı. ancak bu thread çizim yapmak yerine yalnızca yapılacak çizimleri bir kuyruğa yazacaktı. birincil thread içinde ise bu kuyruktaki bilgiler okunarak gerekli çizimler yapılacaktı. düşündüğü gibi de yaptı. aldığı sonuçtan oldukça tatmin olmuştu.

eserini bir süre izledikten sonra hareketlerin kesik kesik değil canlandırılmış olması gerektiğini düşündü. çünkü bu ilk sürümde bir taşın hareketi başlangıç çubuğunun ve hedef çubuğun üzerinde olmak üzere iki adımda gösteriliyordu. aradaki geçiş hareketinin eğrisel olmasını istiyordu yeraltı kodlayıcı. bunun için y=(x^2/n)+c fonksiyonunun yardımına başvurdu. elde ettiği sonucu zevkle izlerken hayranlıkla dolu gözlerime doğru döndü ve şöyle dedi:

- bilgi her yerdedir. elbette herkeste bir giz vardır. bize de bu gizi çözmek düşer eski dostum.

Follow me on Twitter

yorumlar Disqus aracılığıyla sunulmaktadır