Kotlin Language Features Related to Null Handling

Any software engineer with a Java background would find the null handling features in the Kotlin language interesting. Let's summarize this topic with some examples. Nullable types: In Kotlin, types are non-nullable by default. If you want a variable to be able to hold a null value, you need to explicitly declare its type as nullable using the Type? syntax. For example, String? denotes a nullable string, while String represents a non-nullable string. Safe calls (?.): Kotlin introduces the safe call operator (?.) for handling nullable types. It allows you to safely invoke a method or access a property on a nullable object. If the object is null, the expression returns null instead of throwing a NullPointerException. Example: data class Person(val name: String, val age: Int, val address: String?) fun main() {     // Create a person with a nullable address     val person1 = Person("John Doe", 25, "123 Main Street")     val person2 = Person("Jane Doe", 30,...

FEN Notasyonu ve UCI Protokolü

FEN NOTASYONU

Forsyth-Edwards Notasyonu, satranç pozisyonlarını ASCII karakter seti kullanarak ifade etmeye yarayan bir standarttır. Satranç programcıları için standart bir pozisyon notasyonu çok önemlidir çünkü böylece pozisyon veritabanlarını birbirleri ile paylaşabilirler. Satranç motorlarının test edilmesinde bu veritabanları önemli yer tutar ve yorucu veri girişi işlemlerinden kurtulmayı sağlar. [1]

FEN tanımlaması tek satırdan oluşur ve 6 alandan ibarettir:

  • İlk alan, taşların yerleşimini ifade eder. Taşların dizilimi 8. satırdan başlanarak gösterilir. Beyaz taşlar için "PNBRQK" şeklinde büyük harfler kullanılırken, siyah taşlar için küçük harfler kullanılır.
  • İkinci alan aktif rengi ifade etmektedir. Eğer sıra beyazda ise "w" değerini alır.
  • Üçüncü alan rok yapma iznini ifade eder. Eğer her iki taraf da rok yapamıyorsa "-" değerini alır. Eğer beyaz, şah tarafına rok yapabiliyorsa "K", vezir tarafına rok yapabiliyorsa "Q" değerini alır.
  • Dördüncü alan, en passant hamlesi için hedef olan kareyi gösterir. Eğer herhangi bir en passant hedef karesi yoksa "-" değerini alır.
  • Beşinci alan, yarım hamle sayısını gösterir. Bu, elli hamle kuralı içerisinde beraberlik oluşması açısından önemlidir.
  • Altıncı alan tam hamle sayısını gösterir. Bu sayı, siyahlar hamle yaptığında arttırılmaktadır.

Satrançta başlangıç pozisyonunu ifade eden FEN tanımı şu şekildedir:

rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1

FEN notasyonu PGN (Portable Game Notation) içerisindeki bir kısım olarak değerlendirilmektedir. Modern satranç motorlarının hepsi bu standartları desteklemektedir.

UCI PROTOKOLÜ

UCI spesifikasyonu işletim sisteminden bağımsızdır. Satranç motoru Windows sistemlerinde bir .exe dosyasıdır. Motor ile grafik arayüz arasındaki iletişim standart giriş/çıkış yoluyla ve text komutları ile yapılmaktadır. Motor hızlı bir biçimde boot ederek GUI tarafından gönderilecek komutlara hazır olmalıdır. Motora "isready" veya "setoption" komutları geldiğinde içsel parametrelerini set etmelidir.
Motor, düşünürken bile standart giriş kısmından gelen komutları işleyebilmelidir. Motor kendisine bir "go" komutu gelmediği sürece hesaplamaya başlamamalıdır. Motor belli bir pozisyonu hesaplamaya başlamadan önce "position" komutunu almış olmalıdır. Varsayılan durumda açılış kitabı GUI tarafından yönetilecektir. Motor, kendisine anlamsız veya yanlış bir komut geldiğinde onu basitçe yok sayacaktır. Hamlelerin ifade edilişi uzun cebirsel notasyon ile olacaktır. [2]

Önemli UCI Komutları

GUI'den Motora:

  • uci
    Motora UCI protokolünü kullanmasını söyle. Bu komut program çalıştırıldığında bir kez gönderilecektir. Komutu alan motor, kendisini tanıtarak "option" komutları ile desteklediği ayarları bildirecektir. Daha sonra "uciok" komutu ile protokolü desteklediğini bildirecektir, aksi halde çalışması durdurulacaktır.
  • debug [ on | off ]
    Debug modunu açmak ve kapamak için kullanılır. Motor düşünürken bile debug modu değiştirilebilmelidir.
  • isready
    Motorun yeni bir komutu işlemeye hazır olup olmadığını anlamak ve GUI ile senkronize olmasını sağlamak için kullanılır. "readyok" komutu ile cevaplanmaktadır.
  • position [fen | startpos ] moves ....
Motor içsel olarak pozisyonu kurmalı ve komuttaki hamleleri oynamalıdır. Pozisyon FEN notasyonundaki gibi ya da başlangıç pozisyonunda olabilir.
  • go
    "position" komutu ile verilmiş olan pozisyonu hesaplamaya başla.
  • go searchmoves ....
    Arama işlemini verilen hamleler ile sınırla
  • go wtime
    Beyazın x milisaniye düşünme süresi kalmıştır.
  • go mate
    x hamlede mat ara.
  • go ponder
    Ponder moduna geçerek arama yap. Burada motora GUI tarafından rakibin yapması tahmin edilen hamle söylenmekte ve bunun üzerinden düşünmesi istenmektedir.
  • ponderhit
    Rakip tahmin edilen hamleyi yapmıştır. Motor normal arama moduna dönmelidir.

Motor'dan GUI'ye

  • id
    GUI'den "uci" komutu alındıktan sonra cevap olarak dönmelidir.
  • uciok
    "id" komutundan sonra gönderilir ve tüm bilgilerin gönderilmiş olduğu ve uci modunda hazır olunduğu anlamına gelir.
  • bestmove
Motor hesaplama işlemini tamamlamış ve en iyi hamleyi bulmuştur.
  • info
    Hesaplama ile ilgili ayrıntılı bilgiler verilir.
  • option
Motor parametreleri açıklanır.



[1] Edwards, S. J. "Portable game notation." (1994).

[2] Kahlen, Stefan-Meyer, and Rudolf Huber. "Universal chess interface (uci)." (2014).

Comments

Popular posts from this blog

Trie Data Structure and Finding Patterns in a Collection of Words

Virtual Memory

NOTES ON COMPUTER ARCHITECTURE: Some important concepts in computer architecture