স্ট্রিং-এর ভেতর স্ট্রিং (সাবস্ট্রিং) – প্রোগ্রামিং ইন্টারভিউ সমস্যা ৭

সমস্যাঃ দুটি স্ট্রিং দেওয়া আছে – A ও s. একটি ফাংশন লিখতে হবে, যার কাজ হচ্ছে, s যদি A-এর সাবস্ট্রিং হয়, তাহলে A-এর যেই ইনডেক্স থেকে s শুরু হয়েছে, সেই ইনডেক্স রিটার্ন করতে হবে। আর s যদি A-তে না থাকে, তাহলে -1 রিটার্ন করতে হবে।

সমাধানঃ প্রশ্নটা খুবই সহজ, তাই অনেকেই সরাসরি কোড লেখা শুরু করে দিবে। ইন্টারভিউতে এমন করলে কিন্তু হবে না। কারণ রিকোয়ারমেন্ট আরো পরিষ্কার করে নিতে হবে। যেমন, s যদি খালি স্ট্রিং হয়, তখন কী হবে? s যদি A-তে একাধিকবার থাকে, তখন কী হবে? – এসব প্রশ্নের উত্তর কোড লেখার আগেই জেনে নিতে হবে।

যারা পাইথন ব্যবহার করে অভ্যস্ত, তারা সহজেই কোড লিখে ফেলতে পারবে –

def string_search(A, s):
  if s in A:
    return A.index(s)
  else:
    return -1

খুবই সহজ কোড। তবে কেউ যদি বলে যে সে পাইথনে অভিজ্ঞ, তাহলে হয়ত তাকে ইন্টারভিউয়ার বলবেন যে, ফাংশনের ভেতরে এক লাইনে কোড লিখে ফেলতে। তখন কোড হবে এরকম –

def string_search(A, s):
  return A.index(s) if s in A else -1

এরপর ইন্টারভিউয়ার হয়ত বলবেন যে, index ফাংশন ব্যবহার করা যাবে না, আমি আসলে দেখতে চাইছি, আপনি এই ফাংশনটা নিজে তৈরি করতে পারেন কী না। তখন একটু চিন্তাভাবনা করে কোড লিখে ফেলতে হবে। আমার ধারণা আমার ব্লগের ৮০% পাঠকেরই এটা লিখতে দশ মিনিটের কম সময় লাগবে। আমি কোড লিখে দিচ্ছি –

if s == "" or A == "" or len(s) > len(A):
  return -1

lenA, lenS = len(A), len(s)

for i in range(lenA):
  if A[i] == s[0]:
    j, k = i, 0
    
    while j < lenA and k < lenS and A[j] == s[k]:
      j += 1
      k += 1

    if k == lenS:
      return i
    
return -1

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

বি.দ্র. ইউনিট টেস্ট নিয়ে আমি আগে একটি আর্টিকেল লিখেছি।

নোটঃ কোনো কোনো ইন্টারভিউয়ার এই প্রশ্নের উত্তরে আরো ইফিশিয়েন্ট অ্যালগরিদম ব্যবহার করতে পরামর্শ দেবেন। সেক্ষেত্রে রবিন-কার্প স্ট্রিং ম্যাচিং, অথবা কেএমপি (নুথ-মরিস-প্র্যাট) অ্যালগরিদম ব্যবহার করতে হবে।

ত্রিভুজ গণনা – প্রোগ্রামিং ইন্টারভিউ সমস্যা ৪

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

সমাধানঃ সমস্যাটি নিয়ে চিন্তা করার শুরুতেই একটি বিষয় মাথায় চলে আসবে, “ত্রিভুজের যেকোনো দুই বাহুর সমষ্টি তৃতীয় বাহু অপেক্ষা বৃহত্তর।” এই বিষয়টি কাজে লাগিয়ে আমরা সমস্যাটির সমাধান করতে পারি। আমাদের মূল কোড হবে নিচের মতো –

count = 0
for i in range(0, n-2):
    for j in range(i+1, n-1):
        for k in range(j+1, n):
            if A[i] + A[j] > A[k]:
                count += 1

ইন্টারভিউতে অবশ্য একটি ফাংশন তৈরি করে তার ভেতরে মূল কোড লেখা উচিত, আমি সেটি আর দেখালাম না। এখন প্রশ্ন হচ্ছে, এই সমাধানের কমপ্লেক্সিটি কত? O(n^3)। এখন ইন্টারভিউয়ার জানতে চাইবেন, এর চেয়ে ভালোভাবে সমাধান করা সম্ভব কী না, এবং সম্ভব হলে চেষ্টা করতে।

