Sekkaşı’nın Bayırı: Bayatlı’nın Düşünce Değirmeninden Sızanlar

Ulusal Bilgisayar Olimpiyadı 2009 – Soru 36

1 Puan2 Puan3 Puan4 Puan5 Puan6 Puan7 Puan8 Puan9 Puan10 Puan (Henüz Puanlanmamış)
Loading ... Loading ...

Soru metni için öncelikle 40. soruda verdiğimiz açıklamaları okuyun.
‘i3(3(<)i)’ komutu kaç numaralı şekli çizer?
A) (1)
B) (6)
C) (9)
D) (10)
E) (14)

CEVAP: Nispeten kolay bir soru. Komutu incelersek ilk olarak kuzeye ilerleyip daha sonra 3 kere 135 derece sola dönüp ilerlemeliyiz.

Soru 36

Soru 36

Yukarıdaki şekilden takip edersek önce kuzeye yani 1′den 2′ye. Daha sonra sola 135 derece dönüp ileriye. Yani 2′den 3′e. Yine 135 derece sola dönüş ve ilerleme : 3′den 1′e. Son kez 135 derece sola ve ileri : 1′den 4′e. Doğru cevap C) (9)

Java Dersleri 14 – Koleksiyon API (Collection API) Kuyruklar (Queue)

1 Puan2 Puan3 Puan4 Puan5 Puan6 Puan7 Puan8 Puan9 Puan10 Puan (1 oy, ortalama: 7,00 / 10)
Loading ... Loading ...

Koleksiyon API’sine ait diğer bir arayüz kuyruk (queue) arayüzüdür. Temel olarak listeye benzemekle birlikte listelerden farkı elemanlarını farklı bir şekilde sıralamasıdır. Kuyruk her zaman olmamakla birlike elemanlarını FIFO (ilk giren ilk çıkar) mantığıyla dizerler. Bunun farklı olduğu durumlar da mevcuttur. Örneğin PriorityQueue (Öncelik Kuyruğu) içindeki elemanları neye göre karşılaştıracağını kullanıcıya sorar. Eğer kullanıcı tarafından bir karşılaştırma yöntemi belirtilmezse doğal sıralama yöntemlerini kullanır. Örneklerle kuyruk arayüzünü tanıyalım :

        Queue<String> q = new LinkedList<String>();
        for (int i = 0; i < 10; i++) {
            q.offer(String.valueOf(i));
        }
        for (int i = 0; i < 10; i++) {
            System.out.println(q.poll());
        }

Bu örnekte bir kuyruk yapısına String olarak 0′dan 10′a kadar olan sayılar önce eklenmiş daha sonra eklendiği sırada çıkarılmıştır. Kuyruğa eleman eklemek için offer() metodunu kullanıyoruz. Aynı iş için add() metodu da mevcuttur. Farkları ise ekleme işlemi başarısız olduğu zaman offer() metodu null değeri dönerken add() metodu istisnai durum fırlatır. Kuyruğun başındaki elemanın değerini alarak kuyruktan kaldırmak için ise poll() metodunu kullanıyoruz. offer() metodunda olduğu gibi poll() metodu için de farklı bir versiyon olan remove() metodu bulunur. Farkları yine başarısız olma durumundaki davranışlarıdır. Kuyruk veri yapısından sıradaki elemana ulaşmak için peek() metodu kullanılır. Bu metod sıradaki elemanı kullanıcıya verir fakat kuyruktan silmez. Şimdi de FIFO’dan farklı bir sıralama yöntemiyle çalışan kuyruk örneği yazalım. Yazacağımız örnek kelimeleri içerisindeki sesli harf sayısına göre kuyrukta tutsun. Yani içinde daha fazla sesli harf olan kelime kuyrukta önde yeralsın :

        PriorityQueue<String> pq = new PriorityQueue(15, new Comparator() {
            public int compare(Object o1, Object o2) {
                if ( o1 instanceof String && o2 instanceof String)
                {
                    String s1 = (String) o1;
                    String s2 = (String) o2;
                    int vowels1 = s1.replaceAll("[^aeıioöuü]", "").length();
                    int vowels2 = s2.replaceAll("[^aeıioöuü]", "").length();
                    return vowels2 - vowels1;
                }
                return 0;
            }
        });

