एफ # में गोल्फ के लिए युक्तियाँ


21

F # में गोल्फिंग के लिए आपके पास क्या सामान्य सुझाव हैं? मैं उन विचारों की तलाश कर रहा हूं जो सामान्य रूप से एफ # # के लिए कम से कम कुछ विशिष्ट हैं जो गोल्फ की समस्याओं को लागू कर सकते हैं (उदाहरण के लिए "टिप्पणियां हटाएं" एक उत्तर नहीं है)। कृपया प्रति उत्तर एक टिप पोस्ट करें।

जवाबों:


9

जब संभव हो तो functionइसके बजाय का उपयोग करें match; यह 1-वर्ण चर के लिए 6 वर्णों को बचाएगा:

let f=function // ... (14 chars)

बनाम

let f x=match x with // ... (20 chars)

यह 1 वर्ण को लगातार बचाने के लिए किसी भी पैटर्न मैच की जगह ले सकता है:

match a with|          // ... (13 chars)
a|>function|           // ... (12 chars)
(function| (* ... *))a // (12 chars)

8

चर पर एक विधि का उपयोग करने की आवश्यकता है जिसके लिए आपने अभी तक प्रकार को विवश नहीं किया है? बस इसे उस प्रकार के शाब्दिक के खिलाफ तुलना करें जिसे आप चाहते हैं कि यह उस चर के प्रकार को एनोटेट करने के लिए परिणाम को फेंक दें:

let f (x:string)=x.Length
let f x=x="";x.Length

7

जब आप कर सकते हैं तो infix ऑपरेटरों के लिए उपसर्ग संकेतन का उपयोग करें - यह आपको उनका उपयोग करने के लिए फ़ंक्शन को परिभाषित करने से बचाएगा।

उदाहरण के लिए, आप इसे बदल सकते हैं:

List.map(fun i->i+2)[1;1;2;3;5;8]

इस मामले में:

List.map((+)2)[1;1;2;3;5;8]

1
मैं इसे यहाँ उपयोग करता हूँ धन्यवाद!
aloisdg

5

टप ट घटन

यदि आप चर का उपयोग करने के लिए चारों ओर नहीं पहुंच सकते हैं, तो एकाधिक लेट एक्सप्रेशंस के बजाय टपल डीकंस्ट्रक्शन का उपयोग करें

let a,b ="",[]

के बजाय

let a=""
let b=[]

स्टड से पढ़ना

एफ # कोर लाइब्रेरी System.Console.Inनामक एक उपनाम को परिभाषित करता है stdin। ये आपको इनपुट पढ़ने की अनुमति देते हैं।

// Signature:
stdin<'T> :  TextReader

Msdn पर TextReader

तथ्य यह है कि यह की तुलना Consoleमें कम है एक तरफ बड़ा लाभ , आप या तो सिस्टम को खोलने के लिए नहीं है

स्ट्रिंग पर Iterating

स्ट्रिंग मूल रूप से एक है 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] प्रिंटफ [n] झंडे का उपयोग कर सकते हैं।

    > sprintf "%20s" "Hello, World!";;
    val it : string = "       Hello, World!"
    

    Core.Printf मॉड्यूल



3

कार्यों के लिए एटा-रूपांतरण

मेरे एक समाधान में इस टिप के लिए लकोनी का बहुत धन्यवाद ।

किसी फ़ंक्शन पर विचार करें, कहें, अपर-केस अक्षरों के लिए 3 और अन्य सभी वर्णों के लिए एक स्ट्रिंग लिखें। इसलिए:

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)

हम >>दो कार्यों ( Seq.filterऔर Seq.sumBy) को एक साथ करने के लिए फॉरवर्ड-कंपोजिशन ऑपरेटर ( ) का उपयोग कर सकते हैं। एटा-रूपांतरण के साथ फ़ंक्शन परिभाषा बन जाएगी:

let counter = Seq.filter Char.IsLetter >> Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)

क्रिस स्मिथ ने >>अपने MSDN ब्लॉग पर ऑपरेटर पर एक शानदार लेखन किया ।


2

जब संभव हो इससे Seqछोटा हो List:

[[1];[2;3];[4];[5]|>List.collect
[[1];[2;3];[4];[5]|>Seq.collect

एक चार छोटी है ...


2

एक पैरामीटर और ट्यूपल का उपयोग करते समय कोष्ठक से बचें

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
आपको भी (टुपल्स के आस
thinkbeforecoding

1
धन्यवाद। अपडेट किया गया।
aloisdg का कहना है कि मोनिका

2

"\ N" पर नई लाइन स्ट्रिंग को प्राथमिकता दें

यह आपके कोड में एक भी नई लाइन वर्ण पर भुगतान करना शुरू कर देगा। एक उपयोग मामला हो सकता है:

(18 बाइट्स)

string.Concat"\n"

(17 बाइट्स)

string.Concat"
"

Es6 के लिए चिरु के उत्तर से प्रेरित ।

यहां इस्तेमाल किया गया



1

एक बाइट को बचाने के लिए लैम्ब्डा का उपयोग करें। उदाहरण के लिए, यह:

let f x=x*x

इसे इस रूप में व्यक्त किया जा सकता है:

fun x->x*x


1

moduleकीवर्ड मॉड्यूल नाम जब बार-बार इस्तेमाल कम करने के लिए इस्तेमाल किया जा सकता। उदाहरण के लिए:

Array.fold ...
Seq.iter ...
List.map ...

बन सकता है

module A=Array
A.fold ...
module S=Seq
S.iter ...
module L=List
L.map ...

यह अधिक समय तक चलने वाले कार्यक्रमों के लिए अधिक उपयोगी है जहां मॉड्यूल विधियों का बार-बार उपयोग किया जाता है (और हर बार पूरी तरह से नाम होना चाहिए क्योंकि उनके पास RequireQualifiedAccessसंशोधक है), और विशेष रूप से नियमित रूप से सीएलआर सरणी का उपयोग करने के लिए अधिक उपयोगी होने पर कुछ वर्णों को बंद करने की अनुमति देता है (जैसे, परिवर्तनशीलता ) एक F # seqया से list

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.