ট্র্যাক
/
x86-64 Assembly
x86-64 Assembly
/
অনুশীলনী
/
ইনভেন্টরি ম্যানেজমেন্ট
ইনভেন্টরি ম্যানেজমেন্ট

ইনভেন্টরি ম্যানেজমেন্ট

লার্নিং অনুশীলনী

ভূমিকা

ইন্টিজার

বাইনারি নোটেশন

ইন্টিজার হলো একটি বিমূর্ত ধারণা, যা পূর্ণসংখ্যাকে প্রকাশ করে, যেমন 4, -2, 0 বা 64532।

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

আনসাইনড সংখ্যা

সংখ্যাটি যদি কেবল অঋণাত্মক হতে পারে, তবে তাকে আনসাইনড সংখ্যা বলা হয়।

আনসাইনড সংখ্যাগুলো সরাসরি সিকোয়েন্সে সেট থাকা সব বিটের সংশ্লিষ্ট দুইয়ের ঘাতের যোগফল হিসেবে প্রকাশ করা হয়।

একটি রেজিস্টারে প্রকাশযোগ্য অঋণাত্মক ইন্টিজারের পরিসীমা 0 (কোনো বিট সেট নেই) থেকে 2⁶⁴ - 1 (৬৪টি বিট সেট থাকার যোগফল) পর্যন্ত বিস্তৃত।

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

movzx ইন্সট্রাকশনটি (z মানে জিরো) একটি ৮-বিট বা ১৬-বিট সোর্স অপারেন্ডকে জিরো-এক্সটেন্ড করে বড় একটি ডেস্টিনেশন অপারেন্ডে নিয়ে যায়। একটি ৩২-বিট সোর্স অপারেন্ড একটি সাধারণ mov দিয়েই সবসময় ডেস্টিনেশন অপারেন্ডের ৬৪টি বিট পর্যন্ত জিরো-এক্সটেন্ড হয়ে যায়।

সাইনড সংখ্যা

কোনো ইন্টিজার যদি ধনাত্মক বা ঋণাত্মক মান নিতে পারে, তবে তাকে সাইনড সংখ্যা বলা হয়।

ঋণাত্মক সংখ্যা প্রকাশ করতে x86-64 টু'স কমপ্লিমেন্ট রূপটি ব্যবহার করে।

টু'স কমপ্লিমেন্টে সাইনড সংখ্যাগুলোও সেট থাকা বিটের সংশ্লিষ্ট দুইয়ের ঘাতের যোগফল হিসেবে প্রকাশ করা হয়। তবে সবচেয়ে উপরের বিটটি সেট থাকলে সেটি বাকিগুলোর সাথে যোগ না হয়ে বিয়োগ করা হয়।

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

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

movsx ইন্সট্রাকশনটি (s মানে সাইন) একটি ৮-বিট বা ১৬-বিট সোর্স অপারেন্ডকে সাইন-এক্সটেন্ড করে বড় একটি ডেস্টিনেশন অপারেন্ডে নিয়ে যায়। movsx-এর একটি রূপ movsxd একই কাজ করে ৩২-বিট সোর্স অপারেন্ড থেকে ৬৪-বিট ডেস্টিনেশন অপারেন্ডে।

কোনো সংখ্যার সাইন বদলাতে neg ইন্সট্রাকশনটি ব্যবহার করা যায়।

Caution

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

এই কাজে কমেন্ট ব্যবহার করলে অনেক সুবিধা পাওয়া যায়।

ইমিডিয়েট

আগের একটি কনসেপ্টে বলা হয়েছিল যে 4 বা -15-এর মতো একটি ধ্রুবক সংখ্যা অনেক ইন্সট্রাকশনের সোর্স অপারেন্ড হিসেবে ব্যবহার করা যায়। এসব সংখ্যাকে ইমিডিয়েট বলা হয়।

একটি ইমিডিয়েট কোনো রেজিস্টারে বা মেমরিতে রাখা থাকে না: এটি ইন্সট্রাকশনের ভেতরেই এনকোড করা থাকে। বেশিরভাগ ইন্সট্রাকশনে এর জন্য বরাদ্দ জায়গা মাত্র ৩২ বিট চওড়া, ডেস্টিনেশন অপারেন্ড যত বড়ই হোক না কেন।

