Bir İşlem

Yurt dışında “Countdown”, Türkiye’de ise “Bir Kelime Bir İşlem” adıyla bilinen yarışma programının işlem kısmını sonunda bir Web uygulaması olarak bitirmiş bulunuyorum. Sayfa düzeni şimdilik mobil cihazlar göz önünde tutularak hazırlanmış durumda.

Oynanış: Oyunda hedef verilen altı adet sayıyyla dört işlem yaparak hedef sayıya mümkün olduğunca yaklaşmak. Bir kullanılan sayı bir daha kullanılamıyor. Bu sayılar kırmızı kenarlarla gösteriliyor. Sarı kenarlı sayılar kullanılabilecek sayıları gösterirken, seçilmiş sayı da yeşil kenarla gösteriliyor. İşlemin ilk sayısını seçtikten sonra bir işlem seçiliyor. Ardından da bu işlem için gereken ikinci sayı seçiliyor. Bu aşamada program işlemin sonucunu ilk seçilen sayının yerine yazıyor ve ikinci sayıyı kullanılmayacak şekilde işaretliyor. Bir sonraki adımda işlemin sonucu hemen kullanılabilsin diye bu sayı otomatik olarak seçiliyor. Eğer başka bir sayı ile işlem yapılmak istenirse kullanıcı sarı sayılardan birini seçebilir. Bu durumda seçilen sayı değişecektir.

İşlemlerin altındaki sırada ise oyunla ilgili tuşlar bulunmakta. En soldaki tuş o ana kadar bulunmuş en yakın sonucu çözüm olarak değerlendirmeye sokuyor. Bu tuşa basılınca kalan zamana ve hedefe ne kadar yaklaşıldığına göre bir skor hesaplanıyor. Onun yanında çözüm tuşuna basılınca program hedefe olası en yakın çözümü hesaplıyor ve bu tuşların altındaki alana bu çözümü yazıyor. Geri al tuşuna basınca son yapılan işlem geri alınıyor ve kullanıcı başka bir işlem yapabiliyor. Bu şekilde oyunun en başına dönmek mümkün. En sağdaki tuşla da yeni bir oyun başlatılıyor.

Programla ilgili biraz da bilgi vereyim. Oyun HTML, CSS ve Javascript kodlarından oluşuyor. Çözüm algoritması verilen sayılarla olası bütün işlemleri yapıyor ve her işlemden sonra sonuçla karşılaştırıyor. Eğer ciddi bir hata yapmadıysam çözüm tuşuna (ampule) basınca program en iyi çözümü gösterecektir. Bu en iyi çözüm sırasında bazen gereksiz işlemler de oluyor ama sonucu etkileyen bir durum değil bu. Henüz bu gereksiz işlemleri çözümden çıkaracak kısmı programlamadım.

Program mobil cihazlarda CSS viewport birimleri destekleyen tarayıcılarda doğru gösteriliyor. Şimdilik sadece Chrome (51 ve sonrası) ve Firefox (48) versiyonlarıyla test edebildim. Android standard tarayıcıda doğru çalışmadığına dair ekran görüntülerini de gördüm.

Programın geliştirilmesi aşamasında fikirlerinden (Kullanıcı ara birimi ve oynanış) faydalandığım Hatice Savaş’a da teşekkürlerimi sunarım.

Bir İşlem

Ha o piç midur?

Babaannemin demansı artık iyice ilerlemişti. Çoğunlukla Gölcük’te babamlarda kalıyordu. Ben de pek düzenli olmamakla birlikte hafta sonları eve gidiyordum.

Kuzenlerle Gölcük’e gitmiştik. Akşam ev epey kalabalıktı. Babaannem bize eski hikayeleri bininci kez anlatıyordu ve biz de her seferinde olduğu gibi gülmekten yerlere yatıyorduk. O sırada telefon çaldı. Babam baktı. Ankara’dan amcam arıyordu. Son zamanlarda babaannemin durumunu öğrenmek arayanlar çoktu. Biz babaannemle karşılıklı hikayelerimize devam ederken babam da verecek iyi bir haber olmadığından morali bozuk bir şekilde amcamla ciddi bir konuşmaya dalmıştı.

 Bir süre sonra hiç durmayan kahkahalarımız babaannemin “Ha o piç midur?” sorusuyla kesildi. Herkes korkuyla birbirine bakıyordu. Herhalde kafa yine gitti diye düşünmeye başladık. Artık sessizlik dayanılmaz hale gelince biri babaanneme ne olduğunu sordu. Babaannem de babamı göstererek tekrar sordu:

Ha o piç midur?

Tanımadın mı babaanne? O senin oğlun.

Olamaz, piçtur o.

Nasıl olmaz babaanne, o senin oğlun.

Yok, yok. Biz burda hep beraber gülüyoz, o somurtuyo. O bizden değildur. Başkasundandur. Kesin piçtur.

Bunun üzerine kendimizi yere atıp tepinerek kahkaha atmaya başladık.

En ağır ve en hafif (Çözüm)

Küreleri \(K_{1} \), \(K_{2} \), … , \(K_{10} \) şeklinde gösterelim.

