ক্লিনে গল্ফ করার টিপস


17

ক্লিনে গল্ফ করার জন্য আপনার কাছে কোন সাধারণ টিপস রয়েছে? দয়া করে কেবল এমন ধারণাগুলি পোস্ট করুন যা সাধারণভাবে গল্ফ সমস্যার কোডে প্রয়োগ করা যেতে পারে এবং সাফের জন্য কমপক্ষে কিছুটা নির্দিষ্ট specific

আপনি যদি কখনও ক্লিনের কথা না শুনে থাকেন তবে আপনি এখানে আরও জানতে পারেন ।
অথবা, আপনি চ্যাট রুমে যোগ দিতে পারেন ।

উত্তর:


10

import StdEnvসম্ভব হলে এড়িয়ে চলুন

অ্যাক্সেস করতে বিল্ট-ইন ফাংশন, এমনকি আপাতদৃষ্টিতে মৌলিক বেশী মত (==)বা map, একটি ইম্পোর্ট বিবৃতিটি প্রয়োজন হয়, সাধারণত import StdEnvকারণ এটি আমদানি সবচেয়ে সাধারণ মডিউল মত StdInt, StdBoolএবং তাই (দেখুন এখানে আরো তথ্যের জন্য StdEnv)।

তবে কিছু চ্যালেঞ্জের জন্য এই আমদানি এড়ানো এবং তালিকার বোধগম্যতা এবং প্যাটার্ন মিলের মতো মূল ভাষার বৈশিষ্ট্যগুলি ব্যবহার করা সম্ভব।

উদাহরণস্বরূপ, পরিবর্তে

import StdEnv 
map f list

একটি লিখতে পারেন

[f x\\x<-list]

বিকল্পের তালিকা:

কিছু ফাংশন বা ফাংশন আমন্ত্রণগুলির প্রয়োজন যা import StdEnvএকটি বিকল্প যা আমদানির প্রয়োজন হয় না এবং বাইট সংরক্ষণের মোটামুটি অনুমান।

  • hd-> (\[h:_]=h), ~ 6 বাইট
  • tl-> (\[_:t]=t), ~ 6 বাইট
  • map f list-> [f x\\x<-list], ~ 10 বাইট
  • filter p list-> [x\\x<-list|p x], 11 বাইট
  • (&&)-> %a b|a=b=a;%, ~ 6 বাইট
  • (||)-> %a b|a=a=b;%, ~ 6 বাইট
  • not-> %a|a=False=True;%, ~ 1 বাইট
  • and-> %[a:r]|a= %r=a;%_=True, ~ 0 বাইট
  • or-> %[a:r]|a=a= %r;%_=False, ~ 0 বাইট

শেষ কয়েকগুলি আসলে বাইটগুলি সংরক্ষণের সম্ভাবনা কম, কারণ প্রত্যক্ষ প্রতিস্থাপন আমদানির চেয়ে বেশি বাইট দেয়, তবে যে কোনও ক্ষেত্রে তালিকার উপরের পুনরাবৃত্তি প্রয়োজন হয় এমন ক্ষেত্রে এটি সম্ভবত সম্ভব হতে পারে।

এই টিপটি এখানে সফলভাবে ব্যবহৃত হয়েছে