ডেস্টিনেশন অপারেন্ড ৬৪ বিট চওড়া হলে ওই ৩২ বিট সাইন-এক্সটেন্ড করে তা ভরা হয়। অপারেন্ডের উপরের অর্ধেকটি পুরোপুরি ইমিডিয়েটের সবচেয়ে উপরের বিটের কপি দিয়ে ভরা হয়, তাই এভাবে কেবল ৩২-বিট সাইনড ইন্টিজার-এর পরিসীমার মধ্যে থাকা সংখ্যাই লেখা যায়:

add rax, -1          ; the immediate is sign-extended, so all 64 bits of rax are affected
add rax, 2147483647  ; the largest immediate an instruction like this accepts

ওই পরিসীমার বাইরের কোনো সংখ্যা ইমিডিয়েট হিসেবে ব্যবহার করা যায় না। এই নিয়মের ব্যতিক্রম হলো mov, যা ডেস্টিনেশন অপারেন্ড একটি রেজিস্টার হলে পুরো ৬৪-বিট ইমিডিয়েট নিতে পারে। ৬৪-বিট ইমিডিয়েট দরকার হলে প্রথমে mov দিয়ে সেটি একটি রেজিস্টারে লোড করুন, তারপর সেই রেজিস্টারটি ব্যবহার করুন:

mov rax, 3435973837           ; this works, mov can take a 64-bit immediate
mov rdx, 18446744073709551615 ; the largest immediate mov accepts
sub rdx, rax

খেয়াল করুন, একটি ঋণাত্মক ইমিডিয়েট এবং একই বিট-রূপযুক্ত আনসাইনড সংখ্যা সমতুল্য, আর অ্যাসেম্বল করলে দুটিই হুবহু একই মান তৈরি করে:

mov rax, -1                   ; rax = 18446744073709551615
mov rax, 18446744073709551615 ; rax = -1

যোগফল

দুটি সংখ্যার যোগ add ইন্সট্রাকশন দিয়ে হিসাব করা যায়।

এছাড়া একটি এক-অপারেন্ড inc ইন্সট্রাকশনও আছে, যা তার অপারেন্ডের মানের সাথে 1 যোগ করে:

inc rax ; rax = rax + 1

দুটি ইন্টিজারের যোগ আনসাইনড ও সাইনড, দুই ধরনের সংখ্যার ক্ষেত্রেই একইভাবে কাজ করে।

বিয়োগ

দুটি ইন্টিজারের বিয়োগ sub ইন্সট্রাকশন দিয়ে করা হয়।

এছাড়া একটি এক-অপারেন্ড dec ইন্সট্রাকশনও আছে, যা তার অপারেন্ডের মান থেকে 1 বিয়োগ করে:

dec rax ; rax = rax - 1

দুটি ইন্টিজারের বিয়োগও আনসাইনড ও সাইনড, দুই ধরনের সংখ্যার ক্ষেত্রেই একইভাবে কাজ করে।

গুণ

x86-64-তে দুটি সংখ্যার মধ্যে গুণ করার জন্য দুটি ভিন্ন ইন্সট্রাকশন আছে। সাধারণত আনসাইনড গুণে mul ইন্সট্রাকশনটি ব্যবহৃত হয়, আর সাইনড গুণে imul।

mul ইন্সট্রাকশনটি নিচের এক-অপারেন্ড রূপটি নেয়, যেখানে src হলো সোর্স অপারেন্ড:

mul src

imul ইন্সট্রাকশনটি এক-অপারেন্ড, দুই-অপারেন্ড বা তিন-অপারেন্ড রূপ নিতে পারে:

imul src
imul dest, src
imul dest, src1, src2
এক-অপারেন্ড গুণ

এক-অপারেন্ড রূপে গুণ করার সময় অন্তর্নিহিতভাবে দুটি রেজিস্টার ব্যবহার করা হয়: rax এবং rdx। গুণটিতে যদি দুটি ৬৪-বিট সংখ্যা জড়িত থাকে, তবে ফলাফলের নিচের ৬৪ বিট থাকবে rax-এ আর উপরের ৬৪ বিট থাকবে rdx-এ।

একে সাধারণত rdx:rax বলা হয়, যা বোঝায় দুটি রেজিস্টার একসাথে ব্যবহৃত হচ্ছে:

mul rcx ; rax = lower 64 bits of rax * rcx
        ; rdx = upper 64 bits of rax * rcx

অন্য অপারেন্ড আকারের ক্ষেত্রেও একই ঘটে। তাই যেমন, দুটি ৩২-বিট সংখ্যার গুণ হলে eax ও edx ব্যবহৃত হবে।

ব্যতিক্রম হলো দুটি বাইটের মধ্যে গুণ।

