コトリンでのゴルフのヒント


22

Google がAndroid開発のKotlinの公式サポートを最近発表したことを考えると、この比較的新しいJVM言語の素晴らしいゴルフのヒントについてコミュニティに投票するのがタイムリーかもしれないと思いました。

Kotlinには、JVM兄弟の機能のユニークな組み合わせが含まれており、ゴルフに魅力的な可能性があります。

それでは、Kotlinプログラムから最後の数バイトを圧縮するにはどうすればよいですか?回答ごとに1つのヒントをお願いします。


2
Kotlinの長い名前の一部を短縮するが、多くのエキストラを(少なくとも最初は)追加しないゴルフ言語に興味がありますか?私は、一般的な1文字を作成し、文字列の文字数を短くし、引用符が1つだけの単一文字の文字列を追加することを考えていますか?
jrtapsell

*共通機能
jrtapsell

Kotlinのゴルフへの関心はそれほど高くないようです:( data.stackexchange.com/codegolf/query/793250/top-kotlin-golfers
jrtapsell

Kotlinソリューションの提出を開始する予定です!あなたのプロジェクトもチェックアウトする必要があります。
タイラーマクドネル

回答:


4

拡張機能

拡張関数は、組み込みメソッドの名前とそれらのチェーンを減らすのに本当に役立ちます。例は次のとおりです。

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

ただし、これは次の場合にのみ役立ちます。

A)呼び出しは、定義をキャンセルするのに十分な長さです

B)呼び出しが繰り返されます

メソッドではなくラムダの使用

ラムダは、returnキーワードを使用せずに戻り、バイトを節約できます

コトリンゴルファ

私がここで始めたプロジェクトは、かなりKotlinコードを取り、テストとTIOリンクを自動的に投稿します


4

+代わりに使用toString

予想されるように、文字列連結のためString+演算子をオーバーロードします。

print("Hel" + "lo")

ただし、ドキュメントをチェックするとAny?だけではなく、受け入れることを示していますString。述べたように:

この文字列を、指定された他のオブジェクトの文字列表現と連結して得られた文字列を返します。

つまり、連結する前にString + anything必ず.toString()右側を呼び出してください。これは、私たちは短縮することを可能にするit.toString()には""+it最高と最悪の6バイトで、大規模な8つのバイトの節約を。


fold代わりに使用joinToString

上記に関連して、を呼び出しmapている場合はjoinToStringfold代わりにを使用して短縮できます。

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

TILフォールドは素晴らしいことです
クイン


1

paramsで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中置機能

2つの値のs toを作成するという名前の標準の挿入関数がありPairます。一般的にsのmapOf()定義に使用されますMapが、Pair()コンストラクタよりも大幅に短くなる可能性があります。

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

0

ラムダ引数の構造化

Pair<*,*>ラムダでa を受け入れたいとします。通常、これを処理するのは面倒です。例として、aを取りPair、2つの値が等しいかどうかを確認するラムダを次に示します。

{it.first==it.second}

これは時間がかかり、不器用です。幸いなことに、Kotlinを使用すると、ラムダへの引数componentN()としてPair、任意の破壊可能な型(などのメソッドを実装する型Triple)を非構造化できます。したがって、次の方法でこれを書き換えることができます。

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

これは、F#のようなタプルをパターンマッチングするのに似ており、多くの場合です。しかし、KotlinのさまざまなタイプMatchResultは、構造化をサポートしています(便利です)。

ただし、より多くの引数を取ることができます。ラムダがPair追加の値をとる必要があったとしましょう。次のようにラムダ署名を書くだけです。

(a,b),c->  // pair first
a,(b,c)->  // pair second
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.