حساب-العمر

خلف الكواليس: كيف برمجتُ رياضيات السنة الكبيسة الهجرية (ولم أُصب بالجنون تمامًا!)

تعرف على التحديات الحقيقية وراء برمجة حسابات السنة الكبيسة الهجرية، وكيف حولتُ الإحباط الأولي إلى حل برمجي دقيق. هذه رحلة برمجية من الفوضى إلى الفهم.

دعني أبدأ بالاعتراف: أنا أحب الأرقام. أحب المنطق، أحب المعادلات التي تتطابق تمامًا. لكن هذا الحب وُضع على المحك بطريقة لم أتوقعها أبدًا عندما قررت أن أتعمق في برمجة التقويم الهجري، وتحديدًا، معضلة “السنة الكبيسة الهجرية”.

أتذكر بوضوح تلك الأمسية. كنت قد قضيت أيامًا في محاولة بناء محول تاريخ ميلادي/هجري بسيط لمشروع جانبي. كل شيء كان يسير على ما يرام، حتى وصلت إلى جزء “السنة الكبيسة”. يا إلهي، لقد بدأت أشعر وكأن دماغي يتحول إلى حبر أسود يتسرب ببطء من أذني. كان الأمر معقدًا بشكل غير ضروري، على ما بدا لي حينها.

توقعت أن أجد قاعدة بسيطة، مثل “كل أربع سنوات هي سنة كبيسة” كما هو الحال في التقويم الميلادي. لكنني وجدت نفسي أمام عدة خوارزميات، كل واحدة منها تدعي أنها “الأكثر دقة” أو “الأكثر استخدامًا”. كنت أقرأ وثيقة تلو الأخرى، عقلي يصرخ في وجهي: “يا رجل، هل هذا حقًا ما تفعله في ليلة الجمعة؟!”

جربت تطبيق الطريقة “القياسية” التي وجدتها في منتدى برمجي قديم. كانت تقول ببساطة: “اضرب عددًا صحيحًا في كسر ما، ثم تحقق من الباقي.” حسناً، فعلت ذلك. ونتجت عن ذلك أخطاء في التواريخ. كنت أدخل تاريخًا معروفًا، ويخرج لي تاريخ مختلفًا ليوم أو يومين. تخيل معي، يوم أو يومين! هذا كافٍ تمامًا لتدمير أي نظام يعتمد على الدقة الزمنية، وكافٍ لجعلني أضرب رأسي في لوحة المفاتيح.

بدأت أشك في قدراتي، وأشك في أنني اخترت مشروعًا أكبر من أن أتحمله. شعرت بالإحباط يتسلل إلى عظامي، مثل برد الشتاء القارس. كانت أكواب القهوة تتراكم على مكتبي، ورائحة الشاي الأخضر البارد تملأ الغرفة. كنت أكتب أكوادًا، أمحو أكوادًا، ثم أكتبها مرة أخرى. الأمر أشبه بمحاولة فك شفرة رسالة قديمة مكتوبة بلغة لا يعرفها أحد.

لكن هنا يكمن جمال البرمجة، أليس كذلك؟ هي تحدٍ مستمر. وبعد عدة ليالٍ من الأرق والسهر، وصلت إلى الفهم الذي غير كل شيء. الأمر لا يتعلق فقط بالرياضيات، بل بالمنطق الكامن وراء تلك الرياضيات، وكيفية ترجمتها إلى كود صلب وموثوق.

فهم السنة الكبيسة الهجرية: ليست مجرد إضافة يوم!

السنة الكبيسة الهجرية هي سنة تحتوي على 355 يومًا بدلًا من 354، وذلك بزيادة يوم واحد على شهر ذي الحجة ليتوافق التقويم القمري مع الدورات الفلكية بشكل أدق. تحدث هذه السنوات وفقًا لدورة محددة، وهي ليست بنفس بساطة التقويم الميلادي.

