Module ১ · প্রথম program: console, let আর const, type, typeof
Problem: প্রথম program
এই lesson-এ যা শিখবে
- একটা problem-কে ওর অংশগুলো ধরে পড়তে পারবে: গল্প, Input, Output, Constraints আর একটা sample।
- Starter-এর উপর এমন program লিখতে পারবে, যার output প্রত্যাশিত output-এর সঙ্গে হুবহু মেলে।
- Submit করার আগে constraints যে কিনারাগুলো হতে দেয়, সেগুলো test করতে পারবে, যেমন n = 1, সব value negative, আর ফাঁকা input।
এই page-এ দশটা problem, আর প্রতিটা grade করে একটা judge। Judge তোমার program লুকানো test-গুলোর উপর চালায়, তারপর program যা ছাপল সেটা মেলায় যা ছাপার কথা ছিল তার সঙ্গে। এর সাতটা তুমি এই module-এর lesson-গুলোতে অনুশীলন হিসেবে দেখেছ, হুবহু বা প্রায় একই রকম। তিনটা নতুন।
Problem 1, 3 আর 4 (four-operations, sum-of-n আর largest-of-n) সবার জন্য free। বাকি সাতটা Pro problem: প্রতিটা problem আলাদা করে lock করার ব্যবস্থা আসবে পরের একটা release-এ, আর তার আগ পর্যন্ত দশটাই খোলা, পুরো module-টার মতোই।
প্রতিটা শুরু হয় lesson 05-এর starter থেকে, আর কোনোটাতেই ওখানে দেখা for, while আর if-এর অল্প কয়েকটা লাইনের বেশি কিছু লাগে না। Bob sample pass করলেই submit করে দেবে। Zara আগে চালাবে ফাঁকা input আর সবচেয়ে ছোট n, আর এই set-এ ওর এই অভ্যাসটাই নম্বর এনে দেয়।
Judge তোমার program কীভাবে পড়ে
প্রতিটা লুকানো test-এর জন্য judge চারটা কাজ করে। তোমার file চালায় node main.js হিসেবে, Node 22-এ, ঠিক Playground-এর মতো। Test-এর input দেয় standard input-এ, stdin box যেভাবে দেয় সেভাবেই। তোমার program standard output-এ যা ছাপল, সেটা জড়ো করে। তারপর সেটা মেলায় প্রত্যাশিত output-এর সঙ্গে।
মেলানোর সময় judge শুধু লাইনের শেষের space আর output-এর একদম শেষের line break বাদ দিয়ে দেখে, আর কিছু না। ছোট হাতের অক্ষরের জায়গায় বড় হাতের অক্ষর মানেই wrong answer। Colon-এর পরে একটা space বাদ পড়লেও তাই। Output section কখনো চায়নি এমন একটা prompt থাকলেও তাই, যেমন Enter n:। তাই যে program ঠিক সংখ্যাগুলো ভুল চেহারায় ছাপে, আর যে program কিছুই ছাপে না, দুইটা একই নম্বর পায়।
Judge পড়ে শুধু standard output। তোমার program standard error-এ যা লেখে, যেমন একটা error message, সেটা উত্তরের অংশ না, তাই test করার সময় নিজের জন্য note লিখতে ওটা ব্যবহার করতে পারো।
Starter, আর যে লাইনগুলো তুমি লেখো
প্রতিটা problem-এর code box খোলে lesson 05-এর starter-এর লাইনগুলো আর ওর // your code comment দিয়ে। তারপর এক বা দুইটা comment, যেটা বলে এই problem-এ কী লাগবে, তারপর শেষ লাইন। তুমি লেখো comment আর শেষ লাইনের মাঝখানে, বাকি কিছুই বদলাও না।
এখানে একটা problem, reverse-line, space-সহ একটা পুরো লাইন পড়ে। ওর starter হলো lesson 05-এর lines variant, আর ওর statement-এ সেটা বলা আছে। বাকি প্রতিটা problem token পড়ে next() আর nextInt() দিয়ে।
এখানকার প্রতিটা সমাধানের গড়ন
const input = ...; the six starter lines, unchanged
...
const out = [];
// your code: ...
const n = nextInt(); read what Input describes, in order
... work out the answer
out.push(answer); push each output line, in order
console.log(out.join("\n")); the last line, unchanged
- Input section যে ক্রমে value-গুলোর কথা বলে, সেই ক্রমেই পড়ো: সংখ্যার জন্য
nextInt(), শব্দের জন্যnext()। - Output section যে লাইনগুলো চায়, ঠিক সেগুলোই push করো, সেই ক্রমে, এর বেশি কিছু না।
- Output section যে prompt বা label দেখায় না, সেটা কখনো ছাপবে না।
Submit করার আগে চারটা check
- Sample চালাও। ওটা stdin box-এ paste করো। এটা fail করলে বাকি কিছু নিয়ে এখনই ভাবার দরকার নেই।
- Constraints যে কিনারাগুলো হতে দেয়, সেগুলো চালাও। n = 1, সব value negative, দুইটা সমান value, আর statement যেখানে হতে দেয় সেখানে ফাঁকা input।
- তোমার output প্রত্যাশিত output-এর পাশে রেখে পড়ো। Space গোনো, প্রতিটা বড় হাতের অক্ষর আর দশমিকের পরের প্রতিটা অঙ্ক মিলিয়ে দেখো।
- প্রতিটা পড়া মিলিয়ে দেখো।
next()দিয়ে পড়া সংখ্যা আসলে একটা string, আর sample হয়তো সেটা ধরিয়ে দেবে না।
তাই program শেষ হয়েছে কি না, সেটা তুমি জানতে পারো test করেই; test করা শেষে সারার মতো কোনো ঝামেলার কাজ না।
Hint-এর সিঁড়ি
প্রতিটা problem-এ তিনটা ধাপ আছে, যেগুলো খুলবে ক্রম ধরে। Hint 1 বলে কী খেয়াল করতে হবে। Hint 2 কথায় পদ্ধতিটা বলে দেয়। Solution দুই paragraph-এ পদ্ধতিটা বুঝিয়ে বলে, আর reference program থাকে ওর নিচে।
একটা ধাপ খুললে কিছু কাটা যায় না; খোলাটা record হয়, কিন্তু শাস্তি হয় না। Solution দেখার পরেও program-টা নিজের হাতে টাইপ করো, কারণ পড়ে ফেলাটা আসল দক্ষতা না। তাই সিঁড়ি বেয়ে ওঠো এক ধাপ করে, আর দুই ধাপের মাঝে আরেকবার চেষ্টা করো।
Problem-টা: একটা দাম আর একটা পরিমাণ পড়ো, আর মোট খরচ ছাপো। Input হলো এক লাইনে দুইটা পূর্ণসংখ্যা; output হলো এক লাইনে একটা সংখ্যা।
const input = require("fs").readFileSync(0, "utf8");
const tokens = input.split(/\s+/).filter(Boolean);
let at = 0;
const next = () => tokens[at++];
const nextInt = () => Number(next());
const out = [];
// your code: read with next() and nextInt(), push every line of output to out
const price = nextInt();
const quantity = nextInt();
out.push(price * quantity);
console.log(out.join("\n"));
1350
এই output এসেছে input 450 3 দিলে। খেয়াল করো, program-এ কী নেই: কোনো "Enter the price" prompt নেই, কোনো "Cost:" label নেই, Output section যা চায়নি তার কিছুই নেই।
এখানকার অর্ধেক problem এমন লাইন ছাপে, যেখানে বাঁধা লেখা আর value মেশানো থাকে। + একটা string আর একটা value জুড়ে একটা string বানায়, lesson 05-এর banner যেমন করেছিল।
const input = require("fs").readFileSync(0, "utf8");
const tokens = input.split(/\s+/).filter(Boolean);
let at = 0;
const next = () => tokens[at++];
const nextInt = () => Number(next());
const out = [];
// your code: read with next() and nextInt(), push every line of output to out
const name = next();
const age = nextInt();
out.push(name + " is " + age + " years old.");
out.push("Next year: " + (age + 1));
console.log(out.join("\n"));
Zara is 14 years old.
Next year: 15
এই output এসেছে input Zara 14 দিলে। Space-গুলো থাকে quote-এর ভেতরে, কারণ + নিজে থেকে কোনো space বসায় না। age + 1-এর চারপাশের bracket জরুরি, আর কেন, সেটা দেখাবে "যে ভুলগুলো সবাই করে"।
Maria গোনে, কয়টা শব্দ তিন অক্ষরের চেয়ে লম্বা। এটা lesson 05-এর while-এর গড়ন, ভেতরে lesson 04-এর if।
const input = require("fs").readFileSync(0, "utf8");
const tokens = input.split(/\s+/).filter(Boolean);
let at = 0;
const next = () => tokens[at++];
const nextInt = () => Number(next());
const out = [];
// your code: read with next() and nextInt(), push every line of output to out
let count = 0;
let word = next();
while (word !== undefined) {
if (word.length > 3) {
count = count + 1;
}
word = next();
}
out.push(count);
console.log(out.join("\n"));
3
এই output এসেছে input the quick brown fox jumps দিলে। quick, brown আর jumps-এ তিনটার বেশি অক্ষর আছে। ফাঁকা input দিলে loop একবারও চলে না, আর program ছাপে 0, যেটা এখানে ঠিক উত্তর।
এটা কোথায় কাজে লাগে
- Codeforces আর AtCoder. দুইটা contest site-ই Node.js-এ JavaScript নেয়, আর দুইটাই program judge করে এই page-এর মতো করে: input যায় standard input-এ, মেলানো হয় standard output। AtCoder-এর নিজের JavaScript sample উত্তর পুরো input পড়ে একটা
readFileSynccall দিয়ে, ঠিক starter যেমন পড়ে। - LeetCode. এটাও JavaScript নেয়, কিন্তু তোমার লেখা একটা function call করে, আর সেটা যা ফেরত দেয় তা মেলায়, standard input ছাড়াই। চিন্তাটা একই; বদলায় শুধু পড়ার কায়দা।
- Continuous integration. প্রতিটা বদলের পরে একটা team-এর test suite ওদের program বাঁধা কিছু input দিয়ে চালায়, আর ফলগুলো মেলায় প্রত্যাশিত ফলের সঙ্গে। এটা team-এর নিজের code-এর জন্য একটা judge।
যে ভুলগুলো সবাই করে
১. Output section কখনো চায়নি এমন একটা prompt।
out.push("Enter two numbers:");
out.push(a + b);
Judge প্রতিটা test-এ, sample-সহ, উত্তর দেয় Wrong Answer। কেউ তো টাইপ করছে না; input আগে থেকেই বসে আছে। Prompt-টা তুমি যোগ করবে, কারণ বইয়ের program-গুলো কাজ শুরুর আগে user-কে কিছু একটা বলে নেয়। মুছে দাও।
২. Bracket ছাড়া লেখা আর যোগফল।
out.push("exact: " + a + b === c);
কোনো message নেই। 0.1 0.2 0.3 দিলে এটা ছাপে false, label ছাড়া। + আগে চলে, বাঁ থেকে ডানে, তাই লাইনটা হয়ে যায় "exact: 0.10.2" === c, মানে একটা string-কে তুলনা করা হচ্ছে একটা number-এর সঙ্গে। যে অংশ আগে হিসাব হওয়ার কথা, তার চারপাশে bracket দাও: "exact: " + (a + b === c)।
৩. next() দিয়ে পড়া সংখ্যা তুলনা করা।
const x = next();
const y = next();
out.push(x > y);
কোনো message নেই। 9 10 দিলে এটা ছাপে true। দুইটা string তুলনা হয় অক্ষর ধরে ধরে, অভিধানের শব্দের মতো, আর "9" আসে "1"-এর পরে। সংখ্যা পড়ো nextInt() দিয়ে, তাহলে 9 > 10 হবে false, যেমন হওয়ার কথা।
৪. 0 থেকে শুরু হওয়া চলতি value।
let largest = 0;
কোনো message নেই, আর sample হয়তো pass করেও যাবে। সব value শূন্যের নিচে হলে তোমার বানানো 0-কে কেউ হারাতে পারে না, আর program ছাপে 0। শুরু করো input-এর দেওয়া প্রথম value থেকে। Zara-র সব-negative test ঠিক এই জন্যই আছে।
Kenji-র calculator app নষ্ট, আর ওর homework প্রতিটা জোড়া সংখ্যা নিয়ে চারটা জিনিস জানতে চায়। a আর b পড়ো, আর ছাপো ওদের যোগফল, বিয়োগফল, গুণফল আর ভাগফল।
Input. এক লাইনে দুইটা পূর্ণসংখ্যা, a আর b।
Output. চারটা লাইন: a + b, a - b, a * b আর a / b, প্রতিটা ঠিক যেভাবে out.join লেখে।
Constraints. -1000000 <= a, b <= 1000000, আর b কখনো 0 না।
Sample. Input 7 2 দিলে চার লাইনে 9, 5, 14 আর 3.5।
const input = require("fs").readFileSync(0, "utf8");
const tokens = input.split(/\s+/).filter(Boolean);
let at = 0;
const next = () => tokens[at++];
const nextInt = () => Number(next());
const out = [];
// your code: read with next() and nextInt(), push every line of output to out
// Read a and b, then push a + b, a - b, a * b and a / b, one per line.
console.log(out.join("\n"));
Run in Compiler
Hint 1
চারটা operator-এর কোনটা JavaScript-এ C-এর চেয়ে আলাদা আচরণ করে, lesson 01 কী বলেছিল? 7 আর 2-এর জন্য ওটা কী ছাপে?
Hint 2
দুইটা সংখ্যাই পড়ো nextInt() দিয়ে, তারপর চারটা expression push করো, প্রতিটার জন্য একটা করে push, Output section যে ক্রমে বলেছে সেই ক্রমে।
Solution
দুইটা read আর চারটা push: out.push(a + b), তারপর a - b, a * b আর a / b। Format করার কিছু নেই, কারণ out.join প্রতিটা সংখ্যাকে লেখায় বদলায় সবগুলো অঙ্কসহ, ঠিক String-এর মতো করে। তাই 3.5 ছাপা হয় 3.5, 5 / 1 ছাপা হয় 5, আর 1 / 3 ছাপা হয় ওর সবগুলো অঙ্কসহ, statement যেমন চায়।
ফাঁদগুলো পড়ার মধ্যে, হিসাবে না। nextInt()-এর বদলে next() দিলে a + b দুইটা string জোড়া লাগায়, আর 7 2 দেয় 72। C-এর অভ্যাসে লেখা Math.floor(a / b) সেই ভগ্নাংশটাই ফেলে দেয়, যেটা statement চায়। লুকানো test-গুলোতে আছে একটা negative a, অনেক অঙ্কের একটা ভাগফল, আর negative b-র সঙ্গে 0। সেখানে গুণফল আর ভাগফল হয় -0, মানে negative শূন্য: out.join সেটা লেখে 0, কিন্তু আলাদা করে console.log(0 / -5) ছাপে -0, আর এটা প্রতিটা উত্তর out-এ পাঠানোর আরেকটা কারণ।
Zara-র library app-এ কেউ sign in করলে app তাকে নাম ধরে শুভেচ্ছা জানায়। একটা নাম পড়ো, আর শুভেচ্ছার লাইনটা ছাপো।
Input. একটা নাম, space ছাড়া একটা শব্দ: যেকোনো ভাষার অক্ষর, digit, hyphen বা apostrophe থাকতে পারে।
Output. এক লাইন: Hello, , তারপর নামটা, তারপর !।
Constraints. নামটা 1 থেকে 100 অক্ষরের।
Sample. Input Maria দিলে Hello, Maria!।
const input = require("fs").readFileSync(0, "utf8");
const tokens = input.split(/\s+/).filter(Boolean);
let at = 0;
const next = () => tokens[at++];
const nextInt = () => Number(next());
const out = [];
// your code: read with next() and nextInt(), push every line of output to out
// Read the name with next(), then push the greeting line.
console.log(out.join("\n"));
Run in Compiler
Hint 1
Hello, Maria!-এ space-গুলো ঠিক কোথায় বসে? গুনে দেখো: comma-র পরে একটা, !-এর আগে একটাও না।
Hint 2
নামটা পড়ো next() দিয়ে, কারণ ওটা একটা শব্দ। লাইনটা বানাও + দিয়ে: বাঁধা লেখা, নাম, আবার বাঁধা লেখা।
Kenji-র খাবারের দোকান দিনের প্রতিটা বিক্রি টাকায় লিখে রাখে, আর ফেরত দেওয়া টাকা লেখে negative সংখ্যা হিসেবে। দিনের মোট ছাপো।
Input. n, তারপর n-টা পূর্ণসংখ্যা, এক লাইনে বা কয়েক লাইনে ছড়িয়ে।
Output. এক লাইনে n-টা সংখ্যার যোগফল।
Constraints. 1 <= n <= 100000। প্রতিটা সংখ্যা -1000000 থেকে 1000000-এর মধ্যে।
Sample. Input 4 আর 10 -3 25 8 দিলে 40।
const input = require("fs").readFileSync(0, "utf8");
const tokens = input.split(/\s+/).filter(Boolean);
let at = 0;
const next = () => tokens[at++];
const nextInt = () => Number(next());
const out = [];
// your code: read with next() and nextInt(), push every line of output to out
// Read n, then n numbers with nextInt(). Push their sum.
console.log(out.join("\n"));
Run in Compiler
Hint 1
n-এর পরে কয়টা সংখ্যা আসে? সব মিলিয়ে তোমার program nextInt() কয়বার call করবে?
Hint 2
একটা let total = 0 রাখো। Lesson 05-এর for-এর গড়ন দিয়ে n বার এতে nextInt() যোগ করো, তারপর push করো।
Solution
এটা lesson 05-এর প্রথম example। n পড়ো, আর একটা total শুরু করো 0 থেকে। এতে n বার nextInt() যোগ করো, এমন একটা for loop-এ, যেটা i গোনে 0 থেকে, যতক্ষণ i < n, তারপর total push করো। Input-এ line break কোথায় আছে, তাতে কিছু যায় আসে না, কারণ token যে লাইনেই থাকুক, আসে ক্রম ধরেই।
সবচেয়ে বড় total হলো 100000 গুণ 1000000, মানে 1011। এটা Number.MAX_SAFE_INTEGER-এর অনেক নিচে, তাই একটা সাধারণ number এটা হুবহু ধরে রাখে, lesson 03 যেমন কথা দিয়েছিল। যে loop i <= n পর্যন্ত চলে, সে একটা token বেশি পড়ে, আর যোগফলকে বানিয়ে দেয় NaN।
Zara একটা পাহাড়ি station-এ প্রতি ঘণ্টায় তাপমাত্রা লিখে রাখে, পূর্ণ ডিগ্রিতে, আর শীতকালে বেশির ভাগ reading থাকে শূন্যের নিচে। দিনের সবচেয়ে গরম reading ছাপো।
Input. n, তারপর n-টা পূর্ণসংখ্যা।
Output. এক লাইনে n-টা সংখ্যার সবচেয়ে বড়টা।
Constraints. 1 <= n <= 100000। প্রতিটা সংখ্যা -1000000 থেকে 1000000-এর মধ্যে।
Sample. Input 5 আর 3 9 -2 9 4 দিলে 9।
const input = require("fs").readFileSync(0, "utf8");
const tokens = input.split(/\s+/).filter(Boolean);
let at = 0;
const next = () => tokens[at++];
const nextInt = () => Number(next());
const out = [];
// your code: read with next() and nextInt(), push every line of output to out
// Read n, then n numbers. Push the largest one.
console.log(out.join("\n"));
Run in Compiler
Hint 1
কাগজে করে দেখো 3 আর -5 -2 -9। দ্বিতীয়টার উত্তর কী হওয়া উচিত? আর সবচেয়ে বড় value-টা 0 থেকে শুরু করলে program কী ছাপবে?
Hint 2
প্রথম value-টা পড়ে রাখো let largest-এ। তারপর বাকি n - 1-টা value পড়ো, আর যখনই কোনোটা বড় হয়, সেটা বসাও largest-এ। সিদ্ধান্তটা নেয় lesson 04-এর if।
Solution
শুরু করো let largest = nextInt(); দিয়ে, মানে প্রথম reading-টাই, বানানো কোনো 0 না। তারপর আরও n - 1 বার loop চালাও: x পড়ো, আর if (x > largest) হলে largest = x করো। Loop-এর পরে largest push করো। চাইলে if-এর বদলে largest = Math.max(largest, x) লিখতে পারো, কাজ একই।
0 থেকে শুরু করলে sample pass করে, কিন্তু যে test-এ সব reading negative, তার প্রতিটায় fail করে, কারণ যে 0 কেউ মাপেনি, তাকে কেউ হারাতে পারে না। next() দিয়ে পড়লে fail করে অন্যভাবে: string তুলনা হয় অভিধানের শব্দের মতো, তাই "9" জিতে যায় "10"-এর বিরুদ্ধে। n = 1 হলে loop একবারও চলে না, আর একমাত্র reading-টাই উত্তর।
Maria-র এক কাজিন আবহাওয়ার খবর পড়ে Fahrenheit-এ। Celsius-এ একটা তাপমাত্রা পড়ো, আর সেটা Fahrenheit-এ ছাপো, F = C * 9 / 5 + 32, দশমিকের পরে ঠিক একটা অঙ্কসহ।
Input. একটা সংখ্যা C, পূর্ণসংখ্যা, নয়তো দশমিকের পরে একটা অঙ্কসহ।
Output. এক লাইন: F, ঠিক যেভাবে F.toFixed(1) লেখে।
Constraints. -273.1 <= C <= 1000।
Sample. Input 37 দিলে 98.6; input 100 দিলে আসত 212.0।
const input = require("fs").readFileSync(0, "utf8");
const tokens = input.split(/\s+/).filter(Boolean);
let at = 0;
const next = () => tokens[at++];
const nextInt = () => Number(next());
const out = [];
// your code: read with next() and nextInt(), push every line of output to out
// Read the temperature in Celsius. Push it in Fahrenheit, with one digit after the point.
console.log(out.join("\n"));
Run in Compiler
Hint 1
নাম যা-ই বলুক, nextInt() কি 36.6 ঠিকঠাক পড়ে? আর console.log(212) কী ছাপে, 212.0-এর পাশে রেখে দেখো।
Hint 2
C পড়ো nextInt() দিয়ে, formula দিয়ে F বের করো, আর push করো F.toFixed(1), যেটা সব সময় দশমিকের পরে ঠিক একটা অঙ্ক লেখে।
Alice-এর form reader প্রতিটা text field-কে সেই value-তে বদলায়, যেটা দিয়ে সম্ভবত ওটা বোঝানো হয়েছে। পাঁচটা token পড়ো, প্রতিটা নিচের নিয়ম মেনে বদলাও, আর প্রতিটা value-র typeof ছাপো।
নিয়মটা, এই ক্রমে: true আর false হয়ে যায় boolean; null হয়ে যায় null; undefined হয়ে যায় undefined; তা না হলে, Number(token) যদি NaN না হয়, তাহলে সেই number; তাও না হলে token-টা string-ই থেকে যায়।
Input. এক লাইনে পাঁচটা token।
Output. পাঁচটা লাইন, input-এর ক্রমে প্রতিটা value-র typeof।
Constraints. প্রতিটা token 1 থেকে 20 অক্ষরের, কোনো space নেই। চারটা শব্দ হুবহু মিলতে হবে, ছোট হাতের অক্ষরে।
Sample. Input 42 hello false null 3.5 দিলে number, string, boolean, object আর number।
const input = require("fs").readFileSync(0, "utf8");
const tokens = input.split(/\s+/).filter(Boolean);
let at = 0;
const next = () => tokens[at++];
const nextInt = () => Number(next());
const out = [];
// your code: read with next() and nextInt(), push every line of output to out
// For each of the five tokens: turn it into a value by the rule in the statement,
// then push typeof that value.
console.log(out.join("\n"));
Run in Compiler
Hint 1
Sample-এর চতুর্থ লাইন object কেন? Lesson 04-এর "যে দুইটা উত্তর চমকে দেয়" আবার পড়ো। আর নিয়ম মানলে token NaN কী হওয়ার কথা?
Hint 2
পাঁচবার loop চালাও। প্রতিটা token-এর জন্য একটা if আর else if-এর শিকল নিয়মের ক্রমে value বেছে নেয়, আর number-এর test হলো Number.isNaN(Number(token))। তারপর push করো typeof value।
Kenji-র শব্দের খেলায় একটা list থেকে সবচেয়ে লম্বা শব্দটা লাগবে, আর list-এর শুরুতে কোনো count নেই: শব্দ আসতেই থাকে, input শেষ না হওয়া পর্যন্ত।
Input. a থেকে z আর A থেকে Z অক্ষরে লেখা শব্দ, space আর line break দিয়ে আলাদা। একটা শব্দও না থাকতে পারে।
Output. সবচেয়ে লম্বা শব্দ; কয়েকটা শব্দ সমান লম্বা হলে প্রথমটা; কোনো শব্দ না থাকলে none।
Constraints. প্রতিটা শব্দ 1 থেকে 20 অক্ষরের। পুরো input-এ বড়জোর 200000 অক্ষর।
Sample. Input tea biscuit cake দিলে biscuit।
const input = require("fs").readFileSync(0, "utf8");
const tokens = input.split(/\s+/).filter(Boolean);
let at = 0;
const next = () => tokens[at++];
const nextInt = () => Number(next());
const out = [];
// your code: read with next() and nextInt(), push every line of output to out
// Read words with next() until it gives undefined. Push the longest one,
// the first one if several share the greatest length, or none if there were no words.
console.log(out.join("\n"));
Run in Compiler
Hint 1
একই দৈর্ঘ্যের দুইটা শব্দ: কোনটা রাখতে হবে, আর সেটা রাখে > নাকি >=? আর ফাঁকা input-এ প্রথম next() কী দেয়?
Hint 2
প্রথম শব্দটা পড়ে রাখো let best-এ। বাকিগুলো পড়ো while-এর গড়ন দিয়ে, আর best বদলাও শুধু তখন, যখন কোনো শব্দ ওর চেয়ে সত্যিই লম্বা। Loop-এর পরে best যদি undefined হয়, push করো none, নইলে best।
Amara ওর ধাঁধার প্রতিটা clue উল্টো করে ছাপে। একটা লাইন পড়ো, space আর যতিচিহ্নসহ, আর সেটা উল্টো করে ছাপো। এই starter হলো lines variant, তাই next() পুরো লাইনটাই হাতে দেয়।
Input. এক লাইন লেখা, ফাঁকাও হতে পারে।
Output. একই লাইন, অক্ষরগুলো উল্টো ক্রমে।
Constraints. 0 থেকে 1000 অক্ষর, প্রতিটা ছাপার যোগ্য ASCII (code 32 থেকে 126)।
Sample. Input Zara runs 5 km দিলে mk 5 snur araZ।
const input = require("fs").readFileSync(0, "utf8");
const lines = input.split("\n");
let at = 0;
const next = () => lines[at++];
const nextInt = () => Number(next());
const out = [];
// your code: read with next() and nextInt(), push every line of output to out
// Lines variant: next() returns the next whole line, empty lines included.
// Read the line with next(). Push it written backwards.
console.log(out.join("\n"));
Run in Compiler
Hint 1
Token-এর starter এই লাইনের space-গুলো হারিয়ে ফেলত কেন? লাইনটার কোন অক্ষরটা সবার আগে বের হতে হবে, আর ওর position কত?
Hint 2
line[i] হলো position i-এর অক্ষর, 0 থেকে গুনে, আর line.length - 1 হলো শেষটা। ওখান থেকে i-কে 0 পর্যন্ত নামাও, আর প্রতিটা অক্ষর জুড়ে দাও একটা let reversed = ""-এ।
Lesson 03-এর পর থেকে Zara দশমিক সংখ্যাকে আর বিশ্বাস করে না। a, b আর c পড়ো, আর ছাপো a + b হুবহু c কি না, আর c-এর 1e-9-এর মধ্যে কি না।
Input. এক লাইনে তিনটা সংখ্যা, প্রতিটায় দশমিকের পরে বড়জোর ছয়টা অঙ্ক।
Output. দুই লাইন: exact: আর a + b === c-এর ফল, তারপর close: আর Math.abs(a + b - c) < 1e-9-এর ফল।
Constraints. প্রতিটা সংখ্যা -1000 থেকে 1000-এর মধ্যে।
Sample. Input 0.1 0.2 0.3 দিলে exact: false আর close: true।
const input = require("fs").readFileSync(0, "utf8");
const tokens = input.split(/\s+/).filter(Boolean);
let at = 0;
const next = () => tokens[at++];
const nextInt = () => Number(next());
const out = [];
// your code: read with next() and nextInt(), push every line of output to out
// Read a, b and c. Push "exact: " and whether a + b === c,
// then "close: " and whether a + b is within 1e-9 of c.
console.log(out.join("\n"));
Run in Compiler
Hint 1
Sample-এ out.push("exact: " + a + b === c) চালিয়ে দেখো, আর পড়ো এটা কী ছাপে। কোন + আগে চলে?
Hint 2
প্রতিটা true-false উত্তর আগে নিজের bracket-এর ভেতরে হিসাব করো, তারপর + দিয়ে ওর label-এর সঙ্গে জোড়ো। close-এর জন্য নাও lesson 03-এর কাছাকাছি-কি-না test, যোগফলের জায়গায় a + b বসিয়ে।
Maria দেয়ালে n-এর নামতা লাগাতে চায়, column-গুলো সোজা লাইনে সাজানো। দশটা লাইন ছাপো n x i = p। i-কে 2 অক্ষর পর্যন্ত pad করো, আর p-কে pad করো n * 10-এ যতগুলো অক্ষর, তত পর্যন্ত।
Input. একটা পূর্ণসংখ্যা n।
Output. দশটা লাইন, i = 1 থেকে 10 পর্যন্ত।
Constraints. 1 <= n <= 100000।
Sample. Input 7 দিলে দশটা লাইন, 7 x 1 = 7 থেকে 7 x 10 = 70 পর্যন্ত।
const input = require("fs").readFileSync(0, "utf8");
const tokens = input.split(/\s+/).filter(Boolean);
let at = 0;
const next = () => tokens[at++];
const nextInt = () => Number(next());
const out = [];
// your code: read with next() and nextInt(), push every line of output to out
// Read n. Push ten lines, n x i = p, with i padded to 2 characters
// and p padded to as many characters as n * 10 has.
console.log(out.join("\n"));
Run in Compiler
Hint 1
n = 10-এর লাইনগুলো হাতে লেখো। সবচেয়ে চওড়া গুণফল, 100, কত চওড়া, আর সবচেয়ে সরু, 10, কত চওড়া?
Hint 2
Loop-এর আগে একবার width বের করো: String(n * 10)-এ কয়টা character। তারপর i-কে 1 থেকে 10 পর্যন্ত নিয়ে প্রতিটা লাইন বানাও n, 2 পর্যন্ত pad করা i, আর ওই width পর্যন্ত pad করা গুণফল দিয়ে, padStart ব্যবহার করে।
সচরাচর যে প্রশ্নগুলো আসে
আমার program sample pass করে। তাহলে একটা লুকানো test fail করে কেন?
Sample একটা ছোট case, বেছে নেওয়া হয়েছে statement বোঝানোর জন্য। লুকানো test-গুলো এর সঙ্গে যোগ করে n = 1, সব negative value, সমান value, যেখানে চলে সেখানে ফাঁকা input, আর সবচেয়ে বড় input। এগুলো আগে নিজে চালাও, Zara যেমন চালায়।
আমার code-এর ভেতরে
out.push-এর বদলে কিconsole.logব্যবহার করতে পারি?অল্প কয়েকটা লাইনের বেলায় output সাধারণত একই আসে; Problem 1-এর negative শূন্য ব্যতিক্রম। অনেক লাইনের বেলায় এটা ধীর, lesson 05 যেমন মেপে দেখিয়েছে, আর দুইটা মিশিয়ে ফেললে লাইনগুলো ভুল ক্রমে ছাপা হতে পারে। সব কিছু
out-এ push করো, তাহলে প্রশ্নটা কখনো ওঠেই না।Test করার সময় debugging-এর জন্য কি একটা লাইন ছাপতে পারি?
হ্যাঁ,
console.error(x)দিয়ে। এটা লেখে standard error-এ, যেটা Playground দেখায়, কিন্তু judge গোনায় ধরে না।out-এ রাখা debugging লাইন তোমার উত্তরেরই অংশ, আর সেটা উত্তরটাকে ভুল করে দেয়।এগুলোর কয়েকটায়
for,whileআরifলাগে, যেগুলো শেখাবে Module 4। আমার কি এগুলো জানার কথা?শুধু lesson 04 আর 05 যে গড়নগুলো দেখিয়েছে, সেগুলোই, যেমন দেওয়া আছে তেমন করে। এগুলো কীভাবে কাজ করে আর আর কী কী করতে পারে, সেটা বুঝিয়ে বলবে Module 4। এখানকার কোনো problem-এ ওই গড়নগুলোর বেশি কিছু লাগে না।
মূল কথা
- Judge তোমার standard output মেলায় প্রত্যাশিত output-এর সঙ্গে, আর বাদ দেয় শুধু লাইনের শেষের space আর একদম শেষের line break।
- Value পড়ো Input যে ক্রমে বলে সেই ক্রমে: সংখ্যার জন্য
nextInt(), শব্দের জন্যnext()। - Output যে লাইনগুলো চায়, ঠিক সেগুলোই push করো: কোনো prompt না, Output যে label দেখায় না, সেটাও না।
- যোগফল বা তুলনাকে লেখার সঙ্গে জোড়ার আগে তার চারপাশে bracket দাও।
- চলতি value শুরু করো input-এর প্রথম value থেকে, বানানো 0 থেকে কখনো না।
- আগে sample test করো, তারপর কিনারাগুলো: n = 1, সব negative, সমান value, ফাঁকা input।
এরপর module test: এই module-এর lesson-গুলো নিয়ে দশটা প্রশ্ন। তারপর Module 2 খুলবে সেই প্রশ্ন, যেটা এই module বারবার পিছিয়ে রেখেছে: একপাশে string থাকলে + কী করে।
lesson ৭ শেষ
সব problem accepted হলেই lesson শেষ।
৩ টা free problem-এর মধ্যে ০ টা accepted
পরেরটা: Module test: প্রথম program