ধরা যাক, মূল অ্যারেতে দেওয়া আছে 1, 1, 2, 3, 4। এখানে প্রতিবার তিনটি করে সংখ্যা নিলে আমরা পাই –

1, 1, 2
1, 1, 3
1, 1, 4
1, 2, 3
1, 2, 4
1, 3, 4
1, 2, 3
1, 2, 4
1, 3, 4
2, 3, 4

এগুলোর মধ্যে, কেবল 2, 3, 4 যখন একটি ত্রিভুজের বাহুর দৈর্ঘ্য হবে, তখন একটি ত্রিভুজ তৈরি করা যাবে। কারণ, 2 + 3  > 4। বাকীগুলোর জন্য a + b > c সত্য নয় (এখানে a, b, c হচ্ছে যথাক্রমে ত্রিভুজের প্রথম, দ্বিতীয় ও তৃতীয় বাহু)। আর সংখ্যাগুলো যেহেতু ছোট থেকে বড় ক্রমে সাজানো, তাই a + b > c পরীক্ষা করলেই হবে, b + c > a, c + a > b এগুলো পরীক্ষা করার দরকার নেই।

এখন প্রশ্ন হচ্ছে, আমাদেরকে যেই অ্যারে দেওয়া আছে, সেটিতো ছোট থেকে বড় ক্রমে সাজানো নেই। তাই প্রথমে আমরা সেটি সর্ট করে নেবো। এই কাজটি করার কমপ্লেক্সিটি হচ্ছে O(n log n), যা O(n^3)-এর চেয়ে অনেক ছোটো। তাহলে প্রথমে আমরা অ্যারেটি সর্ট করে নেবো।

ধরা যাক, অ্যারে A-তে আছে দশটি সংখ্যা – 10, 11, 12, 13, 14, 15, 16, 20, 21, 22। এখন, i-এর মান 0, j-এর মান 1 হলে, k-এর মান 2 থেকে 7 পর্যন্ত প্রতিটির জন্যই A[i] + A[j] > A[k] শর্তটি সত্য হবে, অর্থাৎ A[i], A[j], A[k] ত্রিভুজের তিনটি বাহু হিসেবে ব্যবহার করা যাবে। আর মোট ত্রিভুজ কয়টি হবে? 7 – 1 বা 6টি।

এখন, i-এর মান 0, j-এর মান 2 এর জন্য কিন্তু আর k-এর মান 2 থেকে পরীক্ষা করার দরকার নেই, কারণ k-এর মান 7 পর্যন্ত অবশ্যই A[i] + A[j] > A[k] সত্য হবে, কারণ A[0] + A[1] এর মান অবশ্যই A[0] + A[2] এর মানের  চেয়ে ছোট বা সমান। তাই আমরা k-এর মান আগের চেয়ে এক এক করে বাড়িয়ে পরীক্ষা করবো।

তাহলে, i-এর যেকোনো মানের জন্য, j-এর মান i+1 এবং k-এর মান i+2 থেকে আমরা লুপ শুরু করবো। আর j-এর মান যখন বাড়বে, তখন কিন্তু আবার k-এর মান i+2 থেকে শুরু করবো না, বরং আগে k-এর মান যা ছিল, সেখান থেকেই শুরু হবে।

count = 0
for i in range(n - 2):
    k = i + 2
    for j in range(i + 1, n - 1):
        while k < n and A[i] + A[j] > A[k]:
            k += 1
        count = count + k - j - 1

ওপরের কোড-এর কমপ্লেক্সিটি কত? যারা একটু কম চিন্তা করবে, তারা হুট করে বলে দিবে O(n^3), কারণ তিনটি নেস্টেড লুপ আছে। কিন্তু একটু ভালোভাবে লক্ষ করলে দেখা যাবে যে, j-এর লুপের জন্য ভেতরের লুপটি আর নতুন করে শুরু হচ্ছে না, k-এর আগের মান থেকেই শুরু হচ্ছে। না বুঝলে খাতা কলম নিয়ে বসতে হবে। তাই সবচেয়ে বাইরের লুপ (i-এর লুপ)-এর জন্য ভেতরে j ও k-এর লুপ প্রতিটি সর্বোচ্চ n সংখ্যকবার চলবে (মোট, n + n = 2n)। তাই কমপ্লেক্সিটি হচ্ছে, n * 2n, বা 2 * n^2, বা, O(n^2).