নয় import StdEnv+ + a and bচেয়ে ছোট (21 বাইটস) %[a:r]|a= %r=a;%_=True, (22 বাইটস) যদিও? অথবা এটি import StdEnv+ a=True and b=True(31 বাইট) হবে, যা ক্ষেত্রে এটি অবশ্যই সংক্ষিপ্ততর? (আমি কখনই ক্লিন,
বিটিডাব্লু তে

@KevinCruijssen আমরা শুধু আলোচনা হয়েছে চ্যাটে । এটি সত্য যে এগুলি বাইটগুলি সংরক্ষণের সম্ভাবনা নেই, কেবলমাত্র যখন প্রোগ্রামটির কোনও তালিকাতে পুনরাবৃত্তি করা প্রয়োজন হয়।
লাইকনি

4
আহ, ঠিক আছে. বিকল্পের সাহায্যে map f list -> [f x\\x<-list] (11 bytes saved)(বা (অনুরূপ কোনও কিছু)) কতগুলি বাইট সংরক্ষণ করা হয়েছে তা জানাতেও এটি কার্যকর হতে পারে ।
কেভিন ক্রুইজসেন 25'18

@ কেভিন ক্রুজসেন সম্পন্ন হয়েছে
লাইকনি

5

ভাষা শিখতে শিখুন

সর্বোপরি, যে ভাষা তারা ব্যবহার করতে পারে না তাতে যে কেউ গল্ফ করতে পারে!

অনলাইন

পরিষ্কার কোনও সুপরিচিত বা ডকুমেন্টেড ভাষা নয় এবং নাম অবশ্যই এই সমস্যাগুলির প্রতিকারের জন্য প্রয়োজনীয় প্রয়োজনীয় উত্সগুলি খুঁজে পাওয়া সহজ করে না ... বা এটি করে?

ক্লিনকে প্রাথমিকভাবে কনকনেন্ট ক্লিন বলা হত , এটি এখনও ক্লিন সম্পর্কিত প্রায় প্রতিটি নথির উপস্থাপনায় ব্যবহার করা হয় - সুতরাং আপনি যদি ক্লিনের সন্ধান করেন তবে পরিবর্তে সাম্প্রতিক পরিষ্কারের সন্ধান করুন।

ক্লিনের অস্তিত্ব হ্যাস্কেলের সাথে ক্লিনের অন্যতম উল্লেখযোগ্য মিল (যার মধ্যে অনেকগুলি রয়েছে) মধ্যে একটি হ'ল , যা ক্লিন জাহাজের সাহায্যে লাইব্রেরিগুলিকে আবরণ করে এমন একটি ফাংশন অনুসন্ধান ইঞ্জিন।

স্থানীয়ভাবে

যে লাইব্রেরিগুলি দিয়ে ক্লিন জাহাজগুলি রয়েছে সেগুলি শালীন-মন্তব্যযুক্ত আকারে রয়েছে, কিছুটা স্ব-ডকুমেন্টিং ক্লিন সোর্স ফাইল যা আইডিই ব্যবহার করে ব্রাউজ করা যায় able
(এটি সম্পূর্ণ উদাহরণস্বরূপ প্রোগ্রামগুলির সাথে আসে, এর অধীনে $INSTALL/Examples))

যার কথা বলতে গেলে ক্লিনের উইন্ডোজ সংস্করণটি একটি আইডিই নিয়ে আসে - যদিও এটি আধুনিক মানের দ্বারা মোটামুটি সীমাবদ্ধ, এটি কোনও পাঠ্য সম্পাদক এবং কমান্ড-লাইন ব্যবহার করার চেয়ে দুনিয়া ভাল better
দুটি সবচেয়ে দরকারী বৈশিষ্ট্য (শেখার প্রসঙ্গে) হ'ল:

  • কোন লাইনটি চালু আছে তা দেখতে আপনি কোনও ত্রুটিতে ডাবল-ক্লিক করতে পারেন
  • আপনি একটি মডিউল নাম হাইলাইট করতে পারেন এবং [Ctrl]+[D]সংজ্ঞা ফাইলটি (বা [Ctrl]+[I]বাস্তবায়ন ফাইলের জন্য ব্যবহার করতে) খোলার জন্য টিপুন, এবং সংজ্ঞা এবং বাস্তবায়ন ফাইলের মধ্যে টগল সহ[Ctrl]+[/]

4

চরিত্রের এনকোডিং সম্পর্কে ভুলে যান

ক্লিনের সংকলকটি আপনার কী এনকোডিং করে মনে করে আপনি উত্স ফাইলটি কেবল ফাইলটিতে বাইট মানগুলি হিসাবে সংরক্ষণ করেছেন সে সম্পর্কে কোন চিন্তা করে না। এর কিছু ঝরঝরে ফলাফল রয়েছে।