এক্ষেত্রে dl:al-এর বদলে ax ব্যবহৃত হবে। ax-এর নিচের অংশে (al) গুণফলের নিচের ৮ বিট থাকবে, আর উপরের অংশে (ah) থাকবে উপরের ৮ বিট।

Caution

গুণে অন্তর্নিহিতভাবে ব্যবহৃত রেজিস্টার, যেমন rax ও rdx, সবসময় ওভাররাইট হয়ে যায়। ওই রেজিস্টারগুলোর মান পরে দরকার হলে কাজের আগেই সেগুলো সংরক্ষণ করে রাখা উচিত।

দুই-অপারেন্ড গুণ

imul-এর দুই-অপারেন্ড রূপে একটি স্পষ্ট ডেস্টিনেশন অপারেন্ড থাকে এবং এটি প্রচলিত সিনট্যাক্স অনুসরণ করে। rdx ব্যবহৃত হয় না। বরং ডেস্টিনেশন অপারেন্ডে বসানোর জন্য ফলাফলটি ছেঁটে ফেলা হয়।

imul r8, r9 ; r8 = lower 64 bits of r8 * r9
তিন-অপারেন্ড গুণ

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

imul r8, r9, 100 ; r8 = lower 64 bits of r9 * 100

খেয়াল করুন, গুণে ডেস্টিনেশন অপারেন্ডটি ব্যবহার করা হয় না। এটি কেবল ফলাফলটি গ্রহণ করে।

ওভারফ্লো সামলানো

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

তাই কখনো কখনো গুণের আগে অপারেন্ডগুলো প্রশস্ত করা কাজে লাগে, যাতে পুরো গুণফলের জন্য একটি রেজিস্টারেই জায়গা হয়। আনসাইনড অপারেন্ড জিরো-এক্সটেন্ড করা হয়, আর সাইনড অপারেন্ড সাইন-এক্সটেন্ড করা হয়:

movzx eax, di ; di and si hold unsigned 16-bit numbers
movzx ecx, si
mul ecx       ; the 32-bit product fits in eax, and edx is cleared

ভাগ

গুণের মতোই, দুটি সংখ্যার মধ্যে ভাগ করার জন্যও দুটি ইন্সট্রাকশন আছে। আনসাইনড ভাগে div ইন্সট্রাকশনটি ব্যবহৃত হয়, আর সাইনড ভাগে idiv।

দুটি ইন্সট্রাকশনই কেবল একটি অপারেন্ড নিয়ে কাজ করে:

div src
idiv src

১৬-বিট, ৩২-বিট ও ৬৪-বিট ভাগ যথাক্রমে dx:ax, edx:eax আর rdx:rax-কে ভাজ্য হিসেবে ব্যবহার করে। এসব ক্ষেত্রে দুটি রেজিস্টার একসাথে মিলে একটি 2N-বিট মান তৈরি করে, যেখানে N হলো কাজের আকার (১৬-বিট, ৩২-বিট বা ৬৪-বিট)। এরপর এই মানটিকে সোর্স অপারেন্ড দিয়ে ভাগ করা হয়। কাজের আকার অনুযায়ী ভাগফল লেখা হয় ax, eax বা rax-এ, আর ভাগশেষ লেখা হয় dx, edx বা rdx-এ।

বাইটের মধ্যে ভাগ করা বিশেষ ক্ষেত্র: dl:al ব্যবহার না করে ax ব্যবহার করা হয়। ax-এর নিচের ৮ বিটে (al) ভাগফল থাকবে, আর উপরের ৮ বিটে (ah) থাকবে ভাগশেষ।

খেয়াল করুন, ভাগের আগে ভাজ্যের সব বিট যথাযথভাবে সেট করা উচিত। rdx-এ (বা ৮-বিট ভাগে ah-এ) সেট থাকা যেকোনো বিট ভাগ করা মানে অবদান রাখে।

আনসাইনড ভাগে, ভাগ করতে হবে এমন মানটি যদি নিচের অর্ধেকে ধরে যায়, তবে উপরের অর্ধেক পরিষ্কার করে দিতে হবে। যে-কোনো ইন্সট্রাকশন দিয়ে ওই বিটগুলো পরিষ্কার করা গেলেই চলবে। যেমন, mov edx, 0 ৩২-বিট ভাগে উপরের বিটগুলো পরিষ্কার করে দেয়।

সাইনড ভাগে বরং মানটি সাইন-এক্সটেন্ড করা উচিত। এই কাজটি স্বয়ংক্রিয়ভাবে করার ইন্সট্রাকশনও আছে: cbw, cwd, cdq এবং cqo। প্রথমটি al-এর সাইন অনুযায়ী ah-এর বিটগুলো সেট করে। বাকিগুলো যথাক্রমে ax থেকে dx, eax থেকে edx এবং rax থেকে rdx-এ সাইন-এক্সটেনশন করে।

