Dado el reciente anuncio de Google del soporte oficial de Kotlin para el desarrollo de Android, pensé que podría ser oportuno sondear a la comunidad para obtener algunos consejos de golf increíbles para este lenguaje JVM relativamente nuevo.
Kotlin incluye una combinación única de características entre sus hermanos JVM que lo hace potencialmente atractivo para el golf:
- sobrecarga del operador
- funciones de extensión local , infija y estática
- moldes inteligentes
- Constructores de tipo seguro de tipo maravilloso
- tipo de alias
- rangos
- un extenso paquete de colecciones funcionales
- soporte de secuencias de comandos
Entonces, ¿cómo exprimo los últimos bytes de mi programa Kotlin? Un consejo por respuesta, por favor.
Respuestas:
Funciones de extensión
Las funciones de extensión realmente pueden ayudar a reducir los nombres de los métodos integrados, y las cadenas de ellos, un ejemplo podría ser:
fun String.c() = this.split("").groupingBy{it}.eachCount()
pero esto solo ayuda si:
A) La llamada es lo suficientemente larga como para cancelar la definición.
B) La llamada se repite
Uso de lambdas en lugar de métodos.
Lambdas puede regresar sin usar la palabra clave return, guardando bytes
KotlinGolfer
Un proyecto que comencé aquí que toma un bonito código de Kotlin y da publicaciones con pruebas y enlaces TIO automáticamente
fuente
Usar en
+
lugar detoString
Como cabría esperar,
String
sobrecarga al+
operador para la concatenación de cadenas, de esta manera.Sin embargo, revisar los documentos nos dice que acepta
Any?
, no soloString
. Como se dijo:En otras palabras,
String + anything
asegúrese de llamar.toString()
al lado derecho antes de concatenar. Esto nos permite acortarit.toString()
a""+it
, un enorme ahorro de 8 bytes en el mejor y en el peor de 6 bytes.Usar en
fold
lugar dejoinToString
En relación con lo anterior, si está llamando
map
y luegojoinToString
, puede acortar eso usando en sufold
lugar.fuente
A partir de 1.3 puede omitir args en fun main () por completo, lo que reduce 18 caracteres (es decir, la longitud de
args:Array<String>
).fuente
Definiendo Int en params
Es probable que esto tenga algunos casos de uso bastante específicos en los que puede valer la pena, pero en una pregunta reciente que hice al golf descubrí que podía ahorrar algunos bytes definiendo mi variable como parámetros opcionales en lugar de definirlos en la función.
Ejemplo de mi respuesta a esta pregunta:
variable definitoria en la función:
fun String.j()={var b=count{'-'==it}/2;var a=count{'/'==it};listOf(count{'o'==it}-a,a-b,b)}
definiendo variables como params:
fun String.j(b:Int=count{'-'==it}/2,a:Int=count{'/'==it})=listOf(count{'o'==it}-a,a-b,b)
porque
var a=
tiene la misma longitud yaa:Int=
que será el mismo número de bytes para definirlos (este es solo el casoInt
) sin embargo, dado que ahora solo tengo 1 línea en la función, puedo descartar{}
y también descarto una sola;
(la otra es reemplazado con a,
)Entonces, si hay funciones que requieren definir un Int, y sería un trazador de líneas 1 si no definió el int en la función, entonces hacerlo como parámetro ahorrará un par de bytes
fuente
La
to
función infijaHay una función infija estándar llamada
to
que creaPair
s de dos valores. Se usa comúnmentemapOf()
para definirMap
s, pero potencialmente puede ser mucho más corto que elPair()
constructor.fuente
Desestructuración en argumentos lambda
Digamos que quieres aceptar un
Pair<*,*>
en una lambda. Normalmente, manejar esto sería molesto. Como ejemplo, aquí hay una lambda que toma unPair
y comprueba si los dos valores son iguales:Esto es largo y torpe. Afortunadamente, Kotlin le permite desestructurar cualquier tipo destruible (cualquier tipo que implemente
componentN()
métodos, comoPair
,Triple
etc.) como argumentos para una lambda. Entonces, podemos reescribir esto de la siguiente manera:Se parece al patrón que coincide con una tupla en algo así como F #, y lo es en muchos casos. Pero una amplia variedad de tipos en Kotlin admite la desestructuración (
MatchResult
es útil).Sin embargo, puedes tomar más argumentos. Digamos que su lambda tuvo que tomar un
Pair
valor adicional. Simplemente escribirías la firma lambda así:fuente