কেউ চাইলে নিচের যেকোনো একটি সমস্যা সমাধানের চেষ্টা করতে পারে

1) https://leetcode.com/problems/valid-triangle-number/

2) https://www.interviewbit.com/problems/counting-triangles

স্ট্যাক দিয়ে কিউ তৈরি – প্রোগ্রামিং ইন্টারভিউ সমস্যা ৩

সমস্যাঃ স্ট্যাক (Stack) ব্যবহার করে কিউ (Queue) তৈরি করতে হবে, অর্থাৎ কিউ এর এনকিউ (enqueue) ও ডিকিউ (dequeue) ফাংশন তৈরি করতে হবে।

সমাধানঃ প্রথমে একটু চিন্তা করলেই আমরা বুঝতে পারবো যে একটি স্ট্যাক দিয়ে আসলে একটি কিউ তৈরি করা সম্ভব নয়। যদি সম্ভব হতো, তাহলে এই দুটি আলাদা ডেটা স্ট্রাকচার হতো না। কিন্তু যেহেতু সমস্যা দেওয়া হয়েছে, সমাধান নিশ্চয়ই আছে। সমাধান হচ্ছে, দুটি স্ট্যাক ব্যবহার করা।

নোটঃ স্ট্যাক ও কিউ নিয়ে আমি বিস্তারিত আলোচনা করেছি, কম্পিউটার প্রোগ্রামিং ৩য় খণ্ড – ডেটা স্ট্রাকচার ও অ্যালগরিদম পরিচিতি এবং পাইথন দিয়ে প্রোগ্রামিং শেখা ৩য় খণ্ড – ডেটা স্ট্রাকচার ও অ্যালগরিদম পরিচিতি বইতে। এছাড়া ইউটিউবেও এ বিষয়ে আলোচনা  করেছি ডেটা স্ট্রাকচার ও অ্যালগরিদম প্লেলিস্টে

ধরা যাক, কিউতে প্রথমে আমি পাঁচটি সংখ্যা রাখতে চাই, অর্থাৎ enqueue অপারেশন হবে পাঁচবার এবং সংখ্যাগুলো হচ্ছে – 1, 2, 3, 4, 5. আমি এগুলো প্রথম স্ট্যাকে পুশ (push) করব।

এখন আমি চাই, কিউ থেকে প্রথম তিনটি সংখ্যা সরিয়ে ফেলতে, অর্থাৎ তিনবার dequeue অপারেশন হবে। তাহলে কিউ থেকে যথাক্রমে 1, 2, 3 – এই তিনটি সংখ্যা চলে যাবে। কিন্তু স্ট্যাক থেকে তো কেবল ওপরের সংখ্যাটি সরানো যায়। তাহলে, আমি প্রথম স্ট্যাকের সবগুলো সংখ্যা দ্বিতীয় স্ট্যাকে নিয়ে আসব। তখন স্ট্যাকগুলোর অবস্থা হবে নিচের ছবির মতো –

এখন আমি দ্বিতীয় স্ট্যাকে তিনবার পপ (pop) অপারেশন চালালে 1, 2, 3 স্ট্যাক থেকে চলে যাবে। তখন স্ট্যাকদুটির অবস্থা হবে নিচের ছবির মতো –

এখন আমি কিউতে 6 ও 7 ক্রমানুসারে রাখতে চাই। আমি সেগুলো প্রথম স্ট্যাকে পুশ করবো।

এখন কিউ-এর অবস্থা হচ্ছে এমন: 4, 5, 6, 7. আমি যদি কিউ থেকে তিনটি সংখ্যা সরিয়ে নিই (অর্থাৎ তিনবার ডিকিউ করি), সেগুলো হবে, যথাক্রমে 4, 5, 6। ডিকিউ করার জন্য আমি প্রথমে দেখবো যে দ্বিতীয় স্ট্যাকে কিছু আছে কী না। যদি থাকে, সেই স্ট্যাক থেকে পপ করবো। আর যদি stack2 খালি থাকে, তাহলে Stack1-এর সব কিছু Stack2-তে নিয়ে আসবো (তখন দ্বিতীয় স্ট্যাকে সেগুলো প্রথম স্ট্যাকের বিপরীত ক্রমে থাকবে)। তারপরে দ্বিতীয় স্ট্যাক থেকে পপ করবো।