সোর্স কোড দেহের মাত্র কোড-পয়েন্ট মুদ্রণযোগ্য ASCII অক্ষর সংশ্লিষ্ট জন্য ঐ ছাড়াও, অনুমতি দেওয়া হয় সঙ্গে বাইট \t\r\n

লিটারেল:

ইন Stringএবং [Char]লিটারেল ( "stuff"এবং ['stuff']যথাক্রমে), 0 ব্যতীত কোন বাইট সতর্কীকরণ যে সঙ্গে, অনুমতি দেওয়া হয় "এবং 'পলান করা আবশ্যক (জন্য Stringএবং [Char]যথাক্রমে), এবং যে নতুন লাইন এবং carraige আয় আবশ্যক প্রতিস্থাপিত হতে \nএবং\r (এছাড়াও যথাক্রমে)।

ইন Charলিটারেল, 0 ব্যতীত কোন বাইট অনুমতি দেওয়া হয়, যার মানে হল:

'\n'

'
'

একই, তবে দ্বিতীয়টি একটি বাইট সংক্ষিপ্ত।

পলায়নপরকিন্তু:

স্ট্যান্ডার্ড লেটার বাদে পালিয়ে যায় \t\r\n (ইত্যাদি) ব্যতীত, সমস্ত অ-সংখ্যাগত পালানোর ক্রমগুলি হয় স্ল্যাশের জন্য, বা আক্ষরিক সীমানা ব্যবহারের জন্য উদ্ধৃতিটি ভিতরে রয়েছে।

সংখ্যাগত পালানোর ক্রমগুলির জন্য, সংখ্যাটি তিন অঙ্কের পরে অবসন্ন হওয়া অষ্টাল মান হিসাবে গণ্য করা হয়। এর অর্থ হ'ল আপনি যদি ক 1এর একটি অক্ষর অনুসরণ করতে চান তবে আপনাকে Stringব্যবহার করতে হবে "\0001"(বা "\0\61") এবং না "\01" । যাইহোক, যদি আপনি কিছু দিয়ে পালাবার অনুসরণ কিন্তু সংখ্যা, আপনি নেতৃস্থানীয় শূণ্যসমূহ বর্জন করতে পারেন।

ফল:

ক্লিন কীভাবে তার উত্স ফাইলগুলি পরিচালনা করে Stringএবং ['Char']কার্যকরভাবে বেস-256 একক-অঙ্কের সংখ্যার সিকোয়েন্সগুলিতে পরিণত হয় - যা কোড-গল্ফের জন্য যেমন প্রচুর ব্যবহার রয়েছে যেমন সূচীগুলি সংরক্ষণ করা (অবশ্যই 255 অবধি) with


3

প্রতীক সহ নাম ফাংশন

কোনও ফাংশনটি সংজ্ঞায়িত করার !@$%^&*~-+=<:|>.?/\সময়, বর্ণানুক্রমিক বর্ণগুলি ব্যবহার করার চেয়ে কিছু সংমিশ্রণ ব্যবহার করা প্রায়শই সংক্ষিপ্ত হয় কারণ এটি আপনাকে শনাক্তকারীদের মধ্যে সাদা-স্থান বাদ দিতে দেয়।

উদাহরণস্বরূপ: এর ?a=a^2চেয়ে খাটো f a=a^2, এবং এটিও সংক্ষিপ্ততর হয়।

তবে :

যদি ফাংশন শনাক্তকারীটিকে অন্য চিহ্নগুলির সাথে সংলগ্ন ব্যবহার করা হয় , যা পৃথক, তবে বৈধ শনাক্তকারী গঠন করতে পারে তবে সেগুলি সমস্তই একটি সনাক্তকারী হিসাবে বিভক্ত হবে এবং আপনি একটি ত্রুটি দেখতে পাবেন।

