Lời khuyên cho việc chơi golf ở Kotlin


22

Trước thông báo gần đây của Google về hỗ trợ chính thức của Kotlin cho phát triển Android, tôi nghĩ rằng có thể kịp thời thăm dò ý kiến ​​cộng đồng về một số mẹo chơi golf tuyệt vời cho ngôn ngữ JVM tương đối mới này.

Kotlin bao gồm một sự kết hợp các tính năng độc đáo giữa các anh chị em JVM, khiến nó có khả năng hấp dẫn để chơi gôn:

Vì vậy, làm cách nào để tôi nén một vài byte cuối cùng ra khỏi chương trình Kotlin của tôi? Một lời khuyên cho mỗi câu trả lời, xin vui lòng.


2
Sẽ có hứng thú với một ngôn ngữ chơi golf rút ngắn một số tên dài hơn của Kotlin, nhưng không thêm nhiều tính năng bổ sung (ít nhất là ban đầu)? Tôi đang nghĩ đến việc tạo 1 chữ cái chung, làm cho chuỗi char đếm ngắn hơn và thêm chuỗi ký tự đơn chỉ với 1 dấu ngoặc kép?
jrtapsell

* Các chức năng phổ biến
jrtapsell

Có vẻ như sở thích chơi gôn của Kotlin không cao :( data.stackexchange.com/codegolf/query/793250/top-kotlin-golfers
jrtapsell

Tôi dự định bắt đầu gửi thêm giải pháp Kotlin! Tôi cũng sẽ phải xem dự án đó của bạn.
Tyler MacDonell

Câu trả lời:


4

Chức năng mở rộng

Các hàm mở rộng thực sự có thể giúp giảm tên của các phương thức được xây dựng và chuỗi của chúng, một ví dụ có thể là:

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

nhưng điều này chỉ giúp nếu:

A) Cuộc gọi đủ dài để hủy bỏ định nghĩa

B) Cuộc gọi được lặp lại

Sử dụng lambdas chứ không phải phương pháp

Lambdas có thể trả về mà không cần sử dụng từ khóa return, lưu byte

KotlinGolfer

Một dự án tôi đã bắt đầu ở đây có mã Kotlin khá và cung cấp các bài đăng với các bài kiểm tra và liên kết TIO tự động


4

Sử dụng +thay vìtoString

Như người ta có thể mong đợi, Stringquá tải +toán tử cho nối chuỗi, như vậy.

print("Hel" + "lo")

Tuy nhiên, kiểm tra các tài liệu cho chúng ta biết rằng nó chấp nhận Any?, không chỉ String. Như đã nêu:

Trả về một chuỗi có được bằng cách nối chuỗi này với biểu diễn chuỗi của đối tượng khác đã cho.

Nói cách khác, String + anythingđảm bảo gọi .toString()ở phía bên tay phải trước khi nối. Điều này cho phép chúng tôi để rút ngắn it.toString()tới ""+it, một đồ sộ 8 tiết kiệm byte lúc tốt nhất và 6 byte lúc tồi tệ nhất.


Sử dụng foldthay vìjoinToString

Liên quan đến vấn đề trên, nếu bạn đang gọi mapvà sau đó joinToString, bạn có thể rút ngắn điều đó bằng cách sử dụng foldthay thế.

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

TIL gấp là một điều, tốt đẹp
Quinn


1

Xác định Int trong params

Điều này có thể sẽ có một số trường hợp sử dụng khá cụ thể, trong đó có thể đáng giá, nhưng trong câu hỏi gần đây tôi đã đánh golf tôi thấy tôi có thể lưu một vài byte bằng cách định nghĩa biến của tôi là tham số tùy chọn thay vì xác định chúng trong hàm.

Ví dụ từ câu trả lời của tôi cho câu hỏi này :

xác định biến trong hàm:

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

xác định các biến là params:

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

bởi vì var a=có cùng độ dài vì a:Int=nó sẽ có cùng số byte để xác định chúng (đây chỉ là trường hợp Int) tuy nhiên vì bây giờ tôi chỉ có 1 dòng trong hàm nên tôi có thể thả {}và tôi cũng thả một dòng ;(cái còn lại là thay thế bằng một ,)

Vì vậy, nếu có bất kỳ hàm nào yêu cầu xác định Int và sẽ là 1 lớp lót nếu bạn không xác định int trong hàm - thì thực hiện nó như một tham số sẽ tiết kiệm được một vài byte


0

Hàm toinfix

Có một hàm infix tiêu chuẩn được đặt tên totạo Pairs của hai giá trị. Nó thường được sử dụng mapOf()để xác định Maps nhưng nó có khả năng ngắn hơn nhiều so với hàm Pair()tạo.

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

0

Phá hủy trong các đối số lambda

Nói rằng bạn muốn chấp nhận một Pair<*,*>trong lambda. Thông thường, xử lý này sẽ gây phiền nhiễu. Ví dụ: đây là lambda lấy Pairvà kiểm tra xem hai giá trị có bằng nhau không:

{it.first==it.second}

Đây là dài dòng và vụng về. May mắn thay, Kotlin cho phép bạn phá hủy mọi loại có thể phá hủy (bất kỳ loại nào thực hiện componentN()các phương thức, chẳng hạn như Pair, Triplev.v.) làm đối số cho lambda. Vì vậy, chúng ta có thể viết lại điều này theo cách sau:

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

Nó trông tương tự như mô hình khớp với một tuple trong một cái gì đó như F #, và trong nhiều trường hợp. Nhưng một loạt các loại trong Kotlin hỗ trợ phá hủy ( MatchResultlà một loại hữu ích.)

Bạn có thể mất nhiều tranh luận hơn, mặc dù. Nói lambda của bạn đã phải mất một Pairvà một giá trị bổ sung. Bạn chỉ cần viết chữ ký lambda như thế này:

(a,b),c->  // pair first
a,(b,c)->  // pair second
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.