স্কালায় গল্ফ করার টিপস


24

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

(এটি পাইথনের একটি নির্লজ্জ অনুলিপি)

উত্তর:


5

অস্বীকৃতি: এই উত্তরের অংশগুলি এখানে পাওয়া অন্যান্য উত্তরের সাধারণীকরণ।

ল্যাম্বডাস তাদের যুক্তির ধরণগুলি নির্দিষ্ট না করে ব্যবহার করুন

এটি এর মতো কিছু জমা দেওয়ার অনুমতি দেওয়া হয়েছে: a=>a.sizeপরিবর্তে (a:String)=>a.size

সনাক্তকারী হিসাবে ascii- চিহ্ন ব্যবহার করুন।

এর মধ্যে রয়েছে !%&/?+*~'-^<>|। যেহেতু তারা অক্ষর নয়, তারা যখন অক্ষরগুলির পাশে থাকে তখন তারা পৃথক পৃথক করে।

উদাহরণ:

a=>b       //ok
%=>%        //error, parsed as one token
% => %      //ok
val% =3     //ok
&contains+  //ok
if(x)&else* //ok

এর পরিবর্তে সেট ব্যবহার করুন

if (Seq(1,2,3,'A')contains x)... //wrong
if (Set(1,2,3,'A')(x))...         //right

এটা সম্ভব কারণ Set[A] extends (A => Boolean)

আপনার যখন দুটি যুক্তি প্রয়োজন তখন একটি ত্রিযুক্ত ফাংশন ব্যবহার করুন।

(a,b)=>... //wrong
a=>b=>...  //right

_সম্ভব হলে-সিনট্যাক্সটি ব্যবহার করুন

এর নিয়মগুলি কিছুটা অস্পষ্ট, সংক্ষিপ্ততম পথটি খুঁজে পেতে আপনাকে মাঝে মাঝে কিছুটা খেলতে হবে।

a=>a.map(b=>b.size)) //wrong
a=>a.map(_.size)     //better
_.map(_.size)        //right

আংশিক প্রয়োগ ব্যবহার করুন

a=>a+1 //wrong
_+1    //better, see above
1+     //right; this treats the method + of 1 as a function

""+পরিবর্তে ব্যবহার করুনtoString

a=>a.toString //wrong
a=>a+""       //right

ক্রম হিসাবে স্ট্রিং ব্যবহার করুন

"" যদি আপনি অ্যাক্টুলার ধরণের বিষয়ে চিন্তা না করেন তবে খালি সিকোয়েন্স তৈরির সংক্ষিপ্ততম উপায়

সংখ্যাগুলিকে স্ট্রিংয়ে এবং থেকে রূপান্তর করতে BigInt ব্যবহার করুন

বেস 10 ব্যতীত অন্য কোনও বেসকে একটি স্ট্রিংয়ে সংখ্যার রূপান্তর করার সবচেয়ে সংক্ষিপ্ততম উপায়টি বিগআইন্টের toString(base: Int)পদ্ধতির মাধ্যমে

Integer.toString(n,b) //wrong
BigInt(n)toString b   //right

আপনি যদি একটি স্ট্রিংকে কোনও সংখ্যায় রূপান্তর করতে চান তবে ব্যবহার করুন BigInt.apply(s: String, base: Int)

Integer.parseInt(n,b) //wrong
BigInt(n,b)           //right

সচেতন থাকুন যে এটি একটি বিগআইএন্ট দেয়, যা বেশিরভাগ বারের মতো ব্যবহারযোগ্য, তবে উদাহরণ হিসাবে উদাহরণ হিসাবে কোনও সূচক হিসাবে ব্যবহার করা যায় না can't

সিকোয়েন্স তৈরি করতে সিক ব্যবহার করুন

a::b::Nil   //wrong
List(...)   //also wrong
Vector(...) //even more wrong
Seq(...)    //right
Array(...)  //also wrong, except if you need a mutable sequence

চরগুলির সিকোয়েন্সগুলির জন্য স্ট্রিংগুলি ব্যবহার করুন:

Seq('a','z') //wrong
"az"         //right

অসীম অনুক্রমের জন্য স্ট্রিম ব্যবহার করুন

কিছু চ্যালেঞ্জ একটি অসীম অনুক্রমের n-th উপাদানটির জন্য জিজ্ঞাসা করে। স্ট্রিম এটির জন্য নিখুঁত প্রার্থী। মনে রাখবেন যে Stream[A] extends (Int => A), অর্থাত্ একটি স্ট্রিমটি সূচক থেকে সেই সূচকের উপাদানটিতে ফাংশন।

Stream.iterate(start)(x=>calculateNextElement(x))

প্রতীকী অপারেটরগুলি তাদের শব্দযুক্ত অংশগুলির পরিবর্তে ব্যবহার করুন

:\এবং :/পরিবর্তে foldRightএবংfoldLeft

a.foldLeft(z)(f) //wrong
(z/:a)(f)        //right
a.foldRight(z)(f) //wrong
(a:\z)(f)         //right

hashCode -> ##

throw new Error() -> ???

ব্যবহার করুন &এবং |পরিবর্তে&& এবং||

তারা বুলিয়ানদের জন্য একই কাজ করে তবে সর্বদা উভয় অপারেশনকে মূল্যায়ন করবে

ফাংশন হিসাবে আলিয়া দীর্ঘ পদ্ধতি

def r(x:Double)=math.sqrt(x) //wrong
var r=math.sqrt _            //right; r is of type (Double=>Double)

স্ট্যান্ডার্ড লাইব্রেরিতে ফাংশনগুলি জানুন

এটি সংগ্রহের পদ্ধতিগুলিতে বিশেষত প্রযোজ্য।

খুব দরকারী পদ্ধতি হ'ল:

map
flatMap
filter
:/ and :\ (folds)
scanLeft and scanRight
sliding
grouped (only for iterators)
inits
headOption
drop and take
collect
find
zip
zipWithIndex3
distinct and/or toSet
startsWith

11

কোনও কিছুর পুনরাবৃত্তি করার সংক্ষিপ্ততম উপায়টি এর সাথে Seq.fill

1 to 10 map(_=>println("hi!")) // Wrong!
for(i<-1 to 10)println("hi!") // Wrong!
Seq.fill(10)(println("hi!")) // Right!

10

সন্দেহজনক সনাক্তকারী:?

তুমি ব্যবহার করতে পার ? সনাক্তকারী হিসাবে:

val l=List(1,2,3)
val? =List(1,2,3)

এখানে এটি কোনও কিছুই রক্ষা করে না, কারণ আপনি এটি সমান চিহ্নটিতে আটকে রাখতে পারবেন না:

val ?=List(1,2,3) // illegal

তবে পরে, এটি প্রায়শই একটি চরিত্র সংরক্ষণ করে, যেহেতু আপনার কোনও ডিলিমিটারের প্রয়োজন নেই:

print(?size)  // l.size needs a dot
def a(? :Int*)=(?,?tail).zipped.map(_-_)

তবে এটি ব্যবহার করা প্রায়শই কৌশলযুক্ত:

       print(?size)
3
       print(?size-5)
<console>:12: error: Int does not take parameters
       print(?size-5)
              ^

9

সংগ্রহগুলি

এলোমেলো সংগ্রহের জন্য প্রথম পছন্দটি প্রায়শই তালিকা । অনেক ক্ষেত্রে আপনি এটি সিকের সাথে প্রতিস্থাপন করতে পারেন যা একটি অক্ষর তাত্ক্ষণিক সংরক্ষণ করে। :)

পরিবর্তে

val l=List(1,2,3)
val s=Seq(1,2,3)

এবং, যখন s.head এবং s.tail স্বাভাবিক কোডে আরও মার্জিত, s(0)আবার একটি চরিত্রের চেয়ে ছোট s.head

এমনকি কিছু ক্ষেত্রে সংক্ষিপ্ত - প্রয়োজনীয় কার্যকারিতার উপর নির্ভর করে একটি টিপল:

val s=Seq(1,2,3)
val t=(1,2,3)

অবিলম্বে 3 টি অক্ষর সংরক্ষণ করা এবং অ্যাক্সেসের জন্য:

s(0)
t._1

এটি সরাসরি সূচক অ্যাক্সেসের জন্য একই। তবে বিশদযুক্ত ধারণার জন্য, টিপলগুলি ব্যর্থ হয়:

scala> s.map(_*2)
res55: Seq[Int] = List(2, 4, 6)

scala> t.map(_*2)
<console>:9: error: value map is not a member of (Int, Int, Int)
       t.map(_*2)
         ^

হালনাগাদ

def foo(s:Seq[Int])
def foo(s:Int*)

প্যারামিটার ঘোষণায়, ইনট * সিক [ইনট] এর উপরে 4 টি অক্ষর সংরক্ষণ করে। এটি সমতুল্য নয়, তবে কখনও কখনও, ইনট * করবে।


8

আপনি সাধারণত এর mapপরিবর্তে ব্যবহার করতে পারেন foreach:

List("a","b","c") foreach println

সঙ্গে প্রতিস্থাপন করা যেতে পারে

List("a","b","c") map println

পার্থক্যটি হ'ল রিটার্ন টাইপ ( Unitবনাম List[Unit]), যা আপনি ব্যবহার করার পরে যাইহোক আগ্রহী নন foreach


7

সংক্ষিপ্ত প্রকারের সংজ্ঞা দিন:

আপনার কাছে যদি কোনও ধরণের একাধিক ঘোষণা থাকে তবে

def f(a:String,b:String,c:String) 

কোনও প্রকারের উপন্যাস সংজ্ঞায়িত করা এবং এর পরিবর্তে এটি ব্যবহার করা সংক্ষিপ্ত:

type S=String;def f(a:S,b:S,c:S)

আসল দৈর্ঘ্য 3 * 6 = 18 প্রতিস্থাপন-কোড 8 (টাইপ এস =;) + 6 + 3 * 1 (= নতুন দৈর্ঘ্য) = 17

যদি (এন * দৈর্ঘ্য <8 + দৈর্ঘ্য + এন) হয় তবে এটি একটি সুবিধা।

কারখানার মাধ্যমে ইনস্ট্যান্ট করা ক্লাসগুলির জন্য, আমরা সেই অবজেক্টের দিকে নির্দেশ করতে একটি সংক্ষিপ্ত পরিবর্তনশীল নাম সেট করতে পারি। পরিবর্তে:

val a=Array(Array(1,2),Array(3,4))

আমরা লিখতে পারি

val A=Array;val a=A(A(1,2),A(3,4))

এটি #defineউদাহরণস্বরূপ সি ++ এর ক্ষেত্রেও প্রযোজ্য তবে আমি স্বীকার করি এটি খুব সুন্দর defএবং valখাটো are
ম্যাথু

হুঁ। defকোনও পদ্ধতির সংজ্ঞা দেওয়ার কীওয়ার্ড এবং সি ++ এর জন্য একটি সহজ অনুবাদ valহ'ল 'কনস্ট', এবং এটি একটি ঘোষণা, তবে টাইপটি প্রায়শই অনুমান করা হয়। সংক্ষিপ্তকরণটি প্রথম ক্ষেত্রে type=যা নিকটে রয়েছে typedef- তাই না? দ্বিতীয় উদাহরণটি আমার পক্ষ থেকে নয় এবং এটি আমার কাছে নতুন। আমাকে দেখতে হবে, কোথায় এটি ব্যবহার করতে হবে।
ব্যবহারকারীর অজানা

typedef long long ll;একই হিসাবে #define ll long long, সুতরাং 1 এর পরে ছোট। কিন্তু হ্যাঁ, typedefকাজ করে। valউদাহরণটির দিকে আবার তাকালে আমি অবশ্যই এটি ভুলভাবে লিখেছি। এটি আরও কম স্কেল-নির্দিষ্ট বলে মনে হচ্ছে। x = thingWithAReallyLongComplicatedNameForNoReasonএকটি চমত্কার সাধারণ কৌশল: পি
ম্যাথু