Örneğimizde kullanıcı tarafından tanımlanmı isimsiz bir Comparator nesnesini kullanarak bir PriorityQueue oluşturuyoruz. Comparator nesnemiz iki String’i içindeki sesli harf sayısına göre karşılaştırmaya yarıyor. Sesli harf sayısını bulmak için String sınıfının replaceAll() metodunu kullanıyoruz. Bu metod verilen düzenli ifadeyi, ikinci parametresiyle değiştirir. Şimdi oluşturduğumuz PriorityQueue nesnesine elemanlar ekleyelim ve sonucu görelim :

        pq.offer("iğne");
        pq.offer("iplik");
        pq.offer("bilgisayar");
        pq.offer("masa");
        pq.offer("sandalye");

        while(!pq.isEmpty())
        {
            System.out.println(pq.remove());
        }

En çok sesli harf “bilgisayar” kelimesinde olduğu için kuyruğun başında yer alacaktır. Daha sonra sırasıyla “sandalye”, “masa” , “iğne” , “iplik” kelimeleri gelecektir.

Java Dersleri 13 – Koleksiyon API (Collection API) Listeler

1 Puan2 Puan3 Puan4 Puan5 Puan6 Puan7 Puan8 Puan9 Puan10 Puan (2 oy, ortalama: 8,50 / 10)
Loading ... Loading ...

Koleksiyonlar yazılımımızda verinin hafızada nasıl tutulacağına karar veren soyut veri yapılarıdır. Koleksiyon sınıfları verileri sıralaması, tekil veri taşıyıp taşımaması gibi özelliklerine göre birbirinden ayrılır. Yapacağımız işlemlerin sıklığına göre bu kapsayıcı (container) koleksiyon sınıflarından seçim yapmamız gerekir. Bu seçim yazılım performansı için hayati önem taşımaktadır. Örneğin elimizdeki veriye sıralı (sequential) veya rastgele (random) erişip erişmeyeceğimiz önemlidir. Bu da bizim kapsayıcı sınıf seçimimizi etkileyecektir. İkinci bir örnek olarak elimizdeki verinin sürekli olarak sıralı tutulmasını arzu ediyor olabiliriz. Bu da seçimimize direkt olarak yansıyacaktır.
Devamı »

Python Deneyimleri 3

1 Puan2 Puan3 Puan4 Puan5 Puan6 Puan7 Puan8 Puan9 Puan10 Puan (Henüz Puanlanmamış)
Loading ... Loading ...

Python Logo

Python Logo

  1. Python’da resim işlemek için standart bir kütüphane yok. Harici kütüphane olarak PIL kullanılabilir
  2. Herhangi bir resim dosyasını açmak için Image.open() kullanılıyor. Teker teker piksellere getpixel() fonksiyonuyla ulaşılabiliyor
  3. Herhangi bir ASCII kodu karaktere çevirmek için chr() fonksiyonu kullanılıyor
  4. Herhangi bir listedeki değerleri tek string nesnesinde birleştirmek için sıkça join() fonksiyonu kullanılıyor. Örneğin
        mesaj=[78, 110, 66, 101, 143, 114, 105, 116, 71]
        print '(',''.join([chr(k) for k in mesaj]),')'
    
  5. Resim dosyası üzerine çizmek için ImageDraw modülü kullanılıyor. Örnek :
        im = Image.new('1', (500,500), 1)
        draw = ImageDraw.Draw(im)
        draw.line(listOfXYTuples)
    
  6. Dosya silmek için os modülünün remove() fonksiyonu kullanılıyor. Örneğin :
        os.remove('sample.png')
    
  7. QString’den python stringine dönüşümü str fonksiyonu ile yapiyoruz
  8. PyQt denemeleri yapmak için QtDesigner entegrasyonu olan ERIC IDE’sini denedim ama NetBeans çok daha rahat bu konuda.

Python Deneyimleri 2