Caution

ভাগে অন্তর্নিহিতভাবে ব্যবহৃত রেজিস্টার, যেমন rax ও rdx, সবসময় ওভাররাইট হয়ে যায়। ওই রেজিস্টারগুলোর মান পরে দরকার হলে ভাগের আগেই সেগুলো সংরক্ষণ করে রাখা উচিত।

নির্দেশনা

একটি স্থানীয় দোকান তার মজুদ বড় একটি গুদামে সরিয়ে নিচ্ছে। সবকিছু প্যাক করে সরানোর কাজে আপনাকে নিয়োগ করা হয়েছে।

আপনার চারটি কাজ, সবই পরিবহন সামলানোর সাথে সম্পর্কিত।

Note

এই কনসেপ্টে যে নির্দেশনাগুলোর উল্লেখ আছে:

নির্দেশ বিবরণ
add a, b a = a + b
inc a a = a + 1
sub a, b a = a - b
dec a a = a - 1
imul a rdx:rax = a * rax (signed)
imul a, b a = a * b (signed, truncated)
imul a, b, c a = b * c (signed, truncated)
mul a rdx:rax = a * rax (unsigned)
div a rax = quotient, rdx = remainder of rdx:rax / a (unsigned)
idiv a rax = quotient, rdx = remainder of rdx:rax / a (signed)
movzx a, b a = b, adding 0 to the extra bits
movsx a, b a = b, adding 1 to the extra bits if b < 0 or 0 otherwise
Note

মনে রাখবেন, অপারেন্ডের নাম বদলে দিয়ে আপনি একই রেজিস্টার ভিন্ন ভিন্ন আকারে ব্যবহার করতে পারেন। যেমন: rax (৬৪-বিট), eax (৩২-বিট), ax (১৬-বিট), al (৮-বিট)।

পুরো টেবিলের জন্য আগের কনসেপ্ট দেখুন।

1. প্রতিটি বাক্সের ওজন বের করুন

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

ভালোভাবে গুছিয়ে রাখার জন্য একটি বাক্সে কেবল দুটি ভিন্ন পণ্যের জিনিস রাখা হয়।

এমন একটি ফাংশন get_box_weight ডিফাইন করুন যা একটি বাক্সের মোট ওজন g-এ রিটার্ন করে। এই ফাংশনটি প্যারামিটার হিসেবে নেয়, এই ক্রমে:

  • বাক্সে প্রথম পণ্যের জিনিসের সংখ্যা
  • প্রথম পণ্যের প্রতিটি জিনিসের ওজন, g-এ
  • বাক্সে দ্বিতীয় পণ্যের জিনিসের সংখ্যা
  • দ্বিতীয় পণ্যের প্রতিটি জিনিসের ওজন, g-এ

ধরে নিন একটি খালি বাক্সের ওজন ৫০০ g। সলিউশন ফাইলের শুরুতে একটি কনস্ট্যান্ট WEIGHT_OF_EMPTY_BOX ডিফাইন করা আছে।

উদাহরণ:

get_box_weight(30, 40, 50, 20);
// => 2700

সব আর্গুমেন্ট ১৬-বিট অ-ঋণাত্মক ইন্টিজার, আর রিটার্ন ভ্যালু একটি ৩২-বিট অ-ঋণাত্মক ইন্টিজার।

2. ট্রাকে কতগুলো বাক্স ধরে তা হিসাব করুন

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

এমন একটি ফাংশন max_number_of_boxes ডিফাইন করুন যা রিটার্ন করে একটি নির্দিষ্ট উচ্চতার কতগুলো বাক্স ট্রাকের ভেতরে খাড়াভাবে (একটির উপর আরেকটি) সাজানো যাবে।

এই ফাংশনটি প্যারামিটার হিসেবে নেয় বাক্সের উচ্চতা, cm-এ। ধরে নিন ট্রাকের ভেতরের উচ্চতা ৩০০ cm। সলিউশন ফাইলের শুরুতে একটি কনস্ট্যান্ট TRUCK_HEIGHT ডিফাইন করা আছে।

উদাহরণ:

max_number_of_boxes(30);
// => 10

আর্গুমেন্ট ও রিটার্ন ভ্যালু ৮-বিট অ-ঋণাত্মক ইন্টিজার। বাক্সের উচ্চতা সবসময় কমপক্ষে 2, তাই ফলাফলটি ৮ বিটে ধরে যায়।