@ ব্যবহারকারীর অজানা যখন আপনি সিনট্যাক্সের সাহায্যে কোনও Listবা অন্যকে ইনস্ট্যান্ট করবেন আপনি কেবলমাত্র বস্তুটিতে পদ্ধতিটি কল করছেন । (অবজেক্ট তৈরির জন্য এই কৌশলটি একটি "ফ্যাক্টরি পদ্ধতি" হিসাবে পরিচিত, এটির সাথে কনস্ট্রাক্টর ব্যবহারের বিপরীতে )) সুতরাং উপরে, আমরা কেবলমাত্র একটি নতুন ভেরিয়েবল তৈরি করছি যা ভেরিয়েবলের নামের মতো একই সিঙ্গলটন অবজেক্টকে নির্দেশ করে । যেহেতু এটি একই জিনিস, তাই সহ সমস্ত পদ্ধতি উপলব্ধ। Arrayval x = List(1,2,3)applyListnewArrayapply
লুইজি প্লিঞ্জ

7

.অক্ষরের প্রয়োজনীয়তা অপসারণ করতে ইনফিক্স সিনট্যাক্স ব্যবহার করুন । সংলগ্ন আইটেমগুলি উভয় বর্ণানুক্রমিক বা অপারেটর অক্ষর উভয় ( এখানে দেখুন ) এবং সংরক্ষিত অক্ষর (বন্ধনী, কমা ইত্যাদি) দ্বারা পৃথক না করা না হলে আপনার স্পেসের প্রয়োজন নেই ।

যেমন

List(1,2,3,4).filter(_ % 2 == 0) // change to:
List(1,2,3,4)filter(_%2==0)

7

trueএবং falseলিটারেল যেমন লিখতে খাটো 2>1সত্য এবং 1>2মিথ্যা জন্য


7

আরম্ভের জন্য একই ফাংশনটিতে দু'বার কল করুন:

val n,k=readInt

(অন্য কোথাও দেখেছেন তবে এখন এটি খুঁজে পাচ্ছেন না)।


6

পদ্ধতিগুলি পুনরায় নামকরণ করুন, যদি তাদের নামটি দীর্ঘ হয় এবং যদি সেগুলি একাধিকবার ব্যবহৃত হয় - আসল বিশ্বের উদাহরণ:

 x.replaceAll(y,z)

 type S=String; def r(x:S,y:S,z:S)=x.replaceAll(y,z)

বিভিন্ন স্থানেও 'এস = স্ট্রিং' সংরক্ষণ করার সম্ভাবনার উপর নির্ভর করে, আপনি যদি কমপক্ষে 3 বার প্রতিস্থাপন করেন তবে এটি কেবল অর্থনৈতিক হবে।


3

টিপল ব্যবহার করে একবারে বেশ কয়েকটি ভেরিয়েবল শুরু করুন:

var(a,b,c)=("One","Two","Three") //32 characters

বনাম

var a="One";var b="Two";var c="Three" //37 characters

0

আপনি ফাংশন সংজ্ঞা ব্যবহারের পরিবর্তে ব্যবহার করতে পারেন =>


1
হ্যালো এবং পিপিসিজিতে আপনাকে স্বাগতম। বেশিরভাগ সময় থেকে, উত্তরগুলি অক্ষরের পরিবর্তে বাইটে গণনা করা হয়, আপনার টিপটির কেবল সীমিত সুযোগ রয়েছে। আমি এটিকে সম্বোধন করব এবং অক্ষর গণনা ভিত্তিক কোড গল্ফ চ্যালেঞ্জগুলিতে সংক্ষিপ্তকরণ ফাংশন সংজ্ঞাগুলির মতো একটি টিপ শিরোনাম যুক্ত করব ।
জোনাথন ফ্রেচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.