paint-brush
लीप वर्ष पर पुनर्विचार: आपकी पसंदीदा प्रोग्रामिंग भाषा का दृष्टिकोण दोषपूर्ण क्यों हो सकता हैद्वारा@mcsee
1,059 रीडिंग
1,059 रीडिंग

लीप वर्ष पर पुनर्विचार: आपकी पसंदीदा प्रोग्रामिंग भाषा का दृष्टिकोण दोषपूर्ण क्यों हो सकता है

द्वारा Maximiliano Contieri5m2024/02/29
Read on Terminal Reader

बहुत लंबा; पढ़ने के लिए

अधिकांश भाषाएँ लीप वर्ष की गणना के लिए सही व्यवहार खोजने में विफल रहती हैं
featured image - लीप वर्ष पर पुनर्विचार: आपकी पसंदीदा प्रोग्रामिंग भाषा का दृष्टिकोण दोषपूर्ण क्यों हो सकता है
Maximiliano Contieri HackerNoon profile picture
0-item

एक ऐतिहासिक गलती और आप इसे कैसे हल कर सकते हैं


टीएल;डीआर: अधिकांश भाषाएं लीप वर्ष की गणना के लिए सही व्यवहार खोजने में विफल रहती हैं।


अस्वीकरण: हालाँकि मैंने विभिन्न प्रोग्रामिंग भाषाओं में सटीक जानकारी प्रदान करने की पूरी कोशिश की है, लेकिन मैं स्वीकार करता हूँ कि मैं हर भाषा में विशेषज्ञ नहीं हो सकता हूँ। यदि आपको कोई त्रुटि दिखती है या किसी बिंदु से असहमत हैं, तो कृपया एक सम्मानजनक टिप्पणी छोड़ें, और मैं तुरंत इसका समाधान करूंगा।

द स्टेट ऑफ़ आर्ट

यह निर्धारित करना कि कोई वर्ष एक छलांग है (या नहीं) एक सरल गणितीय समस्या है।

प्रत्येक छात्र इसे अपने पहले प्रोग्रामिंग असाइनमेंट के रूप में हल कर सकता है।

समस्या को सरल बनाने के लिए, मान लें कि एक वर्ष लीप वर्ष है जब यह 4 से समान रूप से विभाज्य है, सिवाय इसके कि यह 100 से भी विभाज्य है, लेकिन यह एक लीप वर्ष है यदि यह 400 से विभाज्य है।

वास्तविक दुनिया और ब्रह्मांडीय यांत्रिकी थोड़ी अधिक जटिल हैं, लेकिन यह इस लेख के दायरे से परे है।

आइए जानें कि कितनी प्रोग्रामिंग भाषाएं इस समस्या का समाधान करती हैं:

भयानक दृष्टिकोण

पीएचपी:

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

एसक्यूएल (पोस्टग्रेएसक्यूएल):

 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;

सी/सी++:

 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 (फिर से):

 <?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)))

ये भाषाएँ यह जाँचने के लिए वैश्विक फ़ंक्शंस का उपयोग करती हैं कि क्या कोई वर्ष एक छलांग है।

ये उपयोगिता वैश्विक विधियां गलती से जिम्मेदारी को गलत स्थान (एक वैश्विक पहुंच बिंदु) पर रख देती हैं।

सहायकों का बुरा दृष्टिकोण

सी#:

 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-आधारित पूर्णांक, या स्ट्रिंग)।

इसके विपरीत, एक Integer की क्षमताएं गुणन और घातांक जैसे अंकगणितीय परिचालनों तक विस्तारित होती हैं।

समय कोई मज़ाक नहीं है

समय में एक बिंदु को फ़्लोट , पूर्णांक , या किसी अन्य डेटा प्रकार के रूप में प्रस्तुत करना परिणाम के साथ आता है।

आप वास्तविक दुनिया में समय के एक बिंदु को छोटे-छोटे अंशों में तोड़ सकते हैं (लेकिन बहुत छोटे नहीं)

फ़्लोट का उपयोग करना कोई वैध विकल्प नहीं है.

0.01 + 0.02 0.03 नहीं है, और समय में फ़्लोटिंग पॉइंट बिंदुओं से निपटने में इसके भयानक परिणाम होते हैं।

चुनौती

हम लीप वर्ष के बारे में बात कर रहे हैं।

यह जानने की क्या आवश्यकता है कि क्या एक वर्ष एक लीप है?

आपके मॉडल की दिनांक और समय यांत्रिकी 28 फरवरी, 2024 के उत्तराधिकारी को जानने की आवश्यकता है।

लेकिन यह आपकी समस्या नहीं है.

जानकारी छुपाने के सिद्धांत का पालन करते हुए, आपको जिम्मेदारी को एक निजी प्रोटोकॉल के रूप में छोड़ देना चाहिए।

निष्कर्ष

कोई सिल्वर बुलेट नहीं है.

अपनी भाषा का प्रयोग सोच-समझकर करें।

आज 29 फरवरी है, जो आपके द्वारा प्रतिदिन उपयोग किए जाने वाले उपकरणों पर रुकने और विचार करने का एक महत्वपूर्ण दिन है।

4 साल में मिलेंगे.