على عكس التقويم الميلادي الذي يضيف يومًا في فبراير كل 4 سنوات بشكل عام (مع بعض الاستثناءات المعقدة)، فإن التقويم الهجري له نظامه الخاص. السنة الهجرية هي سنة قمرية، تعتمد على دورة القمر، لذا فهي أقصر من السنة الشمسية بحوالي 10 إلى 11 يومًا. لتعويض هذا النقص وتصحيح التراكمات الصغيرة في الدورات القمرية، تم تصميم نظام السنة الكبيسة.

السنوات الكبيسة الهجرية لا تحدث بشكل عشوائي، بل تتبع دورة 30 عامًا. في كل دورة مدتها 30 عامًا، هناك 11 سنة كبيسة. وهذا هو جوهر اللغز الذي كان يحيرني! لم يكن الأمر مجرد “كل X سنوات”، بل كان نمطًا محددًا داخل دورة أكبر.

لماذا تختلف عن الميلادي؟ (وجهة نظر شخصية)

التقويم الهجري، بفضل طبيعته القمرية، مرتبط بشكل مباشر بظواهر فلكية مرئية – رؤية الهلال. هذا يجعله أكثر “حيوية” و”عضوية” من التقويم الميلادي الذي يعتمد على حسابات شمسية دقيقة لا يراها الإنسان بالعين المجردة. هذا الارتباط بالظواهر الطبيعية يجعله فريدًا ومثيرًا للاهتمام، لكنه أيضًا يزيد من تعقيد برمجته.

رأي قوي: أعتقد أن التفكير في التقويم الهجري على أنه “أقل دقة” من الميلادي بسبب تقصيره أو اختلاف طريقة السنة الكبيسة هو سوء فهم لطبيعته. كل تقويم مصمم لغرض معين ووفقًا لمبادئ معينة. التقويم الهجري دقيق للغاية ضمن إطاره القمري، وهو يخدم غرضه الأساسي في تنظيم العبادات والمناسبات الإسلامية بشكل مثالي. الدقة هنا ليست “كمية الأيام” بل “التزامن الفلكي”.

فك شفرة الدورة: كيف يعمل نمط الـ 30 عامًا؟

في كل دورة هجرية مدتها 30 عامًا، تقع السنوات الكبيسة في سنوات محددة: 2 و5 و7 و10 و13 و16 و18 و21 و24 و26 و29. هذا النمط الثابت هو المفتاح لبرمجة حسابات السنة الكبيسة الهجرية بدقة.

عندما اكتشفت هذه الدورة، شعرت وكأن خيوط الشبكة المعقدة بدأت تتضح أمامي. لم يعد الأمر مجرد أرقام عشوائية، بل نمط محكم ودقيق. السنوات المحددة في هذه الدورة (التي ذكرتها أعلاه) هي التي يضاف فيها اليوم الواحد إلى ذي الحجة، ليصبح 30 يومًا بدلًا من 29.

لماذا هذه السنوات بالذات؟

السبب يعود إلى محاولة موازنة دورة القمر الحقيقية مع التقويم البشري. دورة القمر الشهرية ليست بالضبط 29.5 يومًا، بل أقصر قليلاً. هذه الفروقات الصغيرة تتراكم بمرور الوقت، ولتصحيحها، يتم إضافة الأيام في السنوات الكبيسة المحددة هذه. إنه توازن دقيق بين الرياضيات الفلكية والتقويم العملي.

مثال تطبيقي: إذا كانت لدينا سنة هجرية رقمها 1445. لمعرفة ما إذا كانت كبيسة، نقوم أولاً بحساب باقي قسمة 1445 على 30. (1445 % 30 = 5). بما أن 5 موجود في قائمة السنوات الكبيسة (2، 5، 7، 10…)، فهذا يعني أن سنة 1445 الهجرية هي سنة كبيسة.

برمجة السنة الكبيسة الهجرية: من الفوضى إلى الكود النظيف

لبرمجة السنة الكبيسة الهجرية، يجب أولاً تحديد رقم السنة الهجرية، ثم استخدام عملية القسمة وباقي القسمة لمعرفة موقع السنة ضمن دورة الثلاثين عامًا، ومقارنتها بقائمة السنوات الكبيسة المعترف بها. هذا يضمن الدقة في تحديد طول شهر ذي الحجة.

