Kotlin'de golf için ipuçları


22

Google’ın son dönemde Android’in resmi Kotlin’i Android geliştirmeye destek verdiğini duyurması üzerine , toplumu bu görece yeni JVM dili için harika golf ipuçlarını almanın tam zamanında olabileceğini düşündüm.

Kotlin, JVM kardeşleri arasında golf oynamak için potansiyel olarak çekici kılan özelliklerin benzersiz bir kombinasyonunu içerir:

Peki Kotlin programımın son birkaç baytını nasıl sıkıştırabilirim? Cevap başına bir ipucu lütfen.


2
Kotlin'in uzun isimlerinden bazılarını kısaltan, ancak çok fazla ekstra eklemeyen (en azından başlangıçta) bir golf diline ilgi duyar mıydınız? Ortak 1 harf yapmayı, string char sayılarını kısaltmayı ve sadece 1 alıntı işaretiyle tek harfli dizeler eklemeyi düşünüyorum.
jrtapsell

* Ortak fonksiyonlar
jrtapsell


Daha fazla Kotlin çözümü sunmaya başlamayı düşünüyorum! Bu projeni de kontrol etmeliyim.
Tyler MacDonell,

Yanıtlar:


4

Uzatma fonksiyonları

Eklenti işlevleri, yerleşik yöntemlerin adlarını ve bunların zincirlerini azaltmaya gerçekten yardımcı olabilir, örneğin:

fun String.c() = this.split("").groupingBy{it}.eachCount()

ancak bu sadece aşağıdaki durumlarda yardımcı olur:

A) Çağrı tanımı iptal edecek kadar uzun

B) Çağrı tekrarlanır

Yöntemlerden çok lambda kullanımı

Lambdas, return anahtar sözcüğünü kullanmadan geri dönebilir ve baytları kaydedebilir

KotlinGolfer

Burada başlattığım ve güzel Kotlin kodunu alan ve otomatik olarak testler ve TIO bağlantıları içeren mesajlar veren bir proje.


4

Yerine +kullanıntoString

Tahmin edilebileceği gibi String, +işleci dize bitiştirme işlemi için aşırı yükler .

print("Hel" + "lo")

Ancak, dokümanlarý kontrol etmek bize Any?sadece kabul ettiðini söylemez String. Belirtildiği gibi:

Bu dize verilen diğer nesnenin dize gösterimi ile birleştirerek elde edilen dizgiyi döndürür.

Başka bir deyişle, birleştirme işleminden önce sağ taraftan String + anythingarama .toString()yapmanızı sağlar. Bu bize kısaltmak için izin verir it.toString()için ""+iten kötü, büyük bir en iyi 8 bayt tasarrufu ve 6 bayt.


Yerine foldkullanınjoinToString

Yukarıdakilerle ilgili olarak, eğer arıyorsanız mapve sonra bunun yerine joinToStringkısaltabilirsiniz fold.

list.map{it.repeat(3)}.joinToString("")
list.fold(""){a,v->a+v.repeat(3)}

TIL kıvrımı bir şey, güzel
Quinn


1

Paragraflarda İnt'leri tanımlama

Bu muhtemelen buna değebileceği oldukça spesifik kullanım durumlarına sahip olacak, ancak son sorduğum golf oyununda değişkenimi fonksiyonda tanımlamak yerine isteğe bağlı parametreler olarak tanımlayarak birkaç bayttan tasarruf edebileceğimi öğrendim.

Bu soruya cevabımdan bir örnek :

fonksiyondaki değişkeni tanımlamak:

fun String.j()={var b=count{'-'==it}/2;var a=count{'/'==it};listOf(count{'o'==it}-a,a-b,b)}

değişkenleri param olarak tanımlamak:

fun String.j(b:Int=count{'-'==it}/2,a:Int=count{'/'==it})=listOf(count{'o'==it}-a,a-b,b)

çünkü onları tanımlamak için aynı sayıda bayt olacağı var a=için aynı uzunluktur a:Int=(bu sadece durum için Int), ancak şimdi fonksiyonda sadece 1 satır olduğu için bırakabilirim {}ve bir tane de bırakıyorum ;(diğeri ise a ,) ile değiştirilir

Eğer bir Int tanımlamayı gerektiren fonksiyonlar varsa ve int fonksiyonunu tanımlamamışsanız 1 liner olur - o zaman bir parametre olarak kullanmak çift baytları kurtarır.


0

toinfix işlevi

Adında bir standart infix işlevi vardır toyaratan Pairiki değerden s. Genellikle s mapOf()tanımında kullanılır, Mapancak potansiyel olarak Pair()yapıcıdan çok daha kısa olabilir .

Pair(foo,bar)   //constructor
foo to bar      //best case 
(foo)to(bar)
((foo)to(bar))  //worst case

0

Lambda argümanlarında yıkım

Pair<*,*>Bir lambda almak istediğini söyle . Normalde, bununla başa çıkmak sinir bozucu olurdu. Örnek olarak, işte bir lambda alır Pairve iki değerin eşit olup olmadığını kontrol eder:

{it.first==it.second}

Bu uzun soluklu ve sakar. Neyse ki, Kotlin herhangi destructable türü destructure sağlar (her türlü o uygular componentN()gibi yöntemler Pair, Triplevs.) bir lambda argüman olarak. Böylece, bunu şu şekilde yeniden yazabiliriz:

{(a,b)->a==b}

F # gibi bir şeydeki bir tuple ile eşleşen formata benziyor ve birçok durumda. Ancak Kotlin'de çok çeşitli türler tahribatı desteklemektedir ( MatchResultfaydalıdır.)

Yine de daha fazla argüman alabilirsin. Diyelim ki lambda bir Pairve bir ek değer almak zorunda kaldı . Lambda imzasını şöyle yazmanız yeterlidir:

(a,b),c->  // pair first
a,(b,c)->  // pair second
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.