Kotlin ile Programlama Becerinizi Geliştiriniz

Merhaba arkadaşlar TurkeyKUG olarak Kotlin dilini daha iyi öğrenmeniz ve programcılık becerilerinizi geliştirebilmeniz için yeni bir yazı dizisi hazırlamaya karar verdik. Bildiğiniz gibi Kotlin dili dünya genelinde hızla yayılmaktadır. Şüphesiz bunun en önemli nedeni Google firmasının bu dili Android için resmi geliştirme dili olarak kabul etmesidir. 17 Mayıs 2017 tarihinden itibaren yapılan bu duyuru ile Kotlin programlama dili popüler olmaya başladı.

Bu yazı dizisinin temel amacı programcılık becerilerinizi geliştirmeyi sağlamaktır. Kolay, orta ve zor olmak üzere sınıflandıracağımız gündelik problemleri Kotlin ile çözmeye çalışacağız. Şu an için kolay kategorisinde hazırladığımız kodları sizlerle paylaşacağız. Yeni yazılardan anında haberdar olmak için web sitemizi takip etmeyi unutmayınız.

Burada sizlerle paylaşacağımız problemleri CodeChef ve Codeforces sitelerinden aldık. Bu iki site Competitive Programming yani rekabetçi programlama alanında kendini geliştirmek isteyenler için takip edilmesi gereken önemli sitelerin başında gelmektedir. Her iki sitede bulunan problemlerin bazılarını sizler için çevirisini yaparak Kotlin ile çözmeye çalışacağız. Bunu yapma amacımız sizlerin hem programcılık becerinizi geliştirmek hemde Kotlin dilinin özelliklerini örnek olaylar üzerinde göstermektir. Kotlin yeni bir dil olduğu için unutmadan belirtmekte fayda görüyoruz, bu sitelerden aldığımız problemler çoğunlukla Java, C ve C++ gibi dillerle çözülmüştür. Biz ise Kotlin dilini kullanarak rekabetçi programlama alanında ihtiyaç duyulan bir eksiği gidermeye çalışacağız.

Şimdi kotlin için ilk örnek uygulamayı birlikte yapalım. Burada yazacağımız bazı kod bloklarını daha sonra tekrar kullanacağımız için bu ilk örnek çok önemlidir. Umarım bu yazı dizisinden memnun kalır ve paylaşarak bana destek olursunuz.

ATM

Ali ATM’den x TL çekmek istiyor. Makine hesapta yeterli para olduğu zaman (banka masrafı da dahil olmak üzere) 5’in katları olan değerleri vermektedir. Örneğin; hesapta 100 TL var, Ali 20 TL (5’in katı olduğu için alınabilir) çekmek istiyor. Banka, masraf olarak 0.5 TL alıyor. Bu durumda hesapta 79.5 TL kalır. Amaç bu hesaplamayı yapan Kotlin kodunu yazmanızdır. Kısıtlamalar şunlardır;

Input

Ali’nin çekmek istediği miktar 0< x <= 2000 aralığında ve tamsayı olmalıdır. Ali’nin hesabındaki bakiye 0<= y <= 2000 aralığında ve tamsayı olmalıdır. Bunların kontrolünü yapınız. Bu iki değer aralarında boşluk olacak şekilde tek bir satır içinde girilmelidir.

Output

Yapılan işlemden sonra hesap bakiyesini ekrana yazınız. Eğer yeterli bakiye yoksa veya çekilmek istenen değer 5’in katı değil ise mevcut bakiyeyi ekrana yazdırınız.

Örnek – Başarılı
Giriş:
20 100

Çıkış:
79.5

Örnek – Yanlış Para Çekme Tutarı
Giriş:
19 100

Çıkış:
100

Örnek – Yetersiz Bakiye
Giriş:
150 100

Çıkış:
100

fun readLn() = readLine()!!
fun readArr() = readLn().split(" ")
fun readToInt() = readArr().map { it.toInt() }

fun main() {
    val (amount, total) = readToInt()

    if (amount in 1..2000 && total in 0..2000 &&
        amount % 5 == 0 && (amount + 0.5) <= total) {
        println("${total - amount - 0.5}")
    } else {
        println(total)
    }
}
Ali 20 TL çekmek istiyor. Hesapta 100 TL var. Şartları sağladığı için ekranda kalan bakiye okunur
Ali 19 TL çekmek istiyor. Şartı sağlamadığı için ekranda bakiye okunur.
Ali 100 TL para olan hesaptan 150 TL çekmeye çalışıyor. Şartı sağlamadığı için ekranda bakiye okunur.
fun readLn() = readLine()!!
fun readArr() = readLn().split(" ")
fun readToInt() = readArr().map { it.toInt() }

Yukarıda verilen metotları yoğun bir şekilde kullanacağız. İlk metot (readLn) ile konsoldan girilen verinin alınması sağlanır. İkinci metot(readArr) ile girilen veriler arasında boşluk olacağı için split metodu ile verilerin ayrılması ve bir dizi oluşturulması sağlanır. Son metot ise split ile ayrılan verilerin Int tipine dönüşümünü sağlar. Dikkat edilirse kullanıcı iki sayıyı aralarında boşluk olacak şekilde konsola girmiştir. Bunların ayrılması ve matematiksel işlemlerin yapılabilmesi için bu üç satırı birlikte kullanmanız gerekir.

 val (amount, total) = readToInt()

Yukarıda verilen satır ile kullanıcının aralarında boşluk bırakarak girdiği iki sayının amount ve total değişkenlerine atanması sağlanır. Uygulamada sadece iki sayı için giriş yaptık isterseniz daha fazla sayıda girebilirsiniz. Örnek olması bakımından aşağıdaki kodu inceleyelim.

fun readLn() = readLine()!!
fun readArr() = readLn().split(" ")
fun readToInt() = readArr().map { it.toInt() }

fun main() {
    val (a, b, c, d, e) = readToInt()
    var avg = (a + b + c + d + e) / 5
    println("Avg : $avg")
}
Girilen 5 adet sayının ortalamasını bulan program ekran çıktısı

Yukarıda dikkat edilirse val anahtar ifadesinde a, b, c, d ve e olmak üzere beş adet değişken bulunmaktadır. Özetle istediğiniz kadar sayıyı tek bir satırda girip zamandan tasarruf edebilirsiniz. Şimdilik bu kadar görüşmek üzere.

**Bana en büyük desteğiniz yazılarıma yorum yapmanız ve paylaşmanızdır.

Kaynaklar
https://www.codechef.com/problems/HS08TEST
https://kotlinlang.org/docs/tutorials/competitive-programming.html