প্র্যাকটিস অনুশীলনী


প্র্যাকটিস অনুশীলনী হলো এমন অনুশীলনী যা শিক্ষার্থীদের যেকোনো সমস্যা সমাধান করার সুযোগ দেয়, যার উদ্দেশ্য হলো তারা এতদিন যে কনসেপ্টগুলো শিখেছে সেগুলো কাজে লাগাতে পারবে।

একটি ট্র্যাকে নিজের প্রথম প্র্যাকটিস অনুশীলনী যোগ করতে আগ্রহী? প্র্যাকটিস অনুশীলনী যোগ করার ডকুমেন্টেশন দেখুন অথবা আমাদের ওয়াকথ্রু ভিডিওটি দেখুন 👇

Note

ট্র্যাকের রুট ডিরেক্টরি থেকে নিচের কমান্ডগুলো চালিয়ে আপনি দ্রুত একটি নতুন প্র্যাকটিস অনুশীলনীর কাঠামো তৈরি করতে পারেন:

bin/fetch-configlet
bin/configlet create --practice-exercise <slug>

আরও তথ্যের জন্য configlet create ডকুমেন্টেশন দেখুন

মেটাডেটা

প্র্যাকটিস অনুশীলনীর মেটাডেটা config.json ফাইল-এর exercises.practice কী-তে সংজ্ঞায়িত করা হয়। এই মেটাডেটা অনুশীলনীর UUID, স্লাগ এবং আরও অনেক কিছু নির্ধারণ করে।

উদাহরণ

{
  "exercises": {
    "practice": [
      {
        "uuid": "8ba15933-29a2-49b1-a9ce-70474bad3007",
        "slug": "leap",
        "name": "Leap",
        "practices": ["if-statements", "numbers", "operator-precedence"],
        "prerequisites": ["if-statements", "numbers"],
        "difficulty": 1
      }
    ]
  }
}

practices

practices কী-তে সেই কনসেপ্টগুলোর স্লাগের তালিকা থাকা উচিত, যেগুলো এই প্র্যাকটিস অনুশীলনীটি একজন শিক্ষার্থীকে সক্রিয়ভাবে চর্চা করার সুযোগ দেয়।

  • এগুলো UI-তে "Practice this Concept in: TwoFer, Leap, etc" হিসেবে দেখানো হয়
  • প্রতিটি কনসেপ্ট চর্চার জন্য ৩ থেকে ৮টি অনুশীলনী বেছে নেওয়ার চেষ্টা করুন।
  • এমন অন্তত দুটি অনুশীলনী বেছে নেওয়ার চেষ্টা করুন, যেগুলোতে কেউ একটি কনসেপ্টের মূল বিষয়গুলো চর্চা করতে পারে।
  • কিছু কনসেপ্ট খুবই কমন (যেমন strings)। সেক্ষেত্রে আমরা এমন কয়েকটি ভালো অনুশীলনী বেছে নেওয়ার পরামর্শ দিই, যেগুলো মানুষকে মজার উপায়ে সেই কনসেপ্টগুলো নিয়ে ভাবতে বাধ্য করে। যেমন, যেসব অনুশীলনীতে UTF-8, স্ট্রিং কনক্যাটেনেশন, char এনুমারেশন ইত্যাদির প্রয়োজন হয়, সেগুলো সবই ভালো উদাহরণ হতে পারে।

prerequisites

prerequisites কী-তে সেই কনসেপ্টগুলোর তালিকা থাকে, যা একজন শিক্ষার্থীকে এই প্র্যাকটিস অনুশীলনীটি পাওয়ার জন্য আগে শেষ করতে হবে।

  • এগুলো UI-তে "Learn Strings to unlock TwoFer" হিসেবে দেখানো হয়
  • এতে সেই সব কনসেপ্ট থাকা উচিত, যা একজন শিক্ষার্থীর অন্তত একটি আইডিওম্যাটিক উপায়ে অনুশীলনীটি শেষ করতে জানা দরকার। যেমন, Ruby-তে TwoFer অনুশীলনীর ক্ষেত্রে পূর্বশর্ত হিসেবে strings, optional-params, implicit-return থাকতে পারে।
  • যে অনুশীলনীগুলো বিকল্প কনসেপ্ট ব্যবহার করে শেষ করা যায় (যেমন loops বা recursion দিয়ে সমাধানযোগ্য একটি অনুশীলনী), সেগুলোর ক্ষেত্রে মেইনটেইনার শিক্ষার্থীর ট্র্যাক জুড়ে যাত্রার কথা মাথায় রেখে এমন একটি অ্যাপ্রোচ বেছে নেবেন যা দিয়ে তারা সেই অনুশীলনীটি আনলক করতে চান। যেমন, লুপ/রিকার্সনের উদাহরণে তারা ভাবতে পারেন এই অনুশীলনীটি loops-এর শুরুর দিকের চর্চার জন্য ভালো, অথবা তারা এটিকে পরে রেখে রিকার্সন শেখাতে চাইতে পারেন। বিকল্প অ্যাপ্রোচ চেষ্টা করতে শিক্ষার্থীকে উৎসাহ দিতে তারা একটি অ্যানালাইজারও কাজে লাগাতে পারেন: "লুপ দিয়ে এটি সমাধান করার জন্য দারুণ কাজ। আপনি চাইলে রিকার্সন ব্যবহার করেও এটি সমাধান করে দেখতে পারেন।"

ফাইল

প্রতিটি প্র্যাকটিস অনুশীলনীর জন্য ট্র্যাকের exercises/practice ডিরেক্টরির ভেতরে আলাদা ডিরেক্টরি থাকে। প্র্যাকটিস অনুশীলনীর ডিরেক্টরির নাম অবশ্যই অনুশীলনীর slug প্রপার্টির সাথে মিলতে হবে, যেমনটি config.json ফাইল-এ সংজ্ঞায়িত করা আছে।

একটি প্র্যাকটিস অনুশীলনীতে চার ধরনের ফাইল থাকে:

ডকুমেন্টেশন ফাইল

এই ফাইলগুলো শিক্ষার্থীকে দেখানো হয়, যাতে অনুশীলনীটি বুঝতে সাহায্য হয়।

  • .docs/introduction.md: অনুশীলনীর পরিবেশ ও পটভূমি তুলে ধরে (ঐচ্ছিক)
  • .docs/introduction.append.md: বিদ্যমান পরিচিতির পরে যোগ করার জন্য অতিরিক্ত পরিচিতি টেক্সট (ঐচ্ছিক)
  • .docs/instructions.md: অনুশীলনীর নির্দেশনা দেয় (আবশ্যিক)
  • .docs/instructions.append.md: বিদ্যমান নির্দেশনার পরে যোগ করার জন্য অতিরিক্ত পরিচিতি টেক্সট (ঐচ্ছিক)
  • .docs/hints.md: অনুশীলনীতে আটকে গেলে শিক্ষার্থীকে এগিয়ে যেতে সাহায্য করার জন্য সংকেত দেয় (ঐচ্ছিক)

মেটাডেটা ফাইল

এই ফাইলগুলো শিক্ষার্থীকে দেখানো হয় না, বরং অনুশীলনীর মেটাডেটা নির্ধারণে ব্যবহৃত হয়।

  • .meta/config.json: অনুশীলনীর মেটা তথ্য ধারণ করে (আবশ্যিক)
  • .meta/design.md: অনুশীলনীর ডিজাইন বর্ণনা করে (ঐচ্ছিক)
  • .meta/tests.toml: কোন টেস্টগুলো বাস্তবায়ন করা হয়েছে তার তথ্য ধারণ করে (ঐচ্ছিক)

অ্যাপ্রোচ ফাইল

এই ফাইলগুলো অনুশীলনীর অ্যাপ্রোচগুলো বর্ণনা করে।

  • .approaches/introduction.md: অনুশীলনীর সবচেয়ে কমন অ্যাপ্রোচগুলোর পরিচিতি (ঐচ্ছিক)
  • .approaches/config.json: অ্যাপ্রোচগুলোর মেটাডেটা (ঐচ্ছিক)
  • .approaches/<approach-slug>/content.md: অ্যাপ্রোচের বর্ণনা (ঐচ্ছিক)
  • .approaches/<approach-slug>/snippet.txt: অ্যাপ্রোচটি তুলে ধরা ছোট একটি স্নিপেট (ঐচ্ছিক)

আর্টিকেল ফাইল

এই ফাইলগুলো অনুশীলনীর আর্টিকেলগুলো বর্ণনা করে।

  • .articles/config.json: আর্টিকেলগুলোর মেটাডেটা (ঐচ্ছিক)
  • .articles/<article-slug>/content.md: আর্টিকেলের বর্ণনা (ঐচ্ছিক)
  • .articles/<article-slug>/snippet.md: আর্টিকেলটি তুলে ধরা ছোট একটি স্নিপেট (ঐচ্ছিক)

অনুশীলনীর ফাইল

ভাষা-নির্দিষ্ট ফাইল, যেমন ইমপ্লিমেন্টেশন ও টেস্ট ফাইল। এই ফাইলগুলোর নাম ট্র্যাক-নির্দিষ্ট।

  • টেস্ট স্যুট: একটি সলিউশনের সঠিকতা যাচাই করে।
  • স্টাব ইমপ্লিমেন্টেশন: শিক্ষার্থীদের জন্য শুরুর একটি বিন্দু তৈরি করে।
  • উদাহরণ ইমপ্লিমেন্টেশন: এমন একটি উদাহরণ ইমপ্লিমেন্টেশন দেয় যা সব টেস্ট পাস করে।
  • অতিরিক্ত ফাইল: টেস্টগুলো যাতে চালানো যায় তা নিশ্চিত করে।

উদাহরণ

exercises
└── practice
    └── isogram
        ├── .approaches
        |   ├── for-loop
        |   |   ├── content.md
        |   |   └── snippet.txt
        |   ├── config.json
        |   └── introduction.md
        ├── .articles
        |   ├── performance
        |   |   ├── content.md
        |   |   └── snippet.md
        |   └── config.json
        ├── .docs
        |   ├── introduction.md
        |   ├── instructions.md
        |   └── hints.md
        ├── .meta
        |   ├── config.json
        |   ├── design.md
        |   ├── tests.toml
        |   └── Example.cs (example implementation)
        ├── Isogram.cs (stub implementation)
        └── IsogramTests.cs (tests)

ফাইল: .docs/introduction.md

উদ্দেশ্য: শিক্ষার্থীর কাছে অনুশীলনীর পরিবেশ ও পটভূমি তুলে ধরা।

উপস্থিতি: অনুশীলনীটি যদি introduction.md ফাইলসহ কোনো প্রবলেম স্পেসিফিকেশন অনুশীলনী বাস্তবায়ন করে, তবে আবশ্যিক

অনুশীলনীটি যদি একটি প্রবলেম স্পেসিফিকেশন অনুশীলনী বাস্তবায়ন করে, তবে এই ফাইলের বিষয়বস্তু প্রবলেম স্পেসিফিকেশন অনুশীলনীর introduction.md ফাইলের সাথে মিলতে হবে। configlet-এ স্বয়ংক্রিয়ভাবে এই ফাইলের বিষয়বস্তু সিঙ্ক করার সুবিধা আছে।

অনুশীলনীটি যদি প্রবলেম স্পেসিফিকেশন অনুশীলনীর উপর ভিত্তি করে তৈরি না হয়, তবে নিচের বিষয়গুলো ভেবে দেখুন:

Exercism-এর কনটেন্ট সবার জন্য নিরাপদ করা আমাদের কাছে খুবই গুরুত্বপূর্ণ, তাই কোনো গল্প উপযুক্ত কি না তা ঠিক করার সময় আমরা প্রায়ই বাড়তি সতর্কতা অবলম্বন করি। আমরা যা মার্জ করি সে বিষয়ে সতর্ক থাকলেও, কোনটা সমস্যাযুক্ত মনে হতে পারে তা বোঝা কঠিন, এটা আমরা স্বীকার করি; তাই আমরা সবসময় ধরে নেব আপনি ভালো উদ্দেশ্যেই কাজ করছেন এবং রিভিউয়ের সময় কোনো সমস্যা থাকলে তা সংঘাতমুক্তভাবে ধরার সর্বোচ্চ চেষ্টা করব। আপনি যদি আমাদের সাথে কোনো গল্প যাচাই করতে চান, তবে @exercism/leadership-কে মেনশন করুন, আমরা একসাথে দেখব। এখানে কয়েকটি নির্দেশনা:

  • গল্পটি যেন সবার জন্য স্বাগতপূর্ণ হয় এবং সবাই বুঝতে পারে তা নিশ্চিত করার চেষ্টা করুন। গল্পে যদি শুধু একটি নির্দিষ্ট গোষ্ঠীর বোঝা রসিকতা বা আঞ্চলিক চলিত ভাষা থাকে, তবে বিকল্প বাক্যাংশের কথা ভাবুন।
  • এমন উদাহরণ লেখার চেষ্টা করুন যা সবাইকে অন্তর্ভুক্ত করে। যেমন, ভিন্ন সংস্কৃতির নাম এবং নারী-পুরুষ মিশিয়ে ব্যবহার করার কথা ভাবুন।
  • নিজেকে জিজ্ঞাসা করুন, গল্পটি পড়ে আপনার পরিচিত কেউ অপমানিত বোধ করতে পারে কি না। যদি তা হয়, তবে সেটি এড়াতে গল্পটি বদলানোর কথা ভাবুন।

উদাহরণ

# Introduction

Bob is a lackadaisical teenager. In conversation, his responses are very limited.

ফাইল: .docs/introduction.append.md

উদ্দেশ্য: বিদ্যমান পরিচিতির পরে যোগ করার জন্য অতিরিক্ত পরিচিতি টেক্সট।

উপস্থিতি: ঐচ্ছিক

কিছু (বিরল) ক্ষেত্রে আপনি অনুশীলনীর introduction.md ফাইলটি বাড়াতে চাইতে পারেন, যেমন যখন অনুশীলনীতে এমন টেস্ট বাস্তবায়ন করা হয়েছে যা বিদ্যমান নির্দেশনায় কভার করা নেই।

যে ট্র্যাক চায় না Bob নন-ASCII মেসেজ সমর্থন করুক, সেটি নিচের অংশটি যোগ করতে পারে:

# Introduction append

## Note

As part of his teenage rebellion, Bob has decided to only communicate using ASCII.

অ্যাপেন্ড ফাইলগুলো H1 হেডার দিয়ে শুরু হওয়া উচিত। এই হেডারটি দেখানো হয় না, তবুও এটি থাকা উচিত। H1 হেডারের পরে প্রায়ই একটি H2 হেডার থাকে, যা সাধারণ কনটেন্টকে ট্র্যাক-নির্দিষ্ট কনটেন্ট থেকে আলাদা করতে সাহায্য করে।

ফাইল: .docs/instructions.md

উদ্দেশ্য: অনুশীলনীর নির্দেশনা দেওয়া।

উপস্থিতি: আবশ্যিক

অনুশীলনীটি যদি একটি প্রবলেম স্পেসিফিকেশন অনুশীলনী বাস্তবায়ন করে, তবে এই ফাইলের বিষয়বস্তু প্রবলেম স্পেসিফিকেশন অনুশীলনীর instructions.md ফাইলের (বা instructions.md ফাইল না থাকলে description.md ফাইলের) সাথে মিলতে হবে। configlet-এ স্বয়ংক্রিয়ভাবে এই ফাইলের বিষয়বস্তু সিঙ্ক করার সুবিধা আছে।

অনুশীলনীটি যদি প্রবলেম স্পেসিফিকেশন অনুশীলনীর উপর ভিত্তি করে তৈরি না হয়, তবে নিচের বিষয়গুলো ভেবে দেখুন:

Exercism-এর কনটেন্ট সবার জন্য নিরাপদ করা আমাদের কাছে খুবই গুরুত্বপূর্ণ, তাই কোনো গল্প উপযুক্ত কি না তা ঠিক করার সময় আমরা প্রায়ই বাড়তি সতর্কতা অবলম্বন করি। আমরা যা মার্জ করি সে বিষয়ে সতর্ক থাকলেও, কোনটা সমস্যাযুক্ত মনে হতে পারে তা বোঝা কঠিন, এটা আমরা স্বীকার করি; তাই আমরা সবসময় ধরে নেব আপনি ভালো উদ্দেশ্যেই কাজ করছেন এবং রিভিউয়ের সময় কোনো সমস্যা থাকলে তা সংঘাতমুক্তভাবে ধরার সর্বোচ্চ চেষ্টা করব। আপনি যদি আমাদের সাথে কোনো গল্প যাচাই করতে চান, তবে @exercism/leadership-কে মেনশন করুন, আমরা একসাথে দেখব। এখানে কয়েকটি নির্দেশনা:

  • গল্পটি যেন সবার জন্য স্বাগতপূর্ণ হয় এবং সবাই বুঝতে পারে তা নিশ্চিত করার চেষ্টা করুন। গল্পে যদি শুধু একটি নির্দিষ্ট গোষ্ঠীর বোঝা রসিকতা বা আঞ্চলিক চলিত ভাষা থাকে, তবে বিকল্প বাক্যাংশের কথা ভাবুন।
  • এমন উদাহরণ লেখার চেষ্টা করুন যা সবাইকে অন্তর্ভুক্ত করে। যেমন, ভিন্ন সংস্কৃতির নাম এবং নারী-পুরুষ মিশিয়ে ব্যবহার করার কথা ভাবুন।
  • নিজেকে জিজ্ঞাসা করুন, গল্পটি পড়ে আপনার পরিচিত কেউ অপমানিত বোধ করতে পারে কি না। যদি তা হয়, তবে সেটি এড়াতে গল্পটি বদলানোর কথা ভাবুন।

উদাহরণ

# Instructions

Bob answers 'Sure.' if you ask him a question, such as "How are you?".

He answers 'Whoa, chill out!' if you YELL AT HIM (in all capitals).

He answers 'Calm down, I know what I'm doing!' if you yell a question at him.

He says 'Fine. Be that way!' if you address him without actually saying anything.

He answers 'Whatever.' to anything else.

ফাইল: .docs/instructions.append.md

উদ্দেশ্য: বিদ্যমান নির্দেশনার পরে যোগ করার জন্য অতিরিক্ত নির্দেশনা টেক্সট।

উপস্থিতি: ঐচ্ছিক

কিছু (বিরল) ক্ষেত্রে আপনি অনুশীলনীর instructions.md ফাইলটি বাড়াতে চাইতে পারেন, যেমন যখন অনুশীলনীতে এমন টেস্ট বাস্তবায়ন করা হয়েছে যা বিদ্যমান নির্দেশনায় কভার করা নেই।

# Instructions append

## Note

Bob's conversational partner is a purist when it comes to written communication and always follows normal rules regarding sentence punctuation in English.

অ্যাপেন্ড ফাইলগুলো H1 হেডার দিয়ে শুরু হওয়া উচিত। এই হেডারটি দেখানো হয় না, তবুও এটি থাকা উচিত। H1 হেডারের পরে প্রায়ই একটি H2 হেডার থাকে, যা সাধারণ কনটেন্টকে ট্র্যাক-নির্দিষ্ট কনটেন্ট থেকে আলাদা করতে সাহায্য করে।

ফাইল: .docs/hints.md

উদ্দেশ্য: অনুশীলনীতে আটকে গেলে শিক্ষার্থীকে এগিয়ে যেতে সাহায্য করার জন্য সংকেত দেওয়া।

উপস্থিতি: ঐচ্ছিক

  • শিক্ষার্থী আটকে গেলে আমরা তাকে সংকেত চাওয়ার জন্য একটি বোতামে ক্লিক করার সুযোগ দেব, যা ফাইলের সংশ্লিষ্ট অংশটি দেখাবে।
  • সংকেতগুলো শিরোনামের নিচে বুলেট আকারে থাকা উচিত।
  • সংকেতগুলো প্রায় যেকোনো শিক্ষার্থীর আটকে যাওয়া কাটাতে যথেষ্ট হওয়া উচিত।
  • সংকেতগুলোতে সলিউশন সরাসরি বলে দেওয়া উচিত নয়, বরং সলিউশন বর্ণনা করে এমন কোনো রিসোর্সের দিকে ইঙ্গিত করা উচিত (যেমন ব্যবহারযোগ্য ফাংশনের ডকুমেন্টেশনে লিংক করা)।
  • সংকেতগুলোতে কনসেপ্ট বোঝাতে কোড নমুনা ব্যবহার করা যেতে পারে, কিন্তু সলিউশনের রূপরেখা দিতে নয়। যেমন একটি লিস্ট-সংক্রান্ত অনুশীলনীতে কোনো নির্দিষ্ট লিস্ট ফাংশন কীভাবে কাজ করে তার একটি স্নিপেট দেখানো যেতে পারে, তবে এমনভাবে নয় যাতে সেটি সরাসরি সলিউশনে কপি/পেস্ট করা যায়।
  • সংকেতগুলো অবশ্যই ## General শিরোনামের নিচে একটি Markdown তালিকা হিসেবে থাকতে হবে।
  • কোনো সংকেত না থাকলে শিরোনামটি বাদ দিতে হবে।

সংকেত দেখা কোনো "প্রস্তাবিত" পথ নয় এবং শিক্ষার্থী এটি ছাড়া এগোতে না পারলে আমরা (নরমভাবে) এটি ব্যবহারে নিরুৎসাহিত করব। তাই মনে রাখা ভালো যে সংকেত পড়া শিক্ষার্থী একটু বিভ্রান্ত বা অভিভূত, এমনকি হতাশও হতে পারে।

উদাহরণ

## General

- There are many [built-in methods][integers] to simplify working with integers.

[integers]: https://ruby-doc.org/core-2.7.0/Integer.html

ফাইল: .meta/design.md

উদ্দেশ্য: অনুশীলনীর ডিজাইন বর্ণনা করা।

উপস্থিতি: ঐচ্ছিক

এই ফাইলে অনুশীলনীর ডিজাইন সম্পর্কিত তথ্য থাকে, যার মধ্যে রয়েছে এর লক্ষ্য, শেখানোর লক্ষ্য, কী শেখানো উচিত নয় ইত্যাদি।

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

উদাহরণ

# Design

## Goal

The goal of this exercise is help students practice how to work with strings.

## Notes

This exercise does not contain any error handling tests.

ফাইল: .meta/config.json

উদ্দেশ্য: অনুশীলনীর মেটা তথ্য ধারণ করা।

উপস্থিতি: আবশ্যিক

এই ফাইলে অনুশীলনীর মেটা তথ্য থাকে:

  • authors: অনুশীলনীর লেখকের/লেখকদের GitHub ইউজারনেম (ঐচ্ছিক)
    • রিভিউয়ারদেরও অন্তর্ভুক্ত করুন, যদি তাদের রিভিউ অনুশীলনীটিকে উল্লেখযোগ্যভাবে বদলে দেয় (এমন পর্যায়ে যেখানে মনে হয় "আপনারা একসাথে এখানে পৌঁছেছেন")
  • contributors: অনুশীলনীর কনট্রিবিউটরদের GitHub ইউজারনেম (ঐচ্ছিক)
    • রিভিউয়ারদেরও অন্তর্ভুক্ত করুন, যদি তাদের রিভিউ অর্থবহ/ব্যবহারযোগ্য/গ্রহণ করা হয়ে থাকে।
  • files: এই অনুশীলনীতে ব্যবহৃত ফাইলগুলোর অবস্থান, অনুশীলনীর ডিরেক্টরির সাপেক্ষে (আবশ্যিক)
  • language_versions ভাষার সংস্করণের প্রয়োজনীয়তা (ঐচ্ছিক)
  • blurb: এই অনুশীলনীর একটি সংক্ষিপ্ত বিবরণ। এর দৈর্ঘ্য <= ৩৫০ হতে হবে। Markdown সমর্থিত নয় (আবশ্যিক)
  • source: এই অনুশীলনীটি যে সূত্রের উপর ভিত্তি করে তৈরি (ঐচ্ছিক)
  • source_url: এই অনুশীলনীটি যে সূত্রের উপর ভিত্তি করে তৈরি সেই সূত্রের URL (ঐচ্ছিক)
  • test_runner: এই অনুশীলনীর সলিউশনগুলো টেস্ট রানারে টেস্ট করা উচিত কি না তা নির্দেশ করে। নির্দিষ্ট না থাকলে ডিফল্ট true। (ঐচ্ছিক)
  • representer: এই ফাইলটি representer কীভাবে প্রসেস করে তা সংক্রান্ত মেটা তথ্য (ঐচ্ছিক)
    • version: অনুশীলনীর জন্য ব্যবহারযোগ্য representer-এর সংস্করণের একটি ইন্টিজার (প্যারেন্ট কী থাকলে আবশ্যিক)
  • icon: আইকনের স্লাগ (আইকনের সম্পূর্ণ তালিকা দেখুন)। নির্দিষ্ট না থাকলে অনুশীলনীর স্লাগ ব্যবহার করা হবে (ঐচ্ছিক)
  • custom: অনুশীলনী-নির্দিষ্ট যেকোনো অ-প্রমিত ডেটা। প্রতি অনুশীলনীতে ট্র্যাকের টুলিংয়ের আচরণ কাস্টমাইজ করতে ব্যবহার করা যায় (ঐচ্ছিক)

কেউ যদি একইসাথে লেখক এবং কনট্রিবিউটর হন, তবে তাকে শুধু লেখক হিসেবেই তালিকাভুক্ত করুন।

উদাহরণ

{
  "authors": ["FSharpForever"],
  "files": {
    "solution": ["Bob.fs"],
    "test": ["BobTests.fs"],
    "example": [".meta/Example.fs"]
  },
  "blurb": "Bob is a lackadaisical teenager. In conversation, his responses are very limited"
}

মনে রাখবেন:

  • লেখক ও কনট্রিবিউটরদের ক্রম গুরুত্বপূর্ণ নয় এবং এর কোনো অর্থ নেই।
  • language_versions একটি মুক্ত-ফরম্যাট স্ট্রিং, যা ট্র্যাকগুলো নিজের মতো ব্যবহার ও ব্যাখ্যা করতে পারে।

ফাইল: .meta/tests.toml

উদ্দেশ্য: কোন টেস্টগুলো বাস্তবায়ন করা হয়েছে তার তথ্য ধারণ করা।

উপস্থিতি: ঐচ্ছিক

অনুশীলনীর problem-specifications রিপো-র canonical-data.json ফাইলে কোনো টেস্ট সংজ্ঞায়িত থাকলে, এই ফাইলে কোন টেস্টগুলো বাস্তবায়ন করা হচ্ছে তার তথ্য থাকে।

এটি মেইনটেইনারদের কোন টেস্টগুলো বাস্তবায়িত হয়েছে তা ট্র্যাক করতে, এবং (ঐচ্ছিকভাবে) কেন কোনো নির্দিষ্ট টেস্ট বাস্তবায়িত হয়নি তা নথিভুক্ত করতে সাহায্য করে। এটি বাস্তবায়িত হয়নি এমন টেস্ট শনাক্ত করতেও ব্যবহার করা যায়।

configlet টুলটি configlet sync কমান্ডের মাধ্যমে problem-specifications রিপো-র ডেটার সাথে এই ফাইল আপডেট/সিঙ্ক করার কাজ সামলায়। সিঙ্ক করার সময় configlet প্রতিটি অ-বাস্তবায়িত টেস্টের জন্য জিজ্ঞাসা করবে সেই টেস্টটি অন্তর্ভুক্ত করা হবে কি না।

উদাহরণ

# This is an auto-generated file.
#
# Regenerating this file via `configlet sync` will:
# - Recreate every `description` key/value pair
# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications
# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)
# - Preserve any other key/value pair
#
# As user-added comments (using the # character) will be removed when this file
# is regenerated, comments can be added via a `comment` key.

[3e5c30a8-87e2-4845-a815-a49671ade970]
description = "empty strand"

[a0ea42a6-06d9-4ac6-828c-7ccaccf98fec]
description = "can count one nucleotide in single-character input"

[eca0d565-ed8c-43e7-9033-6cefbf5115b5]
description = "strand with repeated nucleotide"

[40a45eac-c83f-4740-901a-20b22d15a39f]
description = "strand with multiple nucleotides"

[b4c47851-ee9e-4b0a-be70-a86e343bd851]
description = "strand with invalid nucleotides"
include = false
comment = "error handling omitted on purpose"

ফাইল: .approaches/introduction.md

উদ্দেশ্য: অনুশীলনীর সবচেয়ে কমন অ্যাপ্রোচগুলোর পরিচিতি

উপস্থিতি: ঐচ্ছিক

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

উদাহরণ

# Introduction

The key to this exercise is to deal with C# strings being immutable, which means that a `string`'s value cannot be changed.
Therefore, to reverse a string you'll need to create a _new_ `string`.

## Using LINQ

```csharp
public static string Reverse(string input)
{
    return new string(input.Reverse().ToArray());
}
```

For more information, check the [LINQ approach][approach-linq].

## Which approach to use?

If readability is your primary concern (and it usually should be), the LINQ-based approach is hard to beat.

ফাইল: .approaches/config.json

উদ্দেশ্য: অ্যাপ্রোচগুলোর মেটাডেটা

উপস্থিতি: ঐচ্ছিক (কোনো অ্যাপ্রোচ পরিচিতি বা অ্যাপ্রোচ থাকলে আবশ্যিক)

এই ফাইলে অনুশীলনীর অ্যাপ্রোচগুলোর মেটা তথ্য থাকে:

  • introduction: অনুশীলনীর অ্যাপ্রোচ পরিচিতির লেখকের/লেখকদের GitHub ইউজারনেম (ঐচ্ছিক)

    • authors: অনুশীলনীর অ্যাপ্রোচ পরিচিতির লেখকের/লেখকদের GitHub ইউজারনেম (আবশ্যিক)
      • রিভিউয়ারদেরও অন্তর্ভুক্ত করুন, যদি তাদের রিভিউ অ্যাপ্রোচ পরিচিতিটিকে উল্লেখযোগ্যভাবে বদলে দেয় (এমন পর্যায়ে যেখানে মনে হয় "আপনারা একসাথে এখানে পৌঁছেছেন")
    • contributors: অনুশীলনীর অ্যাপ্রোচ পরিচিতির কনট্রিবিউটরদের GitHub ইউজারনেম (ঐচ্ছিক)
      • রিভিউয়ারদেরও অন্তর্ভুক্ত করুন, যদি তাদের রিভিউ অর্থবহ/ব্যবহারযোগ্য/গ্রহণ করা হয়ে থাকে।
  • approaches: বিস্তারিত অ্যাপ্রোচগুলোর তালিকা দেওয়া একটি অ্যারে (ঐচ্ছিক)

    • uuid: অ্যাপ্রোচটিকে স্বতন্ত্রভাবে শনাক্ত করে এমন একটি V4 UUID। UUID-টি ট্র্যাকের ভেতরে এবং সব ট্র্যাকজুড়ে অনন্য হতে হবে, এবং কখনো বদলানো যাবে না
    • slug: অ্যাপ্রোচের স্লাগ, যা লোয়ারকেস করা kebab-case স্ট্রিং। স্লাগটি ট্র্যাকের ভেতরে সব অ্যাপ্রোচ স্লাগের মধ্যে অনন্য হতে হবে। এর দৈর্ঘ্য <= ২৫৫ হতে হবে।
    • title: অ্যাপ্রোচের শিরোনাম। এর দৈর্ঘ্য <= ২৫৫ হতে হবে।
    • blurb: এই অ্যাপ্রোচের একটি সংক্ষিপ্ত বিবরণ। এর দৈর্ঘ্য <= ৩৫০ হতে হবে। Markdown সমর্থিত নয় (আবশ্যিক)
    • authors: অনুশীলনীর অ্যাপ্রোচের লেখকের/লেখকদের GitHub ইউজারনেম (আবশ্যিক)
      • রিভিউয়ারদেরও অন্তর্ভুক্ত করুন, যদি তাদের রিভিউ অনুশীলনীর অ্যাপ্রোচটিকে উল্লেখযোগ্যভাবে বদলে দেয় (এমন পর্যায়ে যেখানে মনে হয় "আপনারা একসাথে এখানে পৌঁছেছেন")
    • contributors: অনুশীলনীর অ্যাপ্রোচের কনট্রিবিউটরদের GitHub ইউজারনেম (ঐচ্ছিক)
      • রিভিউয়ারদেরও অন্তর্ভুক্ত করুন, যদি তাদের রিভিউ অর্থবহ/ব্যবহারযোগ্য/গ্রহণ করা হয়ে থাকে।
    • tags: কখন একটি সাবমিশন কোনো অ্যাপ্রোচের সাথে যুক্ত হবে তার শর্ত নির্দিষ্ট করে। (ঐচ্ছিক)
      • all: এমন ট্যাগের অ্যারে যা সবগুলোই একটি সাবমিশনে থাকতে হবে (ঐচ্ছিক, তবে any-তে কোনো এলিমেন্ট না থাকলে আবশ্যিক)
      • any: এমন ট্যাগের অ্যারে যার অন্তত একটি একটি সাবমিশনে থাকতে হবে (ঐচ্ছিক, তবে all-এ কোনো এলিমেন্ট না থাকলে আবশ্যিক)
      • not: ট্যাগগুলোর একটিও সাবমিশনে থাকা যাবে না (ঐচ্ছিক)

উদাহরণ

{
  "introduction": {
    "authors": ["erikschierboom"]
  },
  "approaches": [
    {
      "uuid": "448fb2b4-18ab-4e55-aa54-ad4ed6d5f7f6",
      "slug": "span",
      "title": "Use Span<T>",
      "blurb": "Use Span<T> to efficiently reverse a string.",
      "authors": ["erikschierboom"]
    }
  ]
}

ফাইল: .approaches/<approach-slug>/content.md

উদ্দেশ্য: অ্যাপ্রোচের বিস্তারিত বর্ণনা

উপস্থিতি: ঐচ্ছিক (অ্যাপ্রোচের জন্য আবশ্যিক)

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

উদাহরণ

# Span

```csharp
Span<char> chars = stackalloc char[input.Length];
for (var i = 0; i < input.Length; i++)
{
    chars[input.Length - 1 - i] = input[i];
}
return new string(chars);
```

This `Span<T>` approach uses a `for` loop.

ফাইল: .approaches/<approach-slug>/snippet.txt

উদ্দেশ্য: অ্যাপ্রোচটি তুলে ধরা স্নিপেট

উপস্থিতি: ঐচ্ছিক (অ্যাপ্রোচের জন্য আবশ্যিক)

এই ফাইলে অ্যাপ্রোচটি তুলে ধরা একটি ছোট স্নিপেট থাকে। স্নিপেটটি অনুশীলনীর ডিগ ডিপার পেজে দেখানো হয়।

এর লাইনের সংখ্যা <= ৮ হতে হবে।

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

উদাহরণ

Span<char> chars = stackalloc char[input.Length];
for (var i = 0; i < input.Length; i++)
{
    chars[input.Length - 1 - i] = input[i];
}
return new string(chars);

ফাইল: .article/config.json

উদ্দেশ্য: আর্টিকেলগুলোর মেটাডেটা

উপস্থিতি: ঐচ্ছিক (কোনো আর্টিকেল থাকলে আবশ্যিক)

এই ফাইলে অনুশীলনীর আর্টিকেলগুলোর মেটা তথ্য থাকে:

  • articles: বিস্তারিত আর্টিকেলগুলোর তালিকা দেওয়া একটি অ্যারে (ঐচ্ছিক)
    • uuid: আর্টিকেলটিকে স্বতন্ত্রভাবে শনাক্ত করে এমন একটি V4 UUID। UUID-টি ট্র্যাকের ভেতরে এবং সব ট্র্যাকজুড়ে অনন্য হতে হবে, এবং কখনো বদলানো যাবে না
    • slug: আর্টিকেলের স্লাগ, যা লোয়ারকেস করা kebab-case স্ট্রিং। স্লাগটি ট্র্যাকের ভেতরে সব আর্টিকেল স্লাগের মধ্যে অনন্য হতে হবে। এর দৈর্ঘ্য <= ২৫৫ হতে হবে।
    • title: আর্টিকেলের শিরোনাম। এর দৈর্ঘ্য <= ২৫৫ হতে হবে।
    • blurb: এই আর্টিকেলের একটি সংক্ষিপ্ত বিবরণ। এর দৈর্ঘ্য <= ৩৫০ হতে হবে। Markdown সমর্থিত নয় (আবশ্যিক)
    • authors: অনুশীলনীর আর্টিকেলের লেখকের/লেখকদের GitHub ইউজারনেম (আবশ্যিক)
      • রিভিউয়ারদেরও অন্তর্ভুক্ত করুন, যদি তাদের রিভিউ অনুশীলনীর আর্টিকেলটিকে উল্লেখযোগ্যভাবে বদলে দেয় (এমন পর্যায়ে যেখানে মনে হয় "আপনারা একসাথে এখানে পৌঁছেছেন")
    • contributors: অনুশীলনীর আর্টিকেলের কনট্রিবিউটরদের GitHub ইউজারনেম (ঐচ্ছিক)
      • রিভিউয়ারদেরও অন্তর্ভুক্ত করুন, যদি তাদের রিভিউ অর্থবহ/ব্যবহারযোগ্য/গ্রহণ করা হয়ে থাকে।

উদাহরণ

{
  "articles": [
    {
      "uuid": "6db71962-62d5-448b-a980-c20ae41013ed",
      "slug": "performance",
      "title": "Optimizing performance",
      "blurb": "Explore how to most efficiently reverse a string and what the trade-offs are.",
      "authors": ["erikschierboom"]
    }
  ]
}

ফাইল: .articles/<article-slug>/content.md

উদ্দেশ্য: অ্যাপ্রোচের বিস্তারিত বর্ণনা

উপস্থিতি: ঐচ্ছিক (অ্যাপ্রোচের জন্য আবশ্যিক)

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

উদাহরণ

# Performance

In this document, we'll find out which approach is the most performant one.

## Benchmark results

| Method |      Mean |     Error |    StdDev |    Median | Allocated |
| -----: | --------: | --------: | --------: | --------: | --------: |
|   Linq | 29.133 ns | 0.5865 ns | 0.5486 ns | 28.984 ns |      80 B |
|  Array |  4.806 ns | 0.4999 ns | 1.4739 ns |  3.967 ns |         - |

ফাইল: .articles/<article-slug>/snippet.txt

উদ্দেশ্য: অ্যাপ্রোচটি তুলে ধরা স্নিপেট

উপস্থিতি: ঐচ্ছিক (আর্টিকেলের জন্য আবশ্যিক)

এই ফাইলে আর্টিকেলটি তুলে ধরা একটি ছোট স্নিপেট থাকে। স্নিপেটটি অনুশীলনীর ডিগ ডিপার পেজে দেখানো হয়।

এর লাইনের সংখ্যা <= ৮ হতে হবে।

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

উদাহরণ

| Method |      Mean | Allocated |
| -----: | --------: | --------: |
|   Linq | 29.133 ns |      80 B |
|  Array |  4.806 ns |         - |

ফাইল: স্টাব ইমপ্লিমেন্টেশন

উদ্দেশ্য: শিক্ষার্থীদের জন্য শুরুর একটি বিন্দু তৈরি করা।

উপস্থিতি: আবশ্যিক

  • স্টাবটি এমনভাবে ডিজাইন করুন যাতে শিক্ষার্থী বুঝতে পারে কোথায় কোড যোগ করতে হবে।
  • কম্পাইলড ভাষার ক্ষেত্রে কোডটি যেন কম্পাইল হয় এমন রাখার কথা ভাবুন, কারণ ভাষার সাথে নতুন শিক্ষার্থীদের কাছে কম্পাইলারের বার্তা অনেক সময় বোঝা কঠিন হতে পারে।
  • কোডটি যতটা সম্ভব সহজ হওয়া উচিত।
  • কেবল পূর্বশর্তে (আর তাদের পূর্বশর্তে, এভাবে চলতে থাকবে) চালু করা ভাষার ফিচারগুলো ব্যবহার করুন।
  • ব্রাউজারে কোডিং করার সময় স্টাব ফাইলটি শিক্ষার্থীকে দেখানো হয় এবং CLI ব্যবহার করার সময় শিক্ষার্থীর ফাইল সিস্টেমে ডাউনলোড করা হয়।
  • স্টাব ইমপ্লিমেন্টেশন ফাইলের আপেক্ষিক পাথ .meta/config.json ফাইলের "files.solution" কী-তে উল্লেখ করতে হবে।

উদাহরণ

using System;

public static class Isogram
{
    public static bool IsIsogram(string word)
    {
        throw new NotImplementedException("You need to implement this function.");
    }
}

ফাইল: টেস্ট

উদ্দেশ্য: একটি সলিউশনের সঠিকতা যাচাই করা।

উপস্থিতি: আবশ্যিক

  • কোডটি যতটা সম্ভব সহজ হওয়া উচিত।
  • কেবল অনুশীলনীর পূর্বশর্তে (আর তাদের পূর্বশর্তে, এভাবে চলতে থাকবে) চালু করা ভাষার ফিচারগুলো ব্যবহার করুন।
  • ব্রাউজারে কোডিং করার সময় টেস্ট ফাইলটি শিক্ষার্থীকে দেখানো হয় এবং CLI ব্যবহার করার সময় শিক্ষার্থীর ফাইল সিস্টেমে ডাউনলোড করা হয়।
  • Exercism চায় প্র্যাকটিস অনুশীলনীগুলো Test Driven Development-এর মাধ্যমে সম্পন্ন হোক। এটি অর্জনের জন্য দুটি উপায় আছে:
    • টেস্ট রানারকে ফাইলে সংজ্ঞায়িত ক্রমে টেস্ট চালাতে হবে এবং টেস্ট স্যুটকে প্রথম ব্যর্থতাতেই থেমে যেতে হবে; অথবা
    • প্রথম টেস্ট ছাড়া বাকি সব টেস্ট ডিফল্টভাবে স্কিপ করা উচিত।
  • টেস্ট ফাইলের আপেক্ষিক পাথ .meta/config.json ফাইলের "files.test" কী-তে উল্লেখ করতে হবে।

উদাহরণ

using Xunit;

public class IsogramTest
{
    [Fact]
    public void Empty_string() =>
        Assert.True(Isogram.IsIsogram(""));

    [Fact(Skip = "Remove this Skip property to run this test")]
    public void Isogram_with_only_lower_case_characters() =>
        Assert.True(Isogram.IsIsogram("isogram"));

    [Fact(Skip = "Remove this Skip property to run this test")]
    public void Word_with_one_duplicated_character() =>
        Assert.False(Isogram.IsIsogram("eleven"));
}

ফাইল: উদাহরণ ইমপ্লিমেন্টেশন

উদ্দেশ্য: এমন একটি উদাহরণ ইমপ্লিমেন্টেশন দেওয়া যা সব টেস্ট পাস করে।

উপস্থিতি: আবশ্যিক

  • এই ইমপ্লিমেন্টেশন দিয়ে যাচাই করা হয় যে টেস্ট পাস করে এমন একটি ইমপ্লিমেন্টেশন আছে। এটি ইচ্ছাকৃতভাবেই সেই লক্ষ্য কোড নয় যা আমরা শিক্ষার্থীর কাছ থেকে আশা করি।
  • প্রতিটি ট্র্যাকের উচিত তাদের Continuous Integration সেটআপে যাচাই করা যে উদাহরণ ইমপ্লিমেন্টেশনটি টেস্ট পাস করে।
  • মেন্টরদের এই কোডটি দেখানো হবে না।
  • ব্রাউজারে কোডিং করার সময় শিক্ষার্থীকে উদাহরণ ফাইলটি দেখানো হয় না এবং CLI ব্যবহার করার সময় শিক্ষার্থীর ফাইল সিস্টেমে ডাউনলোডও করা হয় না।
  • উদাহরণ ইমপ্লিমেন্টেশন ফাইলের আপেক্ষিক পাথ .meta/config.json ফাইলের "files.example" কী-তে উল্লেখ করতে হবে।

উদাহরণ

using System.Linq;

public static class Isogram
{
    public static bool IsIsogram(string word)
    {
        var lowerCaseLetters = word.ToLower().Where(char.IsLetter).ToList();
        return lowerCaseLetters.Distinct().Count() == lowerCaseLetters.Count;
    }
}

ফাইল: অতিরিক্ত ফাইল

উদ্দেশ্য: টেস্ট চালানোর জন্য প্রয়োজনীয় অতিরিক্ত প্রজেক্ট, বিল্ড বা সহায়ক ফাইল।

উপস্থিতি: টেস্ট চালানোর জন্য ডিফল্ট ফাইল যথেষ্ট না হলে আবশ্যিক

কিছু ভাষায় টেস্ট চালানোর জন্য অতিরিক্ত ফাইল লাগে। এর উদাহরণ হলো C#-এর প্রজেক্ট ফাইল এবং Node-এর package.json ফাইল, যা ছাড়া টেস্ট চালানো সম্ভব হবে না।

শেয়ার্ড ফাইল

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

প্রেজেন্টেশন

ব্রাউজার-এডিটর ব্যবহার করার সময় আর CLI ব্যবহার করার সময় অনুশীলনীর ডকুমেন্টেশন শিক্ষার্থীকে যেভাবে দেখানো হয়, তাতে পার্থক্য আছে। আরও তথ্যের জন্য এই ডকুমেন্টটি দেখুন।

আইকন

প্রতিটি অনুশীলনীর একটি সঙ্গে থাকা আইকন থাকে। ডিফল্টভাবে যে আইকনটি দেখানো হয় তার নাম অনুশীলনীর স্লাগের সাথে মেলে। অনুশীলনীর .meta/config.json ফাইলে icon প্রপার্টি উল্লেখ করে এটি বদলানো যায়।

আপনি যদি problem-specifications মেটাডেটা থেকে কোনো অনুশীলনী বাস্তবায়ন করেন, তবে সম্ভবত সেই অনুশীলনীর জন্য আগেই একটি আইকন আছে। না থাকলে, অনুগ্রহ করে website-icons রিপোতে একটি ইস্যু খুলুন।