3. সব পণ্যের হিসাব মিলেছে কি না যাচাই করুন

নতুন গুদামে একটি চেকলিস্ট আছে, যেখানে প্রতিটি পণ্যের হিসাব না-মেলা জিনিসের সংখ্যা লেখা থাকে। সেখানে আনা প্রতিটি নতুন বাক্সের জন্য, বাক্সে থাকা প্রতিটি পণ্যের চেকলিস্টে নতুন মানটি আপনাকে হিসাব করতে হবে।

এমন একটি ফাংশন items_to_be_moved ডিফাইন করুন যা রিটার্ন করে একটি নির্দিষ্ট পণ্যের কতগুলো জিনিস নতুন গুদামে সরানো বাকি আছে। এই ফাংশনটি প্যারামিটার হিসেবে নেয়, এই ক্রমে:

  • একটি পণ্যের এখনো হিসাব না-মেলা জিনিসের সংখ্যা
  • বাক্সে ওই পণ্যের জিনিসের সংখ্যা

উদাহরণ:

items_to_be_moved(76532, 120);
// => 76412

আর্গুমেন্টগুলো ৩২-বিট অ-ঋণাত্মক ইন্টিজার। রিটার্ন ভ্যালু একটি ৩২-বিট ইন্টিজার। প্রক্রিয়ায় কোনো এরর হলে ফলাফলটি ঋণাত্মক সংখ্যাও হতে পারে।

4. পারিশ্রমিক নিন

আপনার পারিশ্রমিক নির্ভর করে কতগুলো বাক্স সরানো হয়েছে আর কতবার ট্রাকে যাতায়াত করতে হয়েছে তার উপর। প্রতিটি বাক্সের জন্য আপনাকে ৫ ডলার এবং প্রতিটি যাতায়াতের জন্য ২২০ ডলার দেওয়া হবে। সলিউশন ফাইলের শুরুতে PAY_PER_BOX ও PAY_PER_TRUCK_TRIP কনস্ট্যান্ট ডিফাইন করা আছে।

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

এর অর্থ হলো আপনি যে নিট টাকা পাবেন, বা দিতে হবে, তা হলো:

net = boxes * PAY_PER_BOX + trips * PAY_PER_TRUCK_TRIP - up_front - broken_items * item_value

এই পারিশ্রমিক, বা ঋণ, আপনার আর আপনি যে কয়জন কর্মী নিয়েছেন তাদের মধ্যে সমানভাবে ভাগ হবে। যা টাকা, বা ঋণ, বাকি থাকবে তা আপনারই। যেমন, নিট টাকার পরিমাণ 100 যদি 6 জনের (আপনি ও 5 জন কর্মী) মধ্যে ভাগ করা হয়, আপনি পান 20 (100/(5 + 1) = 16 আর বাকি 4)।

এমন একটি ফাংশন calculate_payment ডিফাইন করুন যা রিটার্ন করে শেষে আপনাকে কত টাকা নিতে হবে, বা দিতে হবে। এই ফাংশনটি প্যারামিটার হিসেবে নেয়, এই ক্রমে:

  • আপনি আগাম কত টাকা পেয়েছেন, ৬৪-বিট অ-ঋণাত্মক ইন্টিজার হিসেবে
  • সরানো মোট বাক্সের সংখ্যা, ৩২-বিট অ-ঋণাত্মক ইন্টিজার হিসেবে
  • করা ট্রাক যাতায়াতের সংখ্যা, ৩২-বিট অ-ঋণাত্মক ইন্টিজার হিসেবে
  • ভাঙা বা হারানো জিনিসের সংখ্যা, ৩২-বিট অ-ঋণাত্মক ইন্টিজার হিসেবে
  • প্রতিটি হারানো জিনিসের মান, ৬৪-বিট অ-ঋণাত্মক ইন্টিজার হিসেবে
  • আপনার সাথে পারিশ্রমিক বা ঋণ ভাগ করে নেওয়ার কর্মীর সংখ্যা, ৮-বিট ধনাত্মক ইন্টিজার হিসেবে

উদাহরণ:

calculate_payment(2000, 1000, 5, 21, 2, 1);
// => 2029

রিটার্ন ভ্যালু একটি ৬৪-বিট ইন্টিজার।

GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
x86-64 Assembly Exercism

ইনভেন্টরি ম্যানেজমেন্ট শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, x86-64 Assembly ট্র্যাকের 22টি কনসেপ্ট130টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।