1 Puan2 Puan3 Puan4 Puan5 Puan6 Puan7 Puan8 Puan9 Puan10 Puan (Henüz Puanlanmamış)
Loading ... Loading ...

Python Logo

Python Logo

  1. Fonksiyon tanımlamak için def anahtar kelimesini kullanıyoruz. Fonksiyon çağrılmadan önce tanımlanmış olmalı
  2. from … import … ifadesinde birinci importtan sonra gelen yere modül adı importtan sonra gelen yere de fonksiyon adı giriliyor. Yani fonksiyonu import etme durumu var. Modül ednilen şey de bağımsız .py uzantılı dosyalar.
  3. Anladığım kadarıyla fonksiyona parametreler pass-by-value yöntemiyle gönderiliyor.
     def fonksiyon(isim ):
            print "Fonksiyondan çağrıldı", isim
            isim = "hübele"
        isim = "hebele"
        fonksiyon(isim)
        print isim
    

    kod parçacığı

    Fonksiyondan çağrıldı hebele
    hebele
    

    çıktısını veriyor.

  4. Hemen bir recursive fonksiyon deneyip fibonacci yazıyorum. Sorun yok :)
    def fibonacci(number):
        if number == 0:
            return 0
        elif number == 1:
            return 1
        else:
            return number + fibonacci(number-1)
    
    print fibonacci(5)
    
  5. Modülleri import ederken from “modül_adı import *” kullandığımızda “__” ile başlayan fonksiyonları import etmiyormuş dikkat etmek gerek
  6. Klasör oluşturma,silme,klasör içeriğini listeleme,harici çalıştırılabilir dosya çalıştırma, process açma kapama gibi işlemlerios modülü aracılığıyla yapıyoruz. Hayati öneme sahip.
  7. Herhangi bir modülde hangi fonksiyonların olduğunu öğrenmek için dir(module_adı) kullanılıyor.
  8. Text dosya okumak,yazmak çok kolay. Sadece open, write, close gibi fonksiyonlar kullanılıyor. Ama open dedikten sonra size dönen değişkenin tipini anlayamadım doğrusu. Fonksiyonlar modül dönebiliyorlar mı?
  9.  dosya = open("testdosyasi.txt","w")
        print type(dosya)
    

    çıktı olarak type ‘file’ veriyor. Bu file tipi nerede tanımlanmış onu bilmem lazım.

  10. Matematikte üstlü sayıları hesaplamak için ** operatörü kullanılıyor
  11. zip dosyalarıyla ilgili işlemler yapmak için zipfile modülü mevcut. Komut satırından zip dosyası açmak kadar kolay kullanımı var
  12. Bir dosyanın zip dosyası olup olmadığını kontrol etmek için is_zipfile() fonksiyonu mevcut
  13. zip dosyası içinden herhangi bir dosya çıkarmak için extract() dosya meta verisine ulaşmak için getinfo() fonksiyonları mevcut.

Python Deneyimleri 1

1 Puan2 Puan3 Puan4 Puan5 Puan6 Puan7 Puan8 Puan9 Puan10 Puan (Henüz Puanlanmamış)
Loading ... Loading ...

Python Logo