উদাহরণস্বরূপ: ?a+?bas as pars? a +? b

উপরন্তু:

ক্লিন এ আমদানি করা শনাক্তকারীদের ওভাররাইট করা সম্ভব এবং তাই কেবলমাত্র একক অক্ষর প্রতীক সনাক্তকারী যা ইতিমধ্যে ব্যবহৃত StdEnvহয় নি @$?^-+ওভার রাইটিং (ইত্যাদি) দরকারী হতে পারে যদি আপনার আরও প্রতীকী শনাক্তকারীর প্রয়োজন হয় তবে সাবধান থাকুন যে আপনি যেটি ব্যবহার করছেন সেটিকে ওভাররাইট না করে।


3

আপনার কে নোডগুলি জানুন

কার্যকরী ভাষাগুলিতে কয়েকটি শক্তিশালী নির্মাণ (গল্ফিংয়ের জন্য) let ... in ...
অবশ্যই পরিষ্কার, এটি আছে এবং আরও ভাল কিছু - দ্য #

নোড কী?

ক্লিন #এবং সর্বব্যাপী |(প্যাটার্ন গার্ড) উভয়ই 'নোড এক্সপ্রেশন' হিসাবে পরিচিত।
উল্লেখযোগ্যভাবে, তারা আপনাকে ক্লিনে জরুরীভাবে প্রোগ্রাম করার অনুমতি দেয় (যা এখানে সত্যিই ভাল!)।

#(দিন-পূর্বে):

এগুলি উভয়ই একটি স্ট্রিং হিসাবে প্রদত্ত পূর্ণসংখ্যার মান গণনা করে, এর অক্ষরের যোগফলকে গুণ করে

f s=let i=toInt s;n=sum[toInt c\\c<-:s]in n*i

f s#i=toInt s
#s=sum[toInt c\\c<-:s]
=s*i

সহ সংস্করণটি কীভাবে #সংক্ষিপ্ত হবে এবং কীভাবে আমরা নতুন সংজ্ঞা দিতে পারি তা নোট করুন s। এটি কার্যকর হয় যদি আমাদের যখন ভেরিয়েবলের মান পাওয়ার প্রয়োজন না হয় তবে আমরা কেবল নামটি পুনরায় ব্যবহার করতে পারি। ( letআপনি যখন এটি করতে পারেন তখন সমস্যাগুলির মধ্যে দৌড়াতে পারেন)

letযখন আপনার মতো কিছু প্রয়োজন তখন ব্যবহার করা সহজflip f = let g x y = f y x in g

|(প্যাটার্ন পাহারা):

ক্লিনের প্যাটার্ন গার্ডটি অন্যান্য অন্যান্য কার্যকরী ভাষার মতো ব্যবহার করা যেতে পারে - তবে এটি অত্যাবশ্যকীয়র মতোও ব্যবহার করা যেতে পারে if ... else ...। এবং ত্রৈমাসিক প্রকাশের একটি সংক্ষিপ্ত সংস্করণ।

উদাহরণস্বরূপ, এই সমস্তগুলি একটি পূর্ণসংখ্যার চিহ্নটি ফেরত দেয়:

s n|n<>0|n>0=1= -1
=0

s n=if(n<>0)if(n>0)1(-1)0

s n|n>0=1|n<0= -1=0

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

একটি নোট:

আপনি এই অভিব্যক্তিটি মূলত যে কোনও জায়গায় ব্যবহার করতে পারেন। Lambdas সালে case ... of, let ... inইত্যাদি


1

আপনি যদি ব্যবহার করছেন তবে আপনার ব্যবহার করা StringউচিতText

