প্রকাশিত: 2025-09-08

গ্রিড থেকে কোড: কেন সুদোকু ফাংশনাল প্রোগ্রামিংয়ের জন্য আদর্শ প্রবেশদ্বার

জ্যামিতিক আকৃতি আলোতে মিশে গেল, যা কোডিং-এর পরিচ্ছন্নতা নির্দেশ করে।

সুডোকুকে একটি ক্লাসিক লজিক পাজল হিসেবে বিস্তৃতভাবে স্বীকৃতি দেওয়া হলেও, অনেক প্রোগ্রামারের জন্য এর সংখ্যার গ্রিডের নিচে একটি লুকায়িত স্তর রয়েছে। অধিকাংশ উত্সাহী যখন ডিজিট পূর্ণ করার অপেক্ষায় থাকা ৮১টি কোষ দেখেন, তখন ডেভেলপরা প্রায়শই একটি নিখুঁত বাস্তবায়ন চ্যালেঞ্জ দেখেন: একটি কনস্ট্রেইন্ট স্যাটিসফ্যাকশন সমস্যা যা ফাংশনাল প্রোগ্রামিং (FP)-এর পরামর্শকে সুন্দরভাবে ম্যাপ করে। সুডোকু এবং FP-এর ছেদবিন্দু ডেটা কীভাবে পরিবর্তনশীল অবস্থার (mutable state) ওভারহেড ছাড়াই শুদ্ধ রূপান্তরের মধ্য দিয়ে প্রবাহিত হতে পারে, তা বোঝার একটি স্পষ্ট উপায় প্রদান করে।

এই নিবন্ধে, আমরা আবিষ্কার করব কেন সুডোকু ফাংশনাল ধারণার জন্য একটি আদর্শ starting পয়েন্ট হিসেবে কাজ করে। আমরা দেখব কীভাবে অপরিবর্তনীয় ডেটা স্ট্রাকচার, পুনরাবৃত্তি (recursion), এবং প্যাটার্ন ম্যাচিং জটিল লজিক্যাল পাজলের জন্য চমৎকার সমাধান তৈরি করে। আপনি FP-এর অনুশীলনকারী হোন বা আপনার প্রিয় অবসরের গাণিতিক ভিত্তি নিয়ে কেবল কৌতূহলী হোন, এই সংযোগটি অ্যালগোরিদমিক ডিজাইনের পিছনের কাঠামো প্রকাশ করে।

অপরিবর্তনীয় বোর্ড: ডেটা হিসেবে গঠন

রুটিন নির্দেশমূলক প্রোগ্রামিংয়ে, একটি সুডোকু গ্রিড সমাধান করতে প্রায়শই অ্যারের অবস্থা পরিবর্তন (mutating) জড়িত থাকে। আপনি একটি সংখ্যা খুঁজে পান, এটি স্থাপন করেন, মেমোরি লোকেশন আপডেট করেন এবং পরবর্তী ধাপে চলে যান। ফাংশনাল প্রোগ্রামিংয়ে, আমরা সম্পূর্ণভাবে মিউটেশন এড়িয়ে চলি। বিদ্যমান বোর্ড পরিবর্তনের পরিবর্তে, আমরা একটি নতুন সংস্করণ তৈরি করি যেখানে আপডেটটি প্রয়োগ করা হয়েছে।

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

পুনরাবৃত্তি: লজিকের স্বাভাবিক প্রবাহ

সুডোকুর সমস্যাগুলি প্রকৃতিগতভাবে পুনরাবৃত্তিমূলক। একটি কোষ সমাধান করতে, আপনাকে নিশ্চিত করতে হবে যে এটি এর সারি, কলাম এবং ৩x৩ বক্সের সাপেক্ষে কনস্ট্রেইন্টগুলি সিদ্ধ করে। যদি কোনো সংখ্যা কাজ না করে, তবে আপনাকে পূর্ববর্তী সিদ্ধান্ত বিন্দুতে ফিরে যেতে হবে।

