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


17

আর্থার হুইটনি ডিজাইন করেছেন এপিএল পরিবারে কে একটি প্রোগ্রামিং ভাষা। অফিসিয়াল দোভাষীটি ক্লোস-সোর্স এবং বাণিজ্যিক হওয়ার সময়, কেএক্স সিস্টেমস- এ 32 টি বিট অ্যাড্রেসিং স্পেসের (যা কোড গল্ফের জন্য সমস্যা সৃষ্টি করা উচিত নয়) একটি কর্মক্ষেত্রের সীমা সহ একটি পরীক্ষামূলক সংস্করণ পাওয়া যাবে x ওয়েবসাইটে। এই সংস্করণটি কেডিবি + ডাটাবেসের অংশ হিসাবে বান্ডিল করা হয়েছে, কথাগুলি "K4" নামে পরিচিত। এছাড়াও ওপেন-সোর্স কে বাস্তবায়ন উপলব্ধ রয়েছে, সহ কোনা যা কে 3 ভিত্তিক, এবং আমার নিজস্ব অনুবাদক ওকে নামে পরিচিত যা কে 5 এর উপর ভিত্তি করে এবং ব্রাউজার ভিত্তিক আরপিএল রয়েছে

কেএক্স সিস্টেমগুলির একটি রয়েছে কে 4 / কেডিবি + / কিউ তথ্য সহ উইকি রয়েছে এবং কোনা গিটহাব পৃষ্ঠায় রেফারেন্স উপকরণগুলির একটি দুর্দান্ত সংগ্রহ রয়েছে। আমি ওকে / কে 5 এর জন্য একটি ম্যানুয়াল লিখতে শুরু করেছি যা একটি দরকারী রেফারেন্স হতে পারে।

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

উত্তর:


5

ডায়াড ডাকছে

ধরে নিচ্ছি আপনার একটি ডায়ডিক (২-যুক্তি) ফাংশন রয়েছে f:

f: {x+2*y}

আপনি সাধারণভাবে এটিকে এভাবে ডাকবেন:

f[3;47]

আপনি প্রথম যুক্তিতে কার্য় করে পরিবর্তে অক্ষর দ্বারা দ্বিতীয় যুক্তিতে ফলাফলের আংশিক ফাংশন প্রয়োগ করে একটি অক্ষর সংরক্ষণ করতে পারেন:

f[3]47

একইভাবে অ্যারে সূচকের জন্য কাজ করে:

  z: (12 17 98;90 91 92)
(12 17 98
 90 91 92)

  z[1;2]
92

  z[1]2
92

5

নিউলাইনগুলি মুদ্রণ করা হচ্ছে

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

`0:whatever,"\n"

না । কে 2 (এবং সম্ভবত অন্যান্য সংস্করণগুলি) এর একটি ঝরঝরে বৈশিষ্ট্য রয়েছে যেখানে আপনি লাইনের একটি তালিকা মুদ্রণ করতে পারেন:

  `0:("abc";"def")
abc
def

সুতরাং, যদি আপনাকে আউটপুটে একটি নতুন লাইন সংযোজন করতে হয়, কেবল করুন:

`0:,whatever

3

রেঞ্জ

সাধারণত আপনি যদি ব্যবহার করেন এমন ক্রমসংখ্যার ভেক্টর তৈরি করতে চান !:

  !5
0 1 2 3 4

আপনি যদি শূন্য ব্যতীত অন্য কোনও সংখ্যার থেকে শুরু করে এমন একটি পরিসীমা তৈরি করতে চান তবে আপনি ফলস্বরূপ ভেক্টরটিতে একটি অফসেট যুক্ত করতে চান:

  10+!5
10 11 12 13 14

কয়েকটি অসাধারণ পন্থা রয়েছে যা কোনও নির্দিষ্ট পরিস্থিতির জন্য আরও ভাল কাজ করতে পারে। উদাহরণস্বরূপ, যদি আপনার বেস এবং অফসেট ইতিমধ্যে কোনও তালিকার সদস্য হয় তবে আপনি "যেখানে" দুবার ব্যবহার করতে পারেন:

  &10 5
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
  &&10 5
10 11 12 13 14

ধীরে ধীরে ক্রমবর্ধমান ক্রমগুলির জন্য, "কোথায়" সাথে "নিতে" সংমিশ্রণটি বিবেচনা করুন:

  5#2
2 2 2 2 2
  &5#2
0 0 1 1 2 2 3 3 4 4

আপনি যদি বহুগুনের পরিসীমা তৈরি করতে চান তবে আপনি ফলাফলটির গুণন !করতে পারেন বা \পদক্ষেপের আকারের অনুলিপিগুলির একটি তালিকা স্ক্যান করতে পারেন :

  2*!5
0 2 4 6 8
  +\5#2
2 4 6 8 10

যদি আপনি বন্ধনীগুলি এড়াতে চেষ্টা করছেন তবে অনুক্রমের দৈর্ঘ্য পরিবর্তনশীল এবং ধাপের আকারটি স্থির করা থাকলে পূর্ববর্তীটি আরও ভাল, যখন ধাপের আকারটি পরিবর্তিত হয় তারপরে যদি আরও ভাল হয়। সঠিক প্রকরণটি বাছাই করা 1 বা 2 টি অক্ষর বাঁচাতে পারে। অফ বাই ওয়ান পার্থক্য আপনার পক্ষেও কাজ করতে পারে।


2

স্ট্রিং থেকে বর্ণগুলি ব্যয়বহুল। শুধু eval ব্যবহার করুন। এই:

0.0$a

এই মাত্র হতে পারে:

. a

কে 5 এ এটি একটি বাইট সংক্ষিপ্ত:

.a

2

প্রতিটি অধিকার

মাঝে মাঝে আপনি নিজেকে লিখতে পারেন (বা সরলীকরণের মাধ্যমে আগত) প্রতিটি-মোনাডের মাধ্যমে প্রয়োগ করা প্রথম বন্ধনীযুক্ত প্রকাশ:

  (2#)'3 4 5
(3 3
 4 4
 5 5)

এই প্যাটার্নটিকে প্রতিটি-রাইটের প্রয়োগে রূপান্তর করা একটি চরিত্রের চেয়ে ছোট orter

  2#/:3 4 5
(3 3
 4 4
 5 5)

1

চক্রীয় অনুগতি

!কে 3 / কে 4-এ ডায়াডিকটি "আবর্তিত":

  2!"abcd"
"cdab"
  -1!"abcd"
"dabc"

যখন "স্ক্যান" ( \) একটি monadic ক্রিয়া সরবরাহ করা হয়, এটি একটি নির্দিষ্ট পয়েন্ট অপারেটর হিসাবে কাজ করে। কে-তে স্থির পয়েন্ট অপারেটররা প্রাথমিক মান পুনর্বিবেচনা না করা বা মান পরিবর্তন বন্ধ হওয়া অবধি বারবার তাদের ক্রিয়াকে একটি মানটিতে প্রয়োগ করে। স্থির-পয়েন্ট স্ক্যানের সাথে ঘোরার সংমিশ্রণ একটি তালিকার চক্রাকার ক্রমগুলির একটি সেট গণনার খুব সুবিধাজনক উপায় সরবরাহ করে:

  ![1]\1 2 4 8
(1 2 4 8
 2 4 8 1
 4 8 1 2
 8 1 2 4)

আপনি হয় তরকারী করতে পারেন !ক্রিয়াপদ ট্রেন তৈরি মাধ্যমে বা বন্ধনীরূপ করতে পারেন (1!):

![1]\
(1!)\

(মনে রাখবেন যে 1!\ যেটির সম্পূর্ণ ভিন্ন আচরণ রয়েছে!) এগুলির প্রতিটি দৈর্ঘ্যের সমতুল্য তবে ঘূর্ণন প্রবাহ 1 ছাড়া অন্য কিছু হলে প্রাক্তনটি আরও বেশি পছন্দসই হতে পারে; এই ক্ষেত্রে বন্ধনীগুলি একটি বিনামূল্যে প্রথম জন্য প্রথম বন্ধনীযুক্ত subexpression সীমাবদ্ধ।

উদাহরণস্বরূপ, এখানে একটি সংক্ষিপ্ত প্রোগ্রাম যা একটি স্ট্রিং x-এ সাবস্ট্রিং y (চক্রীয়ভাবে!) রয়েছে কিনা তা ব্রুট ফোর্সের মাধ্যমে পরীক্ষা করে:

{|/(y~(#y)#)'![1]\x}

কে 5 ব্যবহারকারী সাবধান! কে 5 ডায়ডিকের অর্থ পরিবর্তন করেছে !, সুতরাং এই কৌশলটি এত সহজ নয়। এটি কোনায় প্রত্যাশার মতো কাজ করবে।


1

শর্তাবলী এড়ানো

কে এর একটি শর্তসাপেক্ষ কনস্ট্রাক্ট ( :[) রয়েছে যা লিস্প-স্টাইলের সমান cond:

:[cond1;result1; cond2;result2; cond3;result3; default]

আপনার নিজের পছন্দ মতো শর্ত থাকতে পারে এবং যদি কোনওটির সাথে মেলে না তবে ডিফল্ট মানটি ফেরত দেওয়া হবে না।

কখনও কখনও (যেমন পুনরাবৃত্তির প্রোগ্রাম বা প্রোগ্রামগুলি যা অন্যথায় পার্শ্বপ্রতিক্রিয়ার ক্রমের উপর নির্ভর করে), এর মধ্যে একটিরও ব্যবহার করার সুযোগ নেই। তবে, এমন পরিস্থিতিতে যেখানে আপনি কিছুটা অতিরিক্ত কাজ করার সামর্থ্য রাখতে পারেন, আপনি প্রায়শই তালিকা অনুক্রমের সাথে "কনড" প্রতিস্থাপন করতে পারেন।

কুখ্যাত ফিজবজ প্রোগ্রামটি বিবেচনা করুন । একটি প্রচলিত অপরিহার্য প্রোগ্রামিং শৈলীতে লেখা, আমরা এর সাথে যেতে পারি:

{:[~x!15;"FizzBuzz";~x!3;"Fizz";~x!5;"Buzz";x]}'1+!100

বিভাজ্য পরীক্ষায় এখানে বেশ কিছুটা পুনরাবৃত্তি রয়েছে। একটি ভিন্ন পদ্ধতির স্বীকৃতি দেয় যে এখানে 4 টি মামলা রয়েছে (একটি সংখ্যা, কেবল 3 দ্বারা বিভাজ্যতা, কেবল 5 দ্বারা বিভাজ্যতা, 3 এবং 5 দ্বারা বিভাজ্যতা) এবং সরাসরি একটি সূচক গণনা করার চেষ্টা করে যা এই তালিকাগুলির মধ্যে একটি তালিকা থেকে বেছে নেয়:

{(x;"Fizz";"Buzz";"FizzBuzz")@+/1 2*~x!/:3 5}'1+!100

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

{(x;4#t;4_ t;t:"FizzBuzz")@+/1 2*~x!/:3 5}'1+!100

এখন আমরা সামগ্রিকভাবে 5 টি অক্ষর সংরক্ষণ করেছি। ঘটনাক্রমে, এই বিশেষ উদাহরণটি কে 5-তে এমনকি আরও ভাল কাজ করে, যেহেতু /সহগের একটি ভেক্টর এবং সংক্ষেপণের দ্বারা গুণনের পদক্ষেপটি পরিচালনা করার জন্য আমাদের "প্যাক" ওভারলোড রয়েছে :

{(x;4_t;4#t;t:"FizzBuzz")@2 2/~3 5!\:x}'1+!100

এছাড়াও নোট করুন যে "ফাইন্ড" ( ?) এর আচরণ , যা আইটেমটি পাওয়া না গেলে মূল তালিকার শেষের আগে একটি সূচক তৈরি করে, বিশেষত এই ধরণের সূচকে কোনও "ডিফল্ট" কেস পরিচালনা করতে সহায়তা করার জন্য ডিজাইন করা হয়েছে। স্বরটিকে বড় হাতের মধ্যে রূপান্তর করতে এই খণ্ডটি বিবেচনা করুন:

{("AEIOU",x)"aeiou"?x}'

এর মধ্যে একটি:

{t:"aeiou"?x;:[t<5;"AEIOU"t;x]}'
{:[~4<t:"aeiou"?x;"AEIOU"t;x]}'

(আমি জানি যা আমি বরং পড়তাম!)

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