Basit bir çözüm olarak önce en ağırı sonra da en hafifi bulmayı deneyebiliriz. Yani önce  \(K_{1} \) ile \(K_{2} \) kürelerini tartıp o ana kadar en ağırı buluruz. Sonra bu en ağır ile bir sonraki \(K_{3} \) küresini tartarız. Eğer yeni küre daha ağır ise artık en ağır bu yeni küre olur. Bu şekilde on küre için dokuz tartı yapmamız gerekir. Aynı işlemi bir de en hafif küre için yapınca toplamda onsekiz tartı sonucunu buluruz. Peki bundan daha iyi bir sonuca ulaşabilir miyiz? Elbette.

Yukarıdaki algoritmada her küreyi o ana kadarki hem en ağır hem de en hafif kürelerle karşılaştırıyoruz. Sıradaki iki küre için toplam dört tartı yapar bu. Bu dört tartı yerine şöyle bir işlem yapabiliriz. Sıradaki iki küreyi birbirleriyle karşılaştırırız. Bu ikisinden daha ağır olanını o ana kadarki en ağır küreyle, hafif olanı da en hafifle karşılaştırırız. Böylece iki küre için dört tartı yerine üç tartı ile aynı miktarda bilgi edinmiş oluruz. İki küreden hafif olanı o ana kadarki en ağırla karşılaştırmanın bir anlamı yok, çünkü eğer bu hafif küre yeni en ağır olabilecekse o zaman ikisi arasındaki daha ağır olanı yeni en ağır olurdu. Aynı mantıkla yeni iki kürenin daha ağır olanını o ana kadarki en hafifle karşılaştırmak da anlamsız.

Bu yöntemle 10 küre için gereken tartı adedi şöyle bulunur:

İlk başta \(K_{1} \) ve \(K_{2} \) küreleri tartılarak o ana kadarki en ağır ve en hafif küreler tanımlanır. Bunun için bir tartı gerekli. Sonra kalan her küre çifti için üç tartı daha gerekli. Sekiz küre kaldığına göre toplam dört adet küre çifti vardır ve böylece \(4\cdot{3}=12 \) tartıya daha ihtiyacımız vardır. Böylece toplam \(1 + 12 = 13 \) tartıya ihtiyaç vardır.

Kağıt kromatografisi

Malzemeler: Kahve filtre kağıdı, çeşitli renkli kalemler (tükenmez, ispirtolu), su

Deneyin yapılışı: 

Başlangıç durumu.
Başlangıç durumu.

İki değişik siyah renkle alt kenardan eşit uzaklıkta iki işaret koydum. Başka renkli kalemler de kullanılabilir tabii ki. Ondan sonra kağıdın alt tarafını içinde bir miktar su olan bir kaba daldırdım. Kağıt suyu daha yavaş emsin diye kağıdın sadece ucunu suya soktum. Böylece boyalar daha az dağılıyor.

Su kağıdın tepesine ulaştığında aşağıdakilere benzer şekiller oluştu.

IMG_3178
solda Faber-Castell permanent sağda stabilo siyah mürekkep
IMG_3180
solda ucuz bir siyah mürekkep sağda kurumuş edding siyah kaligrafi mürekkebi
IMG_3179
solda ucuz bir siyah mürekkep sağda henüz kurumamış edding siyah kaligrafi mürekkebi

Birinci deneyden Stabilo kalemlerdeki siyah rengin aslında bir kaç rengin karışımından meydana geldiğini görebiliyoruz. Soldaki permanent kalemin kullandığı boyanın ise kağıda tamamen yapıştığını ve suda çözülmeyerek hiç hareket etmediğini görüyoruz. Bu nedenle bu kalemleri suyla silemiyoruz.

İkinci deneyde solda başka bir ispirtolu boya ile kaligrafi kalemini karşılaştırdım. Kaligrafi mürekkebi kuruduktan sonra kağıda tamamen yapıştığından hiçbir hareket gözleyemedim. Bu nedenle üçüncü deneyde bu ikiliyi tekrar karşılaştırdım ama bu sefer kaligrafi mürekkebi kurumadan kağıdı suya daldırdım. Görüldüğü gibi kaligrafi mürekkebi diğer mürekkebe göre çok daha az pigmentten meydana geliyormuş.

Bu olayın açıklaması ve daha ciddi uygulamaları bu linkte anlatılıyor. Kısaca bir pigment suda ne kadar iyi çözünürse o kadar yukarı çıkabiliyor.

Yarasa

Ümit: Baba, yarasa yakalayabilirsem ona bakabileceğim sözünü unutmadın değil mi?

Ben: Elbette unutmadım.

Ümit: O zaman bir yol buldum sanırım.

Ben: Nasıl bir yol?

Ümit: Yarasalar en çok ne ister?

Ben: (İçimden böcekler diye düşünerek) Bilmem. Ne isterler?

Ümit: Tabii ki dişi yarasalarla çiftleşmeyi.

Ben: (Demek erkek yarasa yakalamak istiyormuş) Eeee?

