ট্র্যাক
/
Common Lisp
Common Lisp
/
অনুশীলনী
/
গিগাসেকেন্ড বার্ষিকী
গিগাসেকেন্ড বার্ষিকী

গিগাসেকেন্ড বার্ষিকী

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

ভূমিকা

তারিখ ও সময়

Common Lisp-এ সময় চারটি উপায়ে প্রকাশ করা হয়, যার মধ্যে দুটি নিয়ে এখানে আলোচনা করা হবে।

  • ইউনিভার্সাল টাইম একটি পরম সময়, একটি ইন্টিজার যা 1900-01-01T00:00:00Z থেকে অতিক্রান্ত সেকেন্ডের সংখ্যা প্রকাশ করে (অর্থাৎ UTC-তে ১৯০০ সালের ১ জানুয়ারির মধ্যরাত)।
  • ডিকোডেড টাইম হলো ৯টি মানের একটি টাপল, যেগুলো একসাথে একটি নির্দিষ্ট ক্যালেন্ডার সময় প্রকাশ করে: সেকেন্ড, মিনিট, ঘণ্টা, মাসের দিন, মাস, বছর, সপ্তাহের বার, DST ফ্ল্যাগ, টাইম জোন। (নিচে বিস্তারিত আলোচনা করা হয়েছে।)

ইউনিভার্সাল টাইম

বর্তমান ইউনিভার্সাল টাইম পেতে get-universal-time বা get-decoded-time ব্যবহার করা হয়। প্রথমটি 1900-01-01T00:00Z থেকে বর্তমান সেকেন্ড রিটার্ন করে এবং দ্বিতীয়টি একই ডেটা ডিকোডেড ফরম্যাটে রিটার্ন করে।

ডিকোডেড টাইম

সময় নিয়ে কাজ করার প্রধান ফাংশন দুটি হলো decode-universal-time এবং encode-universal-time। প্রথমটি একটি ইউনিভার্সাল টাইম নেয় এবং একাধিক মান হিসেবে একটি ডিকোডেড টাইম মান রিটার্ন করে, আর দ্বিতীয়টি আর্গুমেন্ট হিসেবে ডিকোডেড টাইম মানগুলো নেয় এবং একটি ইউনিভার্সাল টাইম রিটার্ন করে।

দুটোই একটি ঐচ্ছিক টাইম-জোন আর্গুমেন্ট নেয়। টাইম-জোনের ফরম্যাট নিচে দেখুন।

একটি ডিকোডেড টাইম হলো কিছু মানের একটি সেট:

  • সেকেন্ড: ০ থেকে ৫৯-এর মধ্যে একটি ইন্টিজার
  • মিনিট: ০ থেকে ৫৯-এর মধ্যে একটি ইন্টিজার
  • ঘণ্টা: ০ থেকে ২৩-এর মধ্যে একটি ইন্টিজার
  • মাসের দিন: ১ থেকে ৩১-এর মধ্যে একটি ইন্টিজার (সর্বোচ্চ সীমা আসলে মাস আর বছরের উপর নির্ভর করে, সেটা তো স্পষ্টই)
  • মাস: ১ থেকে ১২-এর মধ্যে একটি ইন্টিজার
  • বছর: বছর নির্দেশ করে এমন একটি ইন্টিজার।
  • সপ্তাহের বার: ০ থেকে ৬-এর মধ্যে একটি ইন্টিজার। ০ মানে সোমবার, ১ মানে মঙ্গলবার ইত্যাদি ... ৬ মানে রবিবার।
  • ডেলাইট সেভিং টাইম ফ্ল্যাগ: ট্রু মান নির্দেশ করে DST চালু আছে।
  • টাইম জোন: UTC থেকে অফসেট বোঝায় এমন -২৪ থেকে ২৪-এর মধ্যে ঘণ্টার একটি সংখ্যা। সংখ্যাটি একটি মূলদ সংখ্যা এবং অবশ্যই 1/3600-এর গুণিতক হতে হবে