আশা করি, সমাধানটি নিজের পছন্দমতো প্রোগ্রামিং ভাষায় ইমপ্লিমেন্ট করতে সমস্যা হবে না। সমাধান সঠিক হলো কী না, তা যাচাই করার জন্য নিচের যেকোনো একটি লিঙ্কে গিয়ে সমাধান জমা দিলেই হবে –

প্রোগ্রামিং ল্যাঙ্গুয়েজ

কেউ কেউ মাঝে-মধ্যে আমাকে এরকম প্রশ্ন করে, ভাই আপনি কোন প্রোগ্রামিং ল্যাঙ্গুয়েজ ব্যবহার করেন? বা কোন কোন ল্যাঙ্গুয়েজে কাজ করেন? এরকম প্রশ্নের একটা উদ্দেশ্য হচ্ছে আমার কাছ থেকে গাইডলাইন পাওয়া যে কোন কোন প্রোগ্রামিং ল্যাঙ্গুয়েজ শেখা উচিত? তাই একটা বিস্তারিত উত্তর লিখছি।

আমি যখন কলেজে পড়তাম, তখন কিউ-বেসিক (Q Basic) নামে একটা প্রোগ্রামিং ল্যাঙ্গুয়েজ শেখার ব্যর্থ চেষ্টা করেছিলাম। কিউ-বেসিক ল্যাঙ্গুয়েজটা আমাদের সিলেবাসে ছিল আর কী। এইচএসসি পরীক্ষার পরে কম্পিউটার কিনি, তখন এইচটিএমএল (HTML) শিখলাম কিছুটা, যদিও এটা ঠিক প্রোগ্রামিং ল্যাঙ্গুয়েজ না। তারপরে ২০০১ সালের শুরু থেকে সি (C) শেখা শুরু করি। আমাদের ভার্সিটির ক্লাস শুরু হয় ২০০১ সালের মে মাসে, আর ততদিনে সি এর বেসিক কিছুটা শেখা হয়েছে। আমি আমার বাকী ভার্সিটি-জীবন এর সুবিধা ভোগ করি। আমার যদি ভার্সিটির সি কোর্সের ক্লাশ থেকে সি শেখা লাগতো, তাহলে একটু অসুবিধাই হতো হয়ত, যেটা আমার অনেক ক্লাসমেটকে দেখে বুঝতে পেরেছি। সি শেখার সময় প্রথম বছরে ৩-৪টা বই কিনেছিলাম, যদিও সবগুলো বই শুরু থেকে শেষ পর্যন্ত পড়ি নাই। এক বছর সি শেখার পরে আমি হার্বার্ট শিল্ডের টিচ ইয়োরসেল্ফ সি প্লাস প্লাস বইটা পড়ি। কিন্তু এরপরে আর আমার সি প্লাস প্লাস (C++) চর্চা করা হয় নাই।

ভার্সিটির ফার্স্ট ইয়ারে একটা ছোট প্রজেক্ট করতে হয়েছিল, যেখানে এইচটিএমএল-এর পাশাপাশি একটু জাভাস্ক্রিপ্টও (Javascript) ব্যবহার করতে হয়েছিল। সেই ২০০২ সালের শুরুর দিকের ঘটনা। অল্প একটু জাভাস্ক্রিপ্ট শিখেছিলাম। আমার ইচ্ছা ছিল আমার এক বন্ধুকে দিয়ে প্রজেক্টটা করিয়ে ফেলবো। তো ব্যাটা রাত ২টার দিকে ঘুমিয়ে গেল, আমি চারটা পর্যন্ত অপেক্ষা করলাম। কারণ ওইদিনই প্রজেক্ট জমা দিতে হবে। চারটার পরে আমি আর কোনো উপায় না দেখে নিজেই কাজ করতে বসে গেলাম এবং শেষ পর্যন্ত কাজটা করেও ফেললাম। এরপরেও মাঝে মাঝে জাভাস্ক্রিপ্ট ব্যবহার করতে হয়েছিল, কিন্তু তেমন ভালোভাবে শেখা হয় নাই। আর গত চার-পাঁচ বছরে জাভাস্ক্রিপ্টে কিছুই করি নাই।

ভার্সিটির সেকেন্ড ইয়ারে অবজেক্ট ওরিয়েন্টেড কোর্স ছিল। সেই কোর্সে জাভা (Java) শিখি। আর তারপরের সেমিস্টারে একটা প্রজেক্টও করি জাভা ব্যবহার করে। তারপরে ২০০৬-২০০৭ সালে কিছু টুকটাক কাজ করতে জাভা ব্যবহার করেছিলাম।