স্ট্রিং রূপান্তর, এবং স্ট্রিং ম্যানিপুলেশন ( {#Char}/ Stringধরনের, না [Char]ধরনের) বেশ লম্বা এবং golfing জন্য খারাপ। Textমডিউল প্রতিকার করেছেন।

পরিবর্তন:

Textসংজ্ঞাযুক্ত যে <+কোনও দুটি ধরণের জন্য অপারেটরকে toStringসংজ্ঞায়িত করে।
এই অপারেটরটি, a<+bএকই হিসাবে ব্যবহৃত toString a+++toString b- কমপক্ষে 19 বাইট সংরক্ষণ করে । এমনকি যদি আপনি অতিরিক্ত আমদানি অন্তর্ভুক্ত করেন ,Textএবং একবারে এটি ব্যবহার করেন তবে এটি 14 বাইট সংরক্ষণ করে!

ম্যানিপুলেশন:

Textএর থেকে অনুপস্থিত কয়েকটি স্ট্রিং-ম্যানিপুলেশন স্ট্যাপলগুলি সংজ্ঞায়িত করে StdEnv:

  • +স্ট্রিংগুলির জন্য অপারেটর , যা +++(থেকে StdEnv) এর চেয়ে অনেক কম
  • indexOf, ব্যর্থতার -1পরিবর্তে ফিরে আসার সি-জাতীয় আচরণের সাথেNothing
  • concat, যা স্ট্রিংগুলির তালিকার সাথে মিলিত করে
  • joinযা বিভাজক স্ট্রিং ব্যবহার করে স্ট্রিংয়ের তালিকায় যোগ দেয়
  • splitযা স্ট্রিংয়ের স্ট্রিংয়ের তালিকায় স্ট্রিংকে বিভক্ত করে

1

খাটো ল্যাম্বডাস ব্যবহার করুন

কখনও কখনও আপনি নিজেকে ল্যাম্বডা এক্সপ্রেশন ব্যবহার করতে (দেখতে map, বা sortBy, ইত্যাদি) ব্যবহার করতে পারেন। আপনি যখন এটি করছেন (ল্যাম্বডাস লিখছেন), আপনি এটি করতে পারেন এমন অনেকগুলি উপায় রয়েছে।

সঠিক উপায়:

এটি হল sortByএকটি আইডোম্যাটিক ল্যাম্বদা লম্বা থেকে সংক্ষিপ্ততম তালিকা অনুসারে বাছাইয়ের তালিকা সহ

sortBy (\a b = length a > length b)

অন্য সঠিক উপায়:

আপনি যদি ব্যবহার করছেন তবে আপনি এটি Data.Funcকরতেও পারেন

sortBy (on (>) length)

সংক্ষিপ্ত উপায়:

এটি একই জিনিস, তবে একটি গল্ফিয়ার সিনট্যাক্স সহ

sortBy(\a b=length a>length b)

অন্যান্য উপায়:

রচনাটি ব্যবহার করা এই সময়টি ছোট নয়, তবে এটি কখনও কখনও সংক্ষিপ্ত হতে পারে

sortBy(\a=(>)(length a)o length)

অন্যান্য উপায়:

যদিও এটি এখানে কিছুটা স্বীকৃত, আপনি ল্যাম্বডাসে প্রহরী ব্যবহার করতে পারেন

sortBy(\a b|length a>length b=True=False)

এবং আগে নোড এক্সপ্রেশনও

sortBy(\a b#l=length
=l a>l b)

একটি নোট:

ল্যাম্বদার আরও দুটি রূপ রয়েছে, (\a b . ...)এবং এর পরিণামটি একইরূপের (\a b -> ...)সাথে সমান, এবং এর পূর্বেরটি =কোনও কারণে উপস্থিত রয়েছে এবং প্রায়শই মনে হয় আপনি ল্যাম্বডাকে সংজ্ঞায়িত করার পরিবর্তে কোনও জিনিসে অ্যাক্সেস করার চেষ্টা করছেন তাই ডন এটি ব্যবহার করবেন না।


1
আপনার golfed প্রোগ্রামের কিছু এইজন্য পর, আমি ছাপ ছিল না \a=... ছিল পি: ক্লিন এর স্বাভাবিক ল্যামডা সিনট্যাক্স
Orjan Johansen

আপনি যেমন ল্যাম্বডায় রক্ষীদের যোগ করতে পারেন, এখানে ব্যবহৃত । এটি বিনা প্রতিবেদিত (এটি এমনকি ভাষা প্রতিবেদনের বিরোধিতা করে), তবে কাজ করে। এছাড়াও, ->এবং =ল্যাম্বডাসের জন্য সংকলকটি যতটা উদাসীন ( ->যেমন পুরানো বাক্য গঠন) ident কেবল .ভিন্ন (তবে ঠিক কীভাবে তা আমি জানি না)।

এবং এই বিশেষ উদাহরণে আপনি ব্যবহারটি বিবেচনা করতে পারেন on(<)length, যদিও Data.Funcইতিমধ্যে প্রয়োজন না হলে আমদানি আপনাকে ভেঙে ফেলবে break

@ কিলান কুল আমি আজ এটি পরে আপডেট করব। আমি মনে করি আপনি #ল্যাম্বডাসে লেট- ফোর ( ) ব্যবহার করতে পারেন ।
26urous

হ্যাঁ, আপনি :-)

0

অক্ষর তালিকা লিটারাল ব্যবহার করুন

একটি অক্ষর তালিকা আক্ষরিক ['h','e','l','l','o']হিসাবে কিছু লেখার একটি শর্টহ্যান্ড উপায় ['hello']

এটি স্বরলিপিটির সীমা নয়, উদাহরণস্বরূপ:

  • repeat'c'হয়ে ['c','c'..]যায়['cc'..]
  • ['z','y'..'a'] হয়ে ['zy'..'a']
  • ['beginning']++[a,b,c]++['end'] হয়ে ['beginning',a,b,c,'end']
  • ['prefix']++suffix হয়ে ['prefix':suffix]

এইগুলি মিলে যাওয়ার ক্ষেত্রেও:

  • ['I don't care about the next character',_,'but I do care about these ones!']

0

কখনও কখনও code সংক্ষিপ্ত হয়

ক্লিনের স্ট্যান্ডার্ড লাইব্রেরিগুলিতে প্রচুর দরকারী কার্যকারিতা রয়েছে যার মধ্যে কয়েকটি অ্যাক্সেস ছাড়াই ব্যবহার করার জন্য অবিশ্বাস্যভাবে ভার্বোজ *Worldএবং ব্যবহার করে*World এবং কোড-গল্ফ করা যাইহোক সাধারণত একটি খারাপ ধারণা।

এই সমস্যাটি পেতে, ccallআপনি প্রায়শই ভিতরে ব্যবহার করতে পারেনcode পরিবর্তে ব্লকগুলির মধ্যে ।

কিছু উদাহরণ:

সিস্টেম সময়

import System.Time,System._Unsafe
t=toInt(accUnsafe(time))

উপরেরটি 58 ​​বাইট, তবে আপনি 17 বাইট (40 + 1 এর নিচে) এর সাথে সংরক্ষণ করতে পারেন:

t::!Int->Int
t _=code{ccall time "I:I"
}

র্যান্ডম নাম্বার

এইটি তার নিজের দ্বারা বাইটগুলি সংরক্ষণ করে না, তবে এটিকে একটি তালিকা কাছাকাছি যেতে হবে না genRandInt

s::!Int->Int
s _=code{ccall time "I:I"ccall srand "I:I"
}
r::!Int->Int
r _=code{ccall rand "I:I"
}

অন্যান্য ব্যবহার

এই দুটি ছাড়াও, যা সম্ভবত কোড-গল্ফের জন্য এটির প্রধান ব্যবহার, আপনি যে কোনও নামকৃত ফাংশন (প্রতিটি সিস্কেল সহ তবে সীমাবদ্ধ নয়), instruction <byte>এবিসি মেশিনের জন্য স্বেচ্ছাসেবক সমাবেশ এবং এম্বেড কোড কল করতে পারেন ।

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