(encode-universal-time 1 2 3 4 5 2000 0) ; => 3166398121
(decode-universal-time 3166398121)       ; => 1
                                         ;    2
                                         ;    3
                                         ;    4
                                         ;    5
                                         ;    2000
                                         ;    3 (Thursday)
                                         ;    NIL
                                         ;    0
(decode-universal-time 2208988800) ; => 0
                                   ;    0
                                   ;    0
                                   ;    1
                                   ;    1
                                   ;    1970
                                   ;    3
                                   ;    NIL
                                   ;    0

একাধিক মান

Common Lisp-এ একটি ফাংশন কেবল একটি মানই নয়, একাধিক মানও রিটার্ন করতে পারে। উদাহরণস্বরূপ floor, যা শূন্যের দিকে নিচে নামিয়ে পূর্ণ করে, দুটি মান রিটার্ন করে: প্রথমটি পূর্ণ করা মান এবং দ্বিতীয়টি ভাগশেষ।

(floor 3.5) ; => 3
            ;    0.5

(রিটার্ন করা একাধিক মান আমরা আউটপুটের আলাদা আলাদা লাইনে দেখাব।)

একাধিক মান রিটার্ন করা

আপনি যদি চান একটি ফাংশন একাধিক মান রিটার্ন করুক, তাহলে values অ্যাক্সেসর ব্যবহার করবেন:

(defun three-numbers () (values 1 2 3))
(three-numbers) ; => 1
                ;    2
                ;    3

একাধিক মান সামলানো

আপনি যদি কেবল প্রথম মানটি নিয়েই কাজ করতে চান, তাহলে বিশেষ কিছু করার দরকার নেই, ভাষা নিজেই সেটার ব্যবস্থা করে দেয়:

(+ (values 1 2 3) (values 10 20 30)) ; => 11

তবে ওই বাকি মানগুলোতে অ্যাক্সেস করতে চাইলে আপনাকে কয়েকটি ফাংশন ব্যবহার করতে হবে। প্রধান দুটি ম্যাক্রো হলো multiple-value-list এবং multiple-value-bind। এগুলো এমন কিছুকে মুড়ে দিতে ব্যবহৃত হয় যা একাধিক মান রিটার্ন করে, এবং সমস্ত মান ধরে রাখে। প্রথমটি সমস্ত মানের একটি অ্যারে তৈরি করে। দ্বিতীয়টি আপনাকে প্রতিটি আলাদা মানের সাথে ভ্যারিয়েবল বাইন্ড করতে দেয়।

(multiple-value-list (values 1 2 3))                   ; => (1 2 3)
(multiple-value-bind (a b c) (values 1 2 3) 
   (+ a b c)) ; => 6

আরেকটি কাজের ফাংশন হলো nth-value

নির্দেশনা

Lisp এলিয়েনরা বার্ষিকী উদযাপন করতে পছন্দ করে। তাদের কাছে একটি গুরুত্বপূর্ণ বার্ষিকীর তারিখ হলো গিগাসেকেন্ড। অর্থাৎ, ঘটনাটির ১,০০,০০,০০,০০০ সেকেন্ড পর।

1. গিগাসেকেন্ড বার্ষিকীর তারিখ গণনা করুন

একটি from ফাংশন লিখুন, যা ৬টি প্যারামিটার নেয়: year, month, day, hour, min, sec, এবং গিগাসেকেন্ড বার্ষিকীর তারিখ ও সময় গণনা করে। এই ফাংশনের ইনপুটের প্যারামিটারগুলোর মতো একই ক্রমে ও একই অর্থে তারিখটি একটি অ্যারে হিসেবে রিটার্ন করা উচিত।

(from 2000 1 1 0 0 0) ; => (2031 9 9 1 46 40)
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Common Lisp Exercism

গিগাসেকেন্ড বার্ষিকী শুরু করতে প্রস্তুত?

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