সম্ভবত ফোর্থ ইয়ারে আমাদের মাইক্রোপ্রসেস কোর্স ছিল, সেই কোর্সের ল্যাবের জন্য এসেম্বলি ল্যাঙ্গুয়েজ (Assembly Language) শিখতে হয়েছিল।

আমার প্রথম প্রফেশনাল চাকরি ছিল টাইগার আইটি-তে, ২০০৭ সালের মাঝামাঝি। সেখানে আমি যেই প্রজেক্টে জয়েন করলাম, সেই প্রজেক্টে পার্ল (Perl) প্রোগ্রামিং ল্যাঙ্গুয়েজ ব্যবহার করতে হয়। কিন্তু আমি আগে কখনও এই ল্যাঙ্গুয়েজের নাম শুনি নাই। তাই বলে আমার কিন্তু চাকরি পেতে সমস্যা হয় নাই। কারণ ভালো কোম্পানীগুলো বেশি গুরুত্ব দেয় প্রবলেম সলভিং স্কিলের ওপর, প্রোগ্রামিং ল্যাঙ্গুয়েজ শেখার ওপর নয়।

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

তারপরে তিন বছর আমার নিজের কোম্পানী মুক্তসফট নিয়ে ব্যস্ত ছিলাম। সেখানে পিএইচপি, পার্ল, পাইথন (Python) – এসব ল্যাঙ্গুয়েজ ব্যবহার করেছি, যখন প্রোগ্রামিং করতে হয়েছে। জেকুয়েরি ব্যবহার করেও একটা প্রজেক্ট করেছিলাম। আসলে ক্লায়েন্ট যেই ল্যাঙ্গুয়েজ চাইতো, সেটাই ব্যবহার করতাম। আর ক্লায়েন্ট কিছু না বললে পাইথন। তারপরে দুই বছর একটা আমেরিকান কোম্পানীর কাজ করি, সেখানে আমি পাইথন ব্যবহার করার সিদ্ধান্ত নেই, কারণ পাইথনে কোড করতে ভালো লাগে এবং সময় কম লাগে।

২০১৫ সালের মাঝামাঝি আমি সিঙ্গাপুরের গ্র্যাব নামক কোম্পানীতে ইন্টারভিউ দেই। বেশ কয়েকটা ইন্টারভিউ হয় এবং সেখানে আমি সি ব্যবহার করি, প্রবলেম সলভ করার জন্য। ইন্টারভিউ শেষে অফার পেয়ে জয়েন করি। জয়েন করার পরে জানতে পারলাম যে এখানে গো (Go বা Golang) ব্যবহার করা হয়, তাই প্রথম কিছুদিন গো শিখি। লক্ষ্য করার বিষয় হচ্ছে এত বড় কোম্পানী এত বেতন দিয়ে অন্য দেশ থেকে ইঞ্জিনিয়ার হায়ার করছে, ওরা কিন্তু এই বিষয় নিয়ে মাথা ঘামায় নাই যে আমি গো পারি কী না। সুতরাং বোঝাই যাচ্ছে যে কয়টা প্রোগ্রামিং ল্যাঙ্গুয়েজ পারি, এটা আসলে বিবেচ্য বিষয় নয়। কম্পিউটার সায়েন্সের বেসিক জ্ঞান (ডাটা স্ট্রাকচার, অ্যালগরিদম, অপারেটিং সিস্টেম, ডাটাবেজ, অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং, নেটওয়ার্কিং ইত্যাদি) এবং প্রবলেম সলভিং স্কিল-ই একজন ভালো সফটওয়্যার ইঞ্জিনিয়ার হওয়ার পূর্বশর্ত। আর কাজ করতে করতে সফটওয়্যার ইঞ্জিনিয়ারিংটাও শেখা হয়ে যায়, তবে তার জন্য ভালো কোম্পানীতে কাজ করাটা জরুরী।

প্রোগ্রামিং চর্চার ১০টি অনলাইন জাজ

