paint-brush
লিপ ইয়ার পুনর্বিবেচনা: কেন আপনার প্রিয় প্রোগ্রামিং ভাষার পদ্ধতি ত্রুটিপূর্ণ হতে পারেদ্বারা@mcsee
1,059 পড়া
1,059 পড়া

লিপ ইয়ার পুনর্বিবেচনা: কেন আপনার প্রিয় প্রোগ্রামিং ভাষার পদ্ধতি ত্রুটিপূর্ণ হতে পারে

দ্বারা Maximiliano Contieri5m2024/02/29
Read on Terminal Reader

অতিদীর্ঘ; পড়তে

বেশিরভাগ ভাষা লিপ ইয়ার গণনার জন্য সঠিক আচরণ খুঁজে পেতে ব্যর্থ হয়
featured image - লিপ ইয়ার পুনর্বিবেচনা: কেন আপনার প্রিয় প্রোগ্রামিং ভাষার পদ্ধতি ত্রুটিপূর্ণ হতে পারে
Maximiliano Contieri HackerNoon profile picture
0-item

একটি ঐতিহাসিক ভুল এবং কিভাবে আপনি এটি সমাধান করতে পারেন


TL;DR: বেশিরভাগ ভাষাই লিপ ইয়ার গণনার জন্য সঠিক আচরণ খুঁজে পেতে ব্যর্থ হয়।


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

শিল্প রাষ্ট্র

একটি বছর একটি লিপ (বা না) কিনা তা নির্ধারণ করা একটি সাধারণ গাণিতিক সমস্যা।

প্রতিটি শিক্ষার্থী তাদের প্রথম প্রোগ্রামিং অ্যাসাইনমেন্ট হিসাবে এটি সমাধান করতে পারে।

সমস্যাটি সহজ করার জন্য, ধরা যাক একটি বছর যখন সমানভাবে 4 দ্বারা বিভাজ্য হয় তখন এটি 100 দ্বারা বিভাজ্য হয়, তবে এটি 400 দ্বারা বিভাজ্য হলে এটি একটি অধিবর্ষ।

বাস্তব জগত এবং মহাজাগতিক মেকানিক্স একটু বেশি জটিল, কিন্তু এটি এই নিবন্ধের সুযোগের বাইরে।

চলুন অন্বেষণ করা যাক কিভাবে বিভিন্ন প্রোগ্রামিং ভাষা এই সমস্যার সমাধান করে:

ভয়ঙ্কর অ্যাপ্রোচ

পিএইচপি:

 <?php $yearNumber = 2024; $isLeap = date('L', mktime(0, 0, 0, 1, 1, $yearNumber));

SQL (PostgreSQL):

 SELECT (EXTRACT(year FROM TIMESTAMP '2024-02-29') IS NOT NULL) AS is_leap_year;

এই ভাষাগুলি একটি বৈধ (বা অবৈধ) লিপ ডে তৈরি করার চেষ্টা করে এবং সত্য মূল্যবোধকে কাজে লাগায়।

এই হ্যাকটি ব্যর্থ-দ্রুত নীতি লঙ্ঘন করে এবং বিলিয়ন ডলারের ভুলের অপব্যবহার করে।

একটি অবৈধ তারিখ তৈরি করার চেষ্টা করা গুরুতর ভাষায় একটি ব্যতিক্রম নিক্ষেপ করা উচিত কারণ এটি বাস্তব বিশ্বের ডোমেনে ঘটে।

অন্যান্য ক্রিয়া সম্পাদন করা, যেমন পৃষ্ঠের নীচে ত্রুটিগুলি লুকিয়ে রাখা, অন্তত বিস্ময়ের নীতি লঙ্ঘন করে।

অনুপস্থিত আচরণ

অ্যাডা:

 function Is_Leap_Year (Year : Integer) return Boolean is begin return (Year mod 4 = 0 and then Year mod 100 /= 0) or else (Year mod 400 = 0); end Is_Leap_Year;

C/C++:

 bool isLeapYear(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); }

যাওয়া:

 package main import ( "fmt" "time" ) func isLeapYear(year int) bool { return year%4 == 0 && (year%100 != 0 || year%400 == 0) }

হাসকেল:

 import Data.Time.Calendar (isLeapYear) let year = 2024 let isLeap = isLeapYear year

জাভাস্ক্রিপ্ট/টাইপস্ক্রিপ্ট:

 function isLeapYear(year) { return (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0); }

জুলিয়া:

 using Dates year = 2024 isleap(year)

লুয়া:

 local year = 2024 local isLeap = (year % 4 == 0 and year % 100 ~= 0) or (year % 400 == 0)

ম্যাটল্যাব:

 year = 2024; isLeap = mod(year, 4) == 0 && (mod(year, 100) ~= 0 || mod(year, 400) == 0);

উদ্দেশ্য গ:

 int yearNumber = 2024; BOOL isLeap = (yearNumber % 4 == 0 && yearNumber % 100 != 0) || (yearNumber % 400 == 0);

শক্তির উৎস:

 $yearNumber = 2024 $isLeap = ($yearNumber % 4 -eq 0 -and $yearNumber % 100 -ne 0) -or ($yearNumber % 400 -eq 0)

মরিচা:

 fn is_leap_year(year: i32) -> bool { (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) }

স্বল্প কথা:

 | yearNumber | yearNumber := 2024. (yearNumber \\ 4 = 0) and: [(yearNumber \\ 100 ~= 0) or: [ yearNumber \\ 400 = 0 ]]

উপরের ভাষাগুলি স্থানীয় সমর্থন প্রদান করে না।