Python Logo

  1. http://www.istihza.com buradaki python2.x derslerini takip ediyorum
  2. from … import … ifadeleri sayfanın başına yazılmalıymış
  3. from’dan sonra gelen şeyin paket importtan sonra gelen şeyin sınıf tarzı bir şey olduğunu zannediyorum
  4. Türkçe karakterleri kullanabilmek için #_*_ coding: utf-8 _*_ yazıyoruz. Yine sayfamızın en başına ekliyoruz bunu
  5. print fonksiyonuna birden fazla argüman verirken , kullanıyoruz
  6. Kullanıcıdan girdi input() ve raw_input() fonksiyonları ile alınıyor. input() nümerik değer dönerken, raw_input() string değer dönüyor
  7. pre/post increment/decrement (++/–) operatörleri mevcut değil.
    a = 1
    while a < 10:
        print "Daha Bitmedi"
        ++a;
    

    ifadesi sonsuz döngüye sebep oluyor. Syntax hatası vermedi ilginç!

  8. döngülerde range() fonksiyonu kullanılıyor. Bu fonksiyon Matlab’dan tanıdık geldi bana.
  9. Java ve C++ dan bildiğim liste veri yapısı Python’da built in type olarak karşıma çıktı. Kullanımı çok kolay. append(), insert() gibi fonksiyonlarla düzenleme yapmak pratik.
  10. Liste içinde farklı veri tipleri barınabiliyor.
  11. Listeler + operatörü ile birleştirlebiliyor fakat – operatörü tanımlı değil
  12. pop() listenin son elemanını atıyor
  13. Listeler tersten indekslenebiliyor liste[-1] son elemanı gösteriyor. Büyük kolaylık
  14. Matlab’da bulunan aralık indeksleme yöntemi mevcut. Liste[1:3] 1. eleman dahil 3. eleman dahil olmamak kaydıyla aralıktaki elemanları belirtiyor
  15. Değiştirilemeten bir liste yapısı (tuple) var. Bunun tam olarak ne işe yaradığından emin değilim.
  16. HashTable benzeri sözlük veri yapısı da built in type olarak mevcut. Farklı bir özellik olarak tüm anahtarlar aynı tipte olmak zorunda değil. Scripting diye buna diyorlar herhalde

Fruchterman-Reingold Graf Yerleşim Algoritması

1 Puan2 Puan3 Puan4 Puan5 Puan6 Puan7 Puan8 Puan9 Puan10 Puan (1 oy, ortalama: 10,00 / 10)
Loading ... Loading ...

Fruchterman-Reingold

Fruchterman-Reingold


Algoritma Adı:Fruchterman-reingold Graf Yerleşim Algoritması
Algoritma Türü:
Graf Yerleşim Algoritması
Açıklama:
Graf yerleşim algoritmaları, graf üzerinde bulunan köşelerin verilen alan içerisine en iyi şekilde yerleştirilmesini amaçlar. En iyi yerleşimi sağlamak için şu temel prensipler göz önünde bulundurulur :

  1. Köşeleri verilen alan içerisine homojen bir şekilde yay
  2. Kenar kesişmelerini en aza indirge
  3. Kenar uzunluklarını birbirine eşit tut
  4. Varolan simetriyi yansıt
  5. Alan büyüklüğüne adapte ol

Fructerman-Reingold algoritması bunların tamamını sağlayamasada 1,3 ve 4. prensipler bazında iyi bir performans sunar. Bu algoritma graf köşelerini birer çelik bilye kenarları ise birer yay kabul eden algoritmalar sınıfındandır. Graf yapısını fiziksel bir sisteme benzeterek enerjisini minimuma çekmeye çalışır. Gerçek fiziksel yay kuvvet hesapları kullanılmaz. Ayrıca gerçek sistemlerdeki itme ve çekme kuvvetlerini uygulamak yerine daha basit bir model takip edilir. İtme kuvvetleri tüm köşeler için hesaplanırken, sadece bağlı köşeler birbirini çeker. Algoritmanın pseudo kodu şu şekildedir :

  1. Her köşe üzerine düşen itici kuvvetleri hesapla
  2. Her köşe üzerine düşen çekici kuvvetleri hesapla
  3. Köşeleri hareket ettir
  4. Maksimum mesafeyi azalt
  5. Yukarıdaki 4 maddeyi yeterince tekrarla

Algoritma her basamakta köşelerin maksimum hareket mesafesini biraz daha daraltarak sisteme damper etkisi vermekte. Algoritmanın nasıl çalıştığını daha iyi anlamak için ufak bir uygulama geliştirdim. Kullanmak için öncelikle graf yapınızın kayıtlı olduğu dosyayı açmanız, sonrada animasyon menüsünden başlatı seçmeniz gerekli. Algoritmanın detaylarına ve uygulamaya aşağıdaki linkten ulaşabilirsiniz.

  Fruchterman Reingold Graf Yerleşim Algoritması (1,2 MiB, 50 hits)