FP-এ, আমরা for বা while এর মতো লুপ বিরলভাবে ব্যবহার করি। এর পরিবর্তে, আমরা পুনরাবৃত্তির ওপর নির্ভর করি, যেখানে একটি ফাংশন একই সমস্যার ছোট সংস্করণগুলি সমাধান করতে নিজেকে কল করে। বাइनরি সুডোকু (যা তাকুজু নামেও পরিচিত) এর কৌশলটি বিবেচনা করুন, যেখানে আপনাকে শূন্য এবং এক দিয়ে একটি গ্রিড পূর্ণ করতে হয়। লজিক আরও কঠোর: জোড়া আকারের গ্রিডে, প্রতিটি সারিতে সমান সংখ্যক 0 এবং 1 থাকতে হবে, এবং কোনো তিনটি পরপর কোষ হুবহু এক হতে পারবে না। বাइनরি সুডোকু এর জন্য একটি সলভার হালাস্কালে বা এর্লাঙ্গে লিখলে প্রায়শই এমন কোড পাওয়া যায় যা গাণিতিক প্রমাণের মতো পড়া যায়। বেস কেসটি হল একটি সম্পূর্ণ পূর্ণ গ্রিড (সমাধানকৃত), এবং পুনরাবৃত্তিমূলক ধাপটি যুক্তিসঙ্গত নিয়ম প্রয়োগ করে পরবর্তী খালি কোষের সম্ভাবনাগুলো কমিয়ে আনে অবস্থাটি একটি বৈধ সমাধানে অভিসারী না হওয়া পর্যন্ত।

কনস্ট্রেইন্ট প্রোপাগেশন: ফিল্টার এবং ম্যাপ

সুডোকু সমাধানের সবচেয়ে শক্তিশালী কৌশলগুলির একটি হল "কনস্ট্রেইন্ট প্রোপাগেশন"—যদি আপনি জানেন যে '৩' সারি ১-এ থাকতে পারে না, তবে এটি অন্যত্র স্থাপিত হতে হবে। ফাংশনাল প্রোগ্রামিংয়ে, এটি তালিকাগুলিতে সরাসরি filter এবং map অপারেশনের সাথে ম্যাপ হয়।

কল্পনা করুন প্রতিটি কোষে একটি একক সংখ্যা না থাকে, কিন্তু সম্ভাব্য প্রার্থীদের তালিকা থাকে (যেমন: [1, 2, 3, 4, 5, 6, 7, 8, 9])। আপনি যখন বোর্ড স্ক্যান করেন, তখন আপনি ফাংশনাল পাইপলাইন ব্যবহার করে অসম্ভব প্রার্থীদের সরিয়ে দেন। যখন আপনি একটি কোষ খুঁজে পান যেখানে কেবল একজন প্রার্থী থাকে, সেই সংখ্যাটি তার সহযোগীদের কাছে প্রোপাগেট হয়।

এই প্রক্রিয়াটি একটি ট্রান্সফরমেশন পাইপলাইন হিসেবে মডেল করা যেতে পারে:

  • Map: প্রতিটি খালি কোষের জন্য আদিম সম্ভাবনাগুলি তৈরি করতে একটি ফাংশন প্রয়োগ করুন।
  • Filter: ছেদকৃত সারি, কলাম বা বক্সে ইতিমধ্যে উপস্থিত মানগুলি সরান।
  • Reduce: কোনো কোষ একটি "সিঙ্গেলটন" অবস্থা (কেবল একজন প্রার্থী)তে পৌঁছেছে কিনা তা পরীক্ষা করতে এই কনস্ট্রেইন্টগুলি একত্রিত করুন।

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

প্যাটার্ন ম্যাচিং: শর্তের চেয়ে স্বচ্ছতা

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