Ümit: O zaman yapmam gereken tek şey bir tane dişi yarasa yaratmak. Gerisi kendiliğinden gelir.

Ben: İyi fikir, hemen başla!

Döndürmeler ve ayna simetrileri

Ümit’in son ödevi verilen şekillerin döndürme ve ayna yansımaları sonucunda nasıl gözükecekleri üzerineydi. Örneğin sol sütunlarda F şekilleri belirtildiği gibi dönüştürülmüşse, aynı dönüşüme uğrayan L şekilleri nasıl görünecektir?

ödev sorusu
ödev sorusu

Ümit’in sinir krizlerinden bu soruyu kafasından yapamadığını anlamıştım. Sorun değil, ben de bu tür üç boyutlu sorularda zorlanırım. O zaman kolay bir yöntem bulmak gerekecekti. Ümit’e kağıttan F ve L şekilleri kesmesini söyledim. Ondan sonra bu iki şekli başlangıçtaki şekiller gibi üst üste koymasını söyledim. Ardından bu kağıtları birbirinden ayırmadan F şekli soruda istenen şekle gelene kadar döndürmesini söyledim. F şekli istenen şekle geldiğinde L de aranan şekle gelecektir, çünkü ikisi de aynı dönüşümlerden geçmiş olacak.

Bu gösterdiğim yöntemin mantığını anladığından pek emin değilim ama R şekli için verilmiş ödevi de hatasız çözdü.

Dikkat kurbağa çıkabilir!

dikkat geyik çıkabilir
dikkat geyik çıkabilir

Bu tabelayı bilmeyen kalmamıştır herhalde. Her ne kadar “Dikkat geyik çıkabilir!” diye anlaşılsa da aslında geyik dışındaki yabani hayvanları da kapsayan bir işarettir. Bu işaretler yabani hayvanların sık sık kullandığı yollara konularak sürücüleri kaza ihtimaline karşı uyarır.

Son yıllarda bu işaretlere bir yenisi eklendi. Dikkat amfibi (iki yaşamlı) çıkabilir. Bunlar hem suda hem karada yaşayabilen kurbağa, semender türü canlılar. İlkbaharda havaların ısınmaya başlamasıyla üremek için doğdukları su birikintilerine doğru göç etmeye başlıyorlar ve bu sırada genellikle araba yollarından geçmek zorunda kalıyorlar. Yollarda artan amfibi canlı ölümleri üzerine sürücülerin dikkatini çekmek için aşağıdakine benzer işaretler kullanılmaya başlandı. Görürseniz şaşırmayın!

dikkat kurbağa çıkabilir
dikkat kurbağa çıkabilir

CSS ile imtihanım

Birkaç gündür programda kullandığımız Audit dosyasının görünüşüyle ilgili sorunlarla uğraşıyordum. Audit dosyası verilei barındıran bir XML dosyası. Bu dosya bir XSL dosyası yardımıyla HTML sayfasına dönüştürülüyor. Test bölümü bu HTML çıktısında bazı satırların sayfaya sığmadığını bildirdi ve böylece bu maceramın başlangıcına gelmiş oldum. Çıktıda bazı satırlar sayfaya sığmadığı gibi en sağdaki sütun hep bir sonraki satırdan başlıyordu:

31-03-2016 13:14:16
Recep
Sistem ayarlarıyla öyle oynandı ki sistem artık saçmalamaya başladı
31-03-2016 13:14:15
Recep
Sistem ayarlarıyla oynandı

 

Aradığım çözüm ise son sütunun diğer sütunlarla aynı hizada başlaması ve sayfanın sağından taşan yazının da bir alt satırdan ama sütunun başladığı yerden devam etmesiydi. Ayrıca son sütun birden fazla satıra yayıldığında ise sütunları kapsayan bütün div elementi de aynı yüksekliğe sahip olmalı ki bu kayıt bir sonraki kaydın görüntüsünü bozmamalı. Sonunda şu sayfanın da yardımıyla aradığım sonuca ulaştım:

31-03-2016 13:14:16
Recep
Sistem ayarlarıyla öyle oynandı ki sistem artık saçmalamaya başladı
31-03-2016 13:14:15
Recep
Sistem ayarlarıyla oynandı

[sourcecode]
.table-layout {
display: table; width:100%;
}

.row-layout {
display: table-row; width:100%;
}

.dateTime {
white-space: nowrap;
width: 40%;
display: table-cell;
}

.source {
white-space: nowrap;
width: 20%;
display: table-cell;
}

.audit {
width: 50%;
display: table-cell;
}

<div class="table-layout">
<div class="row-layout">
<div class="dateTime">
31-03-2016 13:14:16
</div>
<div class="source">
Recep
</div>
<div class="audit">
Sistem ayarlarıyla öyle oynandı ki sistem artık saçmalamaya başladı
</div>
</div>
<div class="row-layout">
<div class="dateTime">
31-03-2016 13:14:15
</div>
<div class="source">
Recep
</div>
<div class="audit">
Sistem ayarlarıyla oynandı
</div>
</div>
</div>

[/sourcecode]