আপনাকে গ্লোবাল ফাংশন সংজ্ঞায়িত করতে হবে বা সাহায্যকারী ব্যবহার করতে হবে।

ভুল গ্লোবাল অ্যাপ্রোচ

পিএইচপি (আবার):

 <?php $yearNumber = 2024; $isLeap = checkdate(2, 29, $yearNumber);

আর:

 leap_year(2024)

রুবি:

 year = 2024 is_leap = Date.leap?(year)

সুইফট:

 let yearNumber = 2024 let isLeap = Calendar.current.isDateInLeapYear( Date(timeIntervalSince1970: TimeInterval(yearNumber)))

এই ভাষাগুলি বিশ্বব্যাপী ফাংশন ব্যবহার করে একটি বছর একটি লিপ কিনা তা পরীক্ষা করতে।

এই ইউটিলিটি গ্লোবাল পদ্ধতিগুলি ভুলভাবে ভুল অবস্থানে (একটি বিশ্বব্যাপী অ্যাক্সেস পয়েন্ট) দায়িত্ব রাখে।

সাহায্যকারী খারাপ পদ্ধতির

C#:

 int yearNumber = 2024; bool isLeap = System.DateTime.IsLeapYear(yearNumber);

ডার্ট:

 import 'package:intl/intl.dart'; var year = 2024; var isLeap = DateTime(year).isLeapYear;

পার্ল:

 use Time::Piece; my $yearNumber = 2024; my $isLeap = Time::Piece ->strptime("$yearNumber-01-01", "%Y-%m-%d")->leapyear;

পাইথন:

 import calendar leap = calendar.isleap(2024)

ভিজ্যুয়াল বেসিক .NET:

 Dim year As Integer = 2024 Dim isLeap As Boolean = DateTime.IsLeapYear(year)

এই ভাষাগুলি সাহায্যকারীকে লাইব্রেরি হিসাবে ব্যবহার করে তা পরীক্ষা করার জন্য যে একটি বছর একটি লিপ কিনা।

দায়বদ্ধভাবে ভুল স্থানটি একটি বাস্তব বস্তুতে উপস্থিত নয় তবে তারিখের সময় সম্পর্কিত ফাংশনগুলির একটি ব্যাগে থাকে৷

বছরের পদ্ধতি

জাভা:

 int yearNumber = 2024; boolean isLeap = java.time.Year.of(yearNumber).isLeap();

কোটলিন:

 val yearNumber = 2024 val isLeap = java.time.Year.of(yearNumber).isLeap

স্কেলা:

 val year = 2024 val isLeap = java.time.Year.of(year).isLeap

এই ভাষাগুলি একটি লাফ কিনা তা পরীক্ষা করার জন্য বছরের উপর নির্ভর করে।

প্রোটোকলটি বিজেকশনে বাস্তব জগতের কাছাকাছি

লক্ষ্য করুন যে তারা বছরের অবজেক্ট তৈরি করে এবং পূর্ণসংখ্যা বস্তু তৈরি করে না কারণ এটি বিজেকশনটিও ভেঙে দেবে।

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

একটি বছর বলতে পারে এটি একটি লিপ কিনা (একটি পূর্ণসংখ্যা এটি করা উচিত নয়) এবং আপনাকে এর মাসগুলি সম্পর্কে বলতে পারে (যা মাসগুলি , 0-ভিত্তিক পূর্ণসংখ্যা নয়, 1-ভিত্তিক পূর্ণসংখ্যা বা স্ট্রিং)৷

বিপরীতভাবে, একটি পূর্ণসংখ্যার ক্ষমতাগুলি পাটিগণিত ক্রিয়াকলাপ যেমন গুণ এবং সূচকে প্রসারিত হয়।

সময় একটি রসিকতা নয়

একটি ফ্লোট , পূর্ণসংখ্যা , বা অন্য কোনো ডেটা টাইপ হিসাবে সময়ের মধ্যে একটি বিন্দুকে উপস্থাপন করা ফলাফলের সাথে আসে।

আপনি ক্ষুদ্র ভগ্নাংশে বাস্তব জগতে সময়ের একটি বিন্দু ভাঙতে পারেন (কিন্তু খুব ছোট নয়)

ফ্লোট ব্যবহার করা একটি বৈধ বিকল্প নয়।

0.01 + 0.02 0.03 নয়, এবং এটি সময়মতো ফ্লোটিং পয়েন্ট পয়েন্টগুলির সাথে মোকাবিলা করার ভয়ানক পরিণতি রয়েছে।

চ্যালেঞ্জ

আমরা লিপ বছর সম্পর্কে কথা বলছি.

একটি বছর যদি একটি লিপ হয় জানার প্রয়োজন কি?

28শে ফেব্রুয়ারি, 2024 এর উত্তরসূরিকে আপনার মডেলের তারিখ এবং সময় মেকানিক্স জানতে হবে।

কিন্তু এটা আপনার সমস্যা না .

তথ্য গোপন করার নীতি অনুসরণ করে, আপনার ব্যক্তিগত প্রোটোকল হিসাবে দায়িত্ব ছেড়ে দেওয়া উচিত।

উপসংহার

সিলভার বুলেট নেই।

আপনার ভাষা বুদ্ধিমানের সাথে ব্যবহার করুন।

আজ 29শে ফেব্রুয়ারী, আপনি প্রতিদিন যে সরঞ্জামগুলি ব্যবহার করেন সেগুলিকে বিরতি এবং প্রতিফলিত করার জন্য একটি লিপ ডে৷

4 বছরে দেখা হবে।