科特林打高尔夫球的秘诀


22

考虑到Google最近宣布Kotlin正式支持Android开发,我认为现在应该就此相对较新的JVM语言向社区调查一些很棒的高尔夫技巧。

Kotlin在JVM兄弟中包括独特的功能组合,这使其对于打高尔夫球具有潜在的吸引力:

那么,如何从Kotlin程序中挤出最后几个字节?请给每个答案一个提示。


2
高尔夫语言会引起人们的兴趣吗?该语言会缩短Kotlin的一些较长名称,但不会增加很多附加功能(至少在最初是这样)?我正在考虑制作普通的1个字母,使字符串char的计数更短,并添加仅带有1个引号的单字母字符串?
jrtapsell

*通用功能
jrtapsell

似乎科特林打高尔夫球的兴趣不是很高:( data.stackexchange.com/codegolf/query/793250/top-kotlin-golfers
jrtapsell

我计划开始提交更多Kotlin解决方案!我也必须检查您的那个项目。
泰勒·麦克唐纳

Answers:


4

扩展功能

扩展功能确实可以帮助减少内置方法及其链接的名称,例如:

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

但这仅在以下情况下有所帮助:

A)通话时间足够长,无法取消定义

B)重复通话

使用lambda而不是方法

Lambda可以不使用return关键字而返回,从而节省了字节

科特林·戈弗

我从这里开始的一个项目它需要漂亮的Kotlin代码,并自动提供带有测试和TIO链接的帖子


4

使用+代替toString

正如人们可能期望的那样,String重载+运算符以进行字符串连接,就像这样。

print("Hel" + "lo")

但是,检查文档会告诉我们它接受了Any?,而不仅仅是接受String。就像声明的那样:

返回通过将该字符串与给定其他对象的字符串表示形式连接而获得的字符串。

换句话说,请String + anything确保.toString()在连接之前先在右侧调用。这使我们可以缩短it.toString()""+it,最多可节省8个字节,而最坏则可节省6个字节。


使用fold代替joinToString

与上述相关,如果您呼叫map,然后致电,则joinToString可以改用fold来缩短。

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

TIL折是一件好事
Quinn


1

在参数中定义Int

这可能会有一些非常值得使用的特定用例,但是在最近打高尔夫球的问题中,我发现可以通过将变量定义为可选参数而不是在函数中定义它们来节省一些字节。

我对这个问题的回答示例:

在函数中定义变量:

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

将变量定义为参数:

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

因为var a=它的长度与a:Int=定义它们的字节数相同(这仅适用于Int),但是由于我现在在函数中只有1行,因此可以删除,{}并且也删除一个;(另一个是替换为,

因此,如果有任何需要定义Int的函数,并且如果您未在函数中定义int,则将为1线性-那么将其作为参数进行操作将节省几个字节


0

to缀功能

有一个名为infix的标准函数to,可创建Pair两个值的。它通常用于mapOf()定义,Map但可能比Pair()构造函数短很多。

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

0

Lambda参数的解构

假设您要接受Pair<*,*>lambda中的a。通常,处理此问题会很烦人。举例来说,这是一个lambda,接受a Pair并检查两个值是否相等:

{it.first==it.second}

这是漫长而笨拙的。幸运的是,科特林让你解构任何destructable类型(任何类型的实现componentN()方法,如PairTriple等)作为参数传递给拉姆达。因此,我们可以通过以下方式重写它:

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

它看起来类似于在F#之类的模式中匹配元组。但是Kotlin中各种各样的类型都支持解构(MatchResult非常有用。)

不过,您可以接受更多参数。假设您的Lambda必须取Pair和一个附加值。您只需像这样编写lambda签名:

(a,b),c->  // pair first
a,(b,c)->  // pair second
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.