بعد كل التخبط والإحباط، عندما استوعبت أخيرًا مفهوم دورة الـ 30 عامًا والسنوات المحددة، بدأت الأمور تتضح. تحولت الفوضى في رأسي إلى تسلسل منطقي يمكن ترجمته إلى كود.

الخطوات البرمجية (كيف فعلتها بنفسي):

  1. دالة is_hijri_leap_year(year):
    • تأخذ هذه الدالة رقم السنة الهجرية كمدخل.
    • تقوم بحساب remainder = year % 30. (هذا يحدد موقع السنة ضمن دورة الـ 30 عامًا).
    • تتحقق مما إذا كان remainder موجودًا في قائمة السنوات الكبيسة (مثل [2, 5, 7, 10, 13, 16, 18, 21, 24, 26, 29]).
    • تُرجع True إذا كانت السنة كبيسة، و False إذا لم تكن كذلك.
  2. تطبيق هذا في حساب طول الشهر:
    • عند حساب طول شهر ذي الحجة، استخدم هذه الدالة.
    • إذا كانت is_hijri_leap_year(current_hijri_year) تُرجع True، فاجعل طول ذي الحجة 30 يومًا.
    • وإلا، فاجعل طوله 29 يومًا.

Wait, it gets worse (or better?): أثناء البحث والبرمجة، اكتشفت أن هناك بالفعل “طريقتين” رئيسيتين لحساب التقويم الهجري: التقويم الهجري المحسوب (المجدول)، الذي يعتمد على هذه الدورة الثابتة لـ 30 عامًا، والتقويم الهجري المعتمد على الرؤية الشرعية، الذي يعتمد على رؤية الهلال الفعلي. الكود الذي كتبته يعتمد على التقويم المحسوب، وهو الأكثر استخدامًا في البرمجيات والمواقع لسهولة تطبيقه. بالطبع، التقويم الشرعي له مكانته وأهميته الخاصة.

مقارنة خوارزميات تحديد السنة الكبيسة الهجرية

الميزةالخوارزمية المجدولة (30 عامًا)طريقة “باقي القسمة” المبسطة (الخاطئة)التقويم الشرعي (رؤية الهلال)
الأساسدورة ثابتة من 30 عامًاافتراضات رياضية غير كاملةرؤية الهلال الفعلية بالعين المجردة
الدقةعالية للبرمجة والحساباتمنخفضة، قد تؤدي لأخطاء بيوم أو يوميندقيقة جداً من الناحية الشرعية
التعقيد البرمجيمتوسط إلى منخفضمنخفضة، لكنها غير موثوقةعالية، تتطلب إدخال بيانات خارجية
التطبيق العمليللمحولات الرقمية، قواعد البياناتغير موصى بهاللمناسبات الدينية والتوقيتات الرسمية

رأي قوي أخير: استخدام خوارزمية “باقي القسمة” المبسطة التي حاولت تطبيقها في البداية هي مثال ساطع على مخاطر التسرع في البرمجة دون فهم كامل للمشكلة. إنها توفر “حلًا سريعًا” لكنها تنتج “أخطاء بطيئة” تتراكم مع الزمن، وتتسبب في فروقات بسيطة لكنها حاسمة. دائمًا ما يستحق الأمر قضاء الوقت الإضافي لفهم الجذور الحقيقية للمشكلة.

خاتمة

في النهاية، هذه الرحلة مع السنة الكبيسة الهجرية لم تكن مجرد تمرين برمجي. كانت درسًا عميقًا في الصبر، في أهمية البحث الدقيق، وفي عدم الاستسلام عندما تبدو الأمور مستحيلة. لقد تعلمت أن التعقيد ليس دائمًا عائقًا، بل هو دعوة لفهم أعمق.

إذا كنت مبرمجًا طموحًا، أو حتى مجرد فضولي حول كيفية عمل الأشياء خلف الكواليس، فأتمنى أن تكون هذه القصة قد ألهمتك. تذكر، كل قطعة كود تكتبها، كل مشكلة تحلها، هي خطوة في رحلة تعلم لا نهاية لها.

Facebook
Twitter
LinkedIn
WhatsApp

Leave a Reply

Your email address will not be published. Required fields are marked *