F#でゴルフをするための一般的なヒントは何ですか?私は、少なくともF#に特有のゴルフ問題全般のコーディングに適用できるアイデアを探しています(たとえば、「コメントの削除」は答えではありません)。回答ごとに1つのヒントを投稿してください。
F#でゴルフをするための一般的なヒントは何ですか?私は、少なくともF#に特有のゴルフ問題全般のコーディングに適用できるアイデアを探しています(たとえば、「コメントの削除」は答えではありません)。回答ごとに1つのヒントを投稿してください。
回答:
変数を使用できない場合は、複数のlet式の代わりにタプル分解を使用します
let a,b ="",[]
の代わりに
let a=""
let b=[]
F#コアライブラリは、System.Console.In
calledのエイリアスを定義しstdin
ます。これらにより、入力を読み取ることができます。
// Signature:
stdin<'T> : TextReader
それがより短いという事実を除いて大きな利点Console
は、システムを開く必要もありません
文字列は基本的にaですchar seq
。これによりSeq.map
、文字列を直接使用できます。理解に使用することも可能です[for c in "" do]
すべての読み取り操作にはセルを間接参照するための追加の文字が付属しているため、参照セルの使用は常に短くなるとは限りません。
完全なmatch .. with
インラインを書くことが可能です
function|'a'->()|'b'->()|_->()
英数字以外の文字の前後に空白を入れる必要はありません。
String.replicate 42" "
if Seq.exists((<>)'@')s then
if(Seq.exists((<>)'@')s)then
文字列にスペースを左または右に埋め込む必要がある場合は、[s] printf [n]フラグを使用できます。
> sprintf "%20s" "Hello, World!";;
val it : string = " Hello, World!"
idは、アイデンティティ関数を表す演算子です。
let u x=x|>Seq.countBy (fun x->x)
書ける
let u x=x|>Seq.countBy id
私のソリューションの 1つでこのヒントをくれたLaikoniに感謝します。
たとえば、大文字の場合は3、その他のすべての文字の場合は1の文字列を合計する関数を考えます。そう:
let counter input = Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1) input
let counter = Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
前と同じ方法で呼び出されます:
counter "Hello world!" |> printfn "%i"
>>
元の課題は、大文字の場合は3、小文字の場合は1の文字列を合計することであり、他のすべての文字は除外されるとします。
これを次のように書くことができます。
let counter input = Seq.filter Char.IsLetter input |> Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
前方構成演算子(>>
)を使用して、2つの関数(Seq.filter
およびSeq.sumBy
)を連結できます。イータ変換を使用すると、関数定義は次のようになります。
let counter = Seq.filter Char.IsLetter >> Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
Chris Smithは、>>
彼のMSDNブログでオペレーターに関するすばらしい記事を書いています。
可能な場合Seq
は以下よりも短いList
:
[[1];[2;3];[4];[5]|>List.collect
[[1];[2;3];[4];[5]|>Seq.collect
1文字短いです...
let f = [(0,1);(1,4)]|>Seq.map(fst)
printfn "%A" f
書ける
let f = [0,1;1,4]|>Seq.map fst
printfn "%A" f
これにより、コード内の1行の改行文字でも成果が得られます。1つのユースケースは次のとおりです。
string.Concat"\n"
string.Concat"
"
インスピレーションを受けES6のためチルーの答え。
ここで使用
.NETには、多くの素晴らしいビルトインがあります。F#はそれらを使用できるので、忘れないでください!
例:
open System.Linq
役立つことがあります!
このmodule
キーワードは、繰り返し使用される場合にモジュール名を短縮するために使用できます。例えば:
Array.fold ...
Seq.iter ...
List.map ...
になることができる
module A=Array
A.fold ...
module S=Seq
S.iter ...
module L=List
L.map ...
これは、モジュールメソッドが繰り返し使用される(およびRequireQualifiedAccess
修飾子があるため毎回完全な名前を付ける必要がある)より長いプログラムでより便利で、特に通常のCLR配列を使用する方が便利な場合(例:可変性) )F#seq
またはlist
。