প্র্যাকটিস অনুশীলনী হলো এমন অনুশীলনী যা শিক্ষার্থীদের যেকোনো সমস্যা সমাধান করার সুযোগ দেয়, যার উদ্দেশ্য হলো তারা এতদিন যে কনসেপ্টগুলো শিখেছে সেগুলো কাজে লাগাতে পারবে।
একটি ট্র্যাকে নিজের প্রথম প্র্যাকটিস অনুশীলনী যোগ করতে আগ্রহী? প্র্যাকটিস অনুশীলনী যোগ করার ডকুমেন্টেশন দেখুন অথবা আমাদের ওয়াকথ্রু ভিডিওটি দেখুন 👇
ট্র্যাকের রুট ডিরেক্টরি থেকে নিচের কমান্ডগুলো চালিয়ে আপনি দ্রুত একটি নতুন প্র্যাকটিস অনুশীলনীর কাঠামো তৈরি করতে পারেন:
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
}
]
}
}
practicespractices কী-তে সেই কনসেপ্টগুলোর স্লাগের তালিকা থাকা উচিত, যেগুলো এই প্র্যাকটিস অনুশীলনীটি একজন শিক্ষার্থীকে সক্রিয়ভাবে চর্চা করার সুযোগ দেয়।
strings)। সেক্ষেত্রে আমরা এমন কয়েকটি ভালো অনুশীলনী বেছে নেওয়ার পরামর্শ দিই, যেগুলো মানুষকে মজার উপায়ে সেই কনসেপ্টগুলো নিয়ে ভাবতে বাধ্য করে। যেমন, যেসব অনুশীলনীতে UTF-8, স্ট্রিং কনক্যাটেনেশন, char এনুমারেশন ইত্যাদির প্রয়োজন হয়, সেগুলো সবই ভালো উদাহরণ হতে পারে।prerequisitesprerequisites কী-তে সেই কনসেপ্টগুলোর তালিকা থাকে, যা একজন শিক্ষার্থীকে এই প্র্যাকটিস অনুশীলনীটি পাওয়ার জন্য আগে শেষ করতে হবে।
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
উদ্দেশ্য: অনুশীলনীর ডিজাইন বর্ণনা করা।
উপস্থিতি: ঐচ্ছিক
এই ফাইলে অনুশীলনীর ডিজাইন সম্পর্কিত তথ্য থাকে, যার মধ্যে রয়েছে এর লক্ষ্য, শেখানোর লক্ষ্য, কী শেখানো উচিত নয় ইত্যাদি।
এটি ভবিষ্যতের মেইনটেইনার বা কনট্রিবিউটরদের অনুশীলনীর পরিধি ও সীমাবদ্ধতা সম্পর্কে জানানোর জন্য থাকে, যাতে সময়ের সাথে অনুশীলনীগুলো আরও জটিল হয়ে ওঠার স্বাভাবিক প্রবণতা এড়ানো যায়।
# 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: এই অনুশীলনীতে ব্যবহৃত ফাইলগুলোর অবস্থান, অনুশীলনীর ডিরেক্টরির সাপেক্ষে (আবশ্যিক)
solution: স্টাব ইমপ্লিমেন্টেশন ফাইল (আবশ্যিক)test: টেস্ট ফাইল (আবশ্যিক)example: উদাহরণ ইমপ্লিমেন্টেশন ফাইল (আবশ্যিক)editor: এডিটরে রিড-অনলি হিসেবে দেখানো অতিরিক্ত ফাইল (ঐচ্ছিক)invalidator: যে ফাইলগুলো বদলালে একটি সলিউশন পুরোনো হয়ে যায় (ঐচ্ছিক)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 একটি মুক্ত-ফরম্যাট স্ট্রিং, যা ট্র্যাকগুলো নিজের মতো ব্যবহার ও ব্যাখ্যা করতে পারে।উদ্দেশ্য: কোন টেস্টগুলো বাস্তবায়ন করা হয়েছে তার তথ্য ধারণ করা।
উপস্থিতি: ঐচ্ছিক
অনুশীলনীর 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 | - |
উদ্দেশ্য: শিক্ষার্থীদের জন্য শুরুর একটি বিন্দু তৈরি করা।
উপস্থিতি: আবশ্যিক
.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.");
}
}
উদ্দেশ্য: একটি সলিউশনের সঠিকতা যাচাই করা।
উপস্থিতি: আবশ্যিক
.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"));
}
উদ্দেশ্য: এমন একটি উদাহরণ ইমপ্লিমেন্টেশন দেওয়া যা সব টেস্ট পাস করে।
উপস্থিতি: আবশ্যিক
.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 রিপোতে একটি ইস্যু খুলুন।