"মান 1 কি? এটি কি 2?" জিজ্ঞাসা করার পরিবর্তে, আপনি ডেটার আকৃতির সাথে ম্যাচ করেন। উদাহরণস্বরূপ, একটি 3x৩ বক্স বিশ্লেষণ করার সময়, আপনি নয়টি আইটেমের তালিকার বিরুদ্ধে প্যাটার্ন ম্যাচ করতে পারেন। যদি একটি আইটেম '0' (একটি খালি জায়গা প্রতিনিধিত্ব করে) এবং আটটি পরিচিত সংখ্যা হয়, তবে প্যাটার্নটি সাথে সাথে ম্যাচ করে, জটিল লুপ কাউন্টার ছাড়াই একটি "নেইকেড সিঙ্গেল" প্রার্থীকে চিহ্নিত করে।

কিলার সুডোকুর সাথে কাজ করার সময় এই কৌশলটি উজ্জ্বলভাবে দেখা যায়। কিলার সুডোকু-তে, আপনি "সিজ" এর সাথেDeal করেন—কোষের গোষ্ঠী যা অনন্য সংখ্যা ব্যবহার করে একটি নির্দিষ্ট লক্ষ্য মানের সমষ্টি করতে হবে। একটি ফাংশনাল দৃষ্টিভঙ্গি কিলার গঠনের উপর প্যাটার্ন ম্যাচিং ব্যবহার করে এগুলোকে গ্রিডের বাকি অংশ থেকে আলাদা করে, কেবল সেই নির্দিষ্ট কোষগুলির টুপলগুলিতে সমষ্টি লজিক প্রয়োগ করে।

ফাংশনাল কম্পোজিশনের সাথে সহজ পাজল সমাধান

FP-এর সৌন্দর্য হল কম্পোজিশন, জটিল আচরণ তৈরি করতে ছোট, শুদ্ধ ফাংশনগুলিকে একত্রিত করা। একটি সহজ সুডোকু পাজল সমাধানকে কম্পোজড ফাংশনের একটি ক্রম হিসেবে দেখা যেতে পারে:

  1. findEmptyCell(board): প্রথম শূন্যের স্থানাঙ্ক ফেরত দেয়।
  2. getValidCandidates(board, x, y): অনুমোদিত সংখ্যার একটি তালিকা ফেরত দেয়।
  3. applyMove(board, x, y, number): মুভটি প্রয়োগ করে একটি নতুন বোর্ড ফেরত দেয়।

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

মোনাদ: অনিশ্চয়তা পরিচালনা

পাজল যত কঠিন হয়, সহজ ফিল্টারিং পর্যাপ্ত নয়। আমাদের একটি সংখ্যা চেষ্টা করতে হবে, পরীক্ষা করতে হবে যে এটি কি একটি সমাধানের দিকে নিয়ে যায় এবং না হলে অন্যটি চেষ্টা করুন। এটি "ননডেটারমিনিজম" তৈরি করে। ফাংশনাল প্রোগ্রামিংয়ে, এটি প্রায়শই মোনাদস ব্যবহার করে (বিশেষ করে হালাস্কালে লিস্ট মোনাদ বা অন্যান্য ভাষায় অনুরূপ কাঠামো) পরিচালিত হয়।

একটি মোনাদ আপনাকে এমন অপারেশনগুলিকে ক্রমবদ্ধ করার অনুমতি দেতে যা ব্যর্থ হতে পারে বা একাধিক ফলাফল থাকতে পারে স্পষ্ট ত্রুটি পরিচালনা ছাড়া। যখন আপনি solve(board) কল করেন, তখন ফাংশনটি কেবল একটি বোর্ড ফেরত দেয় না; এটি সম্ভাব্য বোর্ডগুলির একটি "কন্টেইনার" ফেরত দেয়। যদি ভেতরের লজিকটি একটি বিরোধ খুঁজে পায়, তবে গণনার সেই শাখাটি বন্ধ হয়ে যায়, যখন বৈধ শাখাগুলো অন্বেষণ চালিয়ে যায়।

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

করে শেখা: সুডোকু কোড কেন?

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

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

উপসংহার

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

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

Play Qoki on mobile

Prefer to play offline? Get the app.