অনেক ওয়েবসাইট আছে, যেখানে অনেক প্রোগ্রামিং সমস্যা দেওয়া আছে এবং সেগুলোর সমাধান করে জমা দিলে স্বয়ংক্রিয়ভাবে সেটা জাজ করে জানিয়ে দেওয়া হয় যে সমাধানটি সঠিক হয়েছে কী না। প্রোগ্রামিং শিখতে যেহেতু চর্চা করাটা সবচেয়ে জরুরী, তাই অনলাইন জাজগুলো অনেক গুরুত্বপূর্ণ। এরকম ১০টি অনলাইন জাজ ওয়েবসাইটের লিঙ্ক দিয়ে দিচ্ছি, এর বাইরেও আরো অনেক আছে (সেগুলো এই আর্টিকেলের নিচে কমেন্ট করে জানিয়ে দিলে ভালো হবে)।

practice
practice

প্রোগ্রামিং চর্চার জন্য অনলাইন জাজ :

১) http://dimikoj.com: এখানে বাংলায় প্রোগ্রামিং সমস্যা দেওয়া আছে, যা প্রোগ্রামিংয়ে একেবারে যারা নতুন, তাদের জন্য ভালো।

২) http://lightoj.com : এটি তৈরি করেছেন বাংলাদেশের জানে আলম জান। এখানে অভিজ্ঞ প্রোগ্রামারদের সাথে সাথে বিগিনারদের জন্যও কিছু সমস্যা দেওয়া আছে।

৩) http://projecteuler.net : এখানে অনেক মজার সমস্যা আছে যেগুলোর বেশিরভাগই প্রোগ্রাম লিখে সমাধান করতে হয়। এখানে প্রোগ্রাম জমা দেওয়া লাগে না, কেবল প্রোগ্রাম দিয়ে বের করা উত্তরটা জমা দিতে হয়।

৪) http://ace.delos.com/usacogate : এটি যদিও আমেরিকার ইনফরমেটিক্স অলিম্পিয়াড ট্রেনিং প্রোগ্রাম, কিন্তু সাইটে যেকোনো দেশের প্রোগ্রামাররাই রেজিস্ট্রেশন করে অনুশীলন করতে পারে। তোমরা যারা প্রোগ্রামিং প্রতিযোগিতায় ভালো করতে চাও, তাদের অবশ্যই এখানে অনুশীলন করা উচিত।

৫) http://www.topcoder.com/tc : এখানেও নিয়মিত অনলাইন প্রোগ্রামিং প্রতিযোগিতা অনুষ্ঠিত হয়। এখানে ভালো ফলাফল করলে আবার টাকাও দেয় (কী আনন্দ!)। এ ছাড়া এখানে অনেক ভালো টিউটোরিয়াল ও আর্টিকেল আছে। এটি অভিজ্ঞ প্রোগ্রামারদের জন্য বেশ ভালো একটি সাইট।

৬) http://uva.onlinejudge.org : এই সাইটে নিয়মিত অনলাইন প্রোগ্রামিং প্রতিযোগিতার আয়োজন করা হয়। এ ছাড়াও অনুশীলনের জন্য প্রচুর সমস্যা দেওয়া আছে। নতুন প্রোগ্রামারদের জন্য এটি বেশ ভালো জায়গা। তবে একই ধরণের অনেক প্রবলেম আছে। তাই খেয়াল করতে হবে যেন একই রকম অনেক প্রবলেম সলভ করে সময় নষ্ট না হয়।

৭) http://www.spoj.com : এখানেও অনেক ভালো সমস্যা আছে। সমাধান করে প্রোগ্রাম জমা দিলে প্রোগ্রাম সঠিক হয়েছে কি না তা জানা যায়। এই ওয়েবসাইটের একটি বৈশিষ্ট্য হচ্ছে সি, সি প্লাস প্লাস, জাভা, পার্ল, পাইথন, রুবি, পিএইচপি এরকম আরো অনেক ল্যাঙ্গুয়েজ ব্যবহার করে প্রোগ্রাম লেখা যায়।

৮) http://codeforces.com : এই সাইটে নিয়মিত বিভিন্ন ধরনের প্রোগ্রামিং কন্টেস্ট হয়। অভিজ্ঞ প্রোগ্রামারদের জন্য ভালো।

৯) http://www.codechef.com : এটিও প্রোগ্রামিং প্রতিযোগিতার জন্য একটি ভালো ওয়েবসাইট এবং অভিজ্ঞ প্রোগ্রামারদের জন্য।

১০) http://acm.timus.ru : এখানে চমৎকার কিছু প্রবলেম আছে, বেশিরভাগই বিভিন্ন রাশিয়ান কনটেস্টের।