এফ # তে গল্ফ করার টিপস


21

এফ # তে গল্ফ করার জন্য আপনার কাছে কোন সাধারণ টিপস রয়েছে? আমি এমন ধারণাগুলি সন্ধান করছি যা সাধারণভাবে কোড গল্ফ সমস্যার ক্ষেত্রে প্রয়োগ করা যেতে পারে যা এফ # এর সাথে কমপক্ষে কিছুটা নির্দিষ্ট (যেমন "মন্তব্যগুলি সরান" কোনও উত্তর নয়)। দয়া করে উত্তর প্রতি একটি টিপ পোস্ট করুন।

উত্তর:


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

ইনফিক্স অপারেটরগুলির জন্য উপসর্গ নির্দেশকটি ব্যবহার করুন যখন আপনি পারবেন - এটি আপনাকে কোনও ফাংশনটি ব্যবহার করার জন্য সংজ্ঞায়িত করা থেকে রক্ষা করবে।

উদাহরণস্বরূপ, আপনি এটি চালু করতে পারেন:

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

এটিতে:

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

1
আমি এখানে এটি ব্যবহার ধন্যবাদ আপনাকে ধন্যবাদ!
অ্যালোইসডজি বলেছেন মোনিকা

5

টুপল ডিকনস্ট্রাকশন

আপনি যদি ভেরিয়েবলগুলি ব্যবহার করতে না পারেন তবে একাধিক লেট এক্সপ্রেশনগুলির পরিবর্তে টুপল ডিকানস্ট্রাকশন ব্যবহার করুন

let a,b ="",[]

পরিবর্তে

let a=""
let b=[]

স্টিডিন থেকে পড়া

এফ # কোর লাইব্রেরির জন্য উপনাম সংজ্ঞায়িত System.Console.Inনামক stdin। এগুলি আপনাকে ইনপুট পড়ার অনুমতি দেয়।

// Signature:
stdin<'T> :  TextReader

এমএসডিএন-এ টেক্সটরিডার

এটির চেয়ে খাটো Consoleহ'ল এটিকে আরও বড় সুবিধা হ'ল আপনাকেও সিস্টেম খুলতে হবে না

স্ট্রিং ওভার ইটারেটিং

স্ট্রিং মূলত একটি 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
    
  • আপনার যদি ফাঁকা জায়গাগুলির সাথে একটি স্ট্রিং বাম বা ডান প্যাডের প্রয়োজন হয় তবে আপনি এর জন্য [গুলি] প্রিন্টফ [এন] পতাকা ব্যবহার করতে পারেন।

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

    কোর.প্রিন্টফ মডিউল


4

এক্স-> এক্স এর পরিবর্তে আইডি ব্যবহার করুন

আইডি পরিচয় ফাংশনের জন্য দাঁড়িয়ে একটি অপারেটর।

let u x=x|>Seq.countBy (fun x->x)

লেখা যেতে পারে

let u x=x|>Seq.countBy id

সূত্র

আমি এখানে এটি ব্যবহার


3

ফাংশনের জন্য এটা-রূপান্তর

আমার একটি সমাধানে টিপটির জন্য লাইকোনিকে অনেক ধন্যবাদ ।

বড় হাতের অক্ষরের জন্য 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)

>>দুটি ফাংশন ( Seq.filterএবং Seq.sumBy) একসাথে শৃঙ্খলে রাখতে আমরা ফরোয়ার্ড-কমপোজেশন অপারেটর ( ) ব্যবহার করতে পারি । এটা-রূপান্তরের সাথে ফাংশন সংজ্ঞাটি হয়ে উঠবে:

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

ক্রিস স্মিথ >>তার এমএসডিএন ব্লগে অপারেটরটিতে দুর্দান্ত রচনা আপ করেছিলেন ।


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
আপনার চারপাশেও () দরকার নেই: চলুন f = [0,1; 1,4] |> Seq.map fst
চিন্তাভাবনা

1
ধন্যবাদ. আপডেট করা হয়েছে।
অ্যালোইসডজি বলছেন

2

"\ N" এর চেয়ে নতুন লাইনের স্ট্রিং পছন্দ করুন

এটি আপনার কোডের একক নতুন লাইন চরিত্রেরও অর্থ প্রদান শুরু করবে। একটি ব্যবহারের ক্ষেত্রে হতে পারে:

(18 বাইট)

string.Concat"\n"

(17 বাইট)

string.Concat"
"

এসির জন্য চিরুর উত্তর থেকে অনুপ্রাণিত ।

এখানে ব্যবহৃত



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নামকরণটি অবশ্যই সংশোধনকারী হতে হবে) এবং নিয়মিত সিএলআর অ্যারে ব্যবহার করার জন্য বিশেষত যখন এটি বেশ কার্যকর হয় তখন কয়েকটি অক্ষর শেভ করতে দেয় (যেমন, পরিব্যক্তি ) এফ # seqবা এর চেয়ে বেশি list

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.