ट्रैक
/
Crystal
Crystal
/
अभ्यास
/
मेल्टडाउन रोकथाम
मेल्टडाउन रोकथाम

मेल्टडाउन रोकथाम

सीखने का अभ्यास

परिचय

Crystal में कंट्रोल एक्सप्रेशन होते हैं, जिनसे तय किया जाता है कि प्रोग्राम कैसे चलेगा, और ये ट्रूथी या फॉल्सी वैल्यू लेते हैं। कुछ ऑपरेटर ऐसे भी हैं जिनसे ट्रूथी या फॉल्सी वैल्यू बनाई जा सकती हैं, इन्हें समानता और तुलना के ऑपरेटर कहते हैं।

मुख्य रूप से दो कंट्रोल एक्सप्रेशन हैं जिनसे तय होता है कि कौन-सा कोड चलेगा और कौन-सा नहीं। यानी यह भी कि कौन-सी शाखा चलेगी।

ये दो हैं: if और unless एक्सप्रेशन।

तुलना के ऑपरेटर

तुलना के ऑपरेटर वैल्यू की तुलना करने और true या false वैल्यू लौटाने के लिए इस्तेमाल होते हैं। इन ऑपरेटरों से तुलना करने के लिए एक ही डेटा टाइप की दो वैल्यू चाहिए। अगर वैल्यू एक ही डेटा टाइप की नहीं हैं, तो कंपाइलर एक एरर देता है। यहाँ तुलना के ऑपरेटरों की सूची दी गई है, साथ में एक उदाहरण कि वे कब true वैल्यू देते हैं:

मेथड विवरण उदाहरण
< से कम 4 < 5
<= से कम या बराबर 4 <= 4
> से अधिक 3 > 1
>= से अधिक या बराबर 2 >= 2

समानता के ऑपरेटर

समानता के ऑपरेटर तुलना के ऑपरेटरों जैसे ही हैं, लेकिन इनसे यह जाँचा जाता है कि दो वैल्यू बराबर हैं या नहीं।

== ऑपरेटर जाँचता है कि दो वैल्यू बराबर हैं या नहीं, और साथ ही वैल्यू का डेटा टाइप भी देखता है। अगर वैल्यू समान हैं तो यह true लौटाता है, वरना false लौटाता है। == ऑपरेटर किसी भी डेटा टाइप की वैल्यू की तुलना किसी भी दूसरे डेटा टाइप की वैल्यू से कर सकता है। != भी इसी तरह काम करता है, लेकिन अगर वैल्यू बराबर नहीं हैं तो यह true लौटाता है और बराबर हैं तो false।

if स्टेटमेंट

if स्टेटमेंट से जाँचा जाता है कि दी गई शर्त ट्रूथी है या फॉल्सी। अगर शर्त ट्रूथी है तो if स्टेटमेंट के अंदर का कोड चलेगा। if स्टेटमेंट end कीवर्ड पर खत्म होता है।

if 1 == 1
  puts "1 is equal to 1"
end
# => 1 is equal to 1

if 1 > 2
  puts "1 is greater than 2"
end
# => no output

unless स्टेटमेंट

unless स्टेटमेंट लगभग if स्टेटमेंट की तरह ही काम करता है, लेकिन अगर शर्त फॉल्सी है तो यह unless स्टेटमेंट के अंदर का कोड चलाता है।

unless 1 == 1
  puts "1 is not equal to 1"
end
# => no output

unless 1 > 2
  puts "1 is not greater than 2"
end
# => 1 is not greater than 2

else स्टेटमेंट

else स्टेटमेंट को if और unless स्टेटमेंट के साथ इस्तेमाल किया जा सकता है। अगर if शाखा या unless शाखा नहीं चलती, तो else स्टेटमेंट चलता है।

हालाँकि `else` शाखा का इस्तेमाल `unless,` के साथ किया जा सकता है, लेकिन ऐसा करने की सलाह नहीं दी जाती, क्योंकि इससे कोड पढ़ने में आसानी कम हो जाती है।
इसके बजाय `else` शाखा के साथ `if !condition` इस्तेमाल करने की सलाह दी जाती है।
if 1 == 1
  puts "1 is equal to 1"
else
  puts "1 is not equal to 1"
end
# => 1 is equal to 1

unless 1 < 2
  puts "1 is not greater than 2"
else
  puts "1 is greater than 2"
end
# => 1 is greater than 2

"कैस्केडिंग-if" स्टेटमेंट

elsif स्टेटमेंट को if स्टेटमेंट के साथ इस्तेमाल किया जा सकता है। elsif स्टेटमेंट तब चलता है जब if शाखा नहीं चलती और elsif स्टेटमेंट की शर्त ट्रूथी होती है। elsif स्टेटमेंट एक के बाद एक जोड़े जा सकते हैं, और जिस स्टेटमेंट की शर्त सबसे पहले ट्रूथी होती है, वही चलता है। if स्टेटमेंट के अंत में एक else स्टेटमेंट भी हो सकता है, जो तब चलेगा जब पहले का कोई भी स्टेटमेंट सही न हुआ हो।

if 1 != 1
  puts "1 is not equal to 1"
elsif 1 > 2
  puts "1 is greater than 2"
else
  puts "1 is not equal to 1 and 1 is not greater than 2"
end
# => 1 is not equal to 1 and 1 is not greater than 2

शर्तों के साथ डेटा टाइप

जब वेरिएबल को अलग-अलग डेटा टाइप की वैल्यू असाइन की जाती हैं, तो वेरिएबल दोनों डेटा टाइप रखता है। ऐसा इसलिए होता है क्योंकि कंपाइलर को पता नहीं होता कि कौन-सी शाखा चलेगी। इस एक से अधिक असाइनमेंट को, जिसे यूनियन भी कहा जाता है, आगे के कॉन्सेप्ट में समझाया जाएगा। यह नीचे दिए उदाहरण में देखा जा सकता है:

if 1 == 1
  a = 1
else
  a = "1"
end

typeof(a) # => Int32 | String

टर्नरी ऑपरेटर

Crystal में एक टर्नरी ऑपरेटर होता है, जो एक ही लाइन में लिखा जाने वाला if-else स्टेटमेंट है: condition ? expression_if_truthy : expression_if_falsey

1 == 1 ? puts("1 is equal to 1") : puts("1 is not equal to 1")
# => 1 is equal to 1

निर्देश

इस अभ्यास में हम एक परमाणु रिएक्टर के लिए एक सरल नियंत्रण प्रणाली बनाएँगे।

रिएक्टर को पावर पैदा करने के लिए क्रिटिकैलिटी की स्थिति में होना ज़रूरी है। अगर रिएक्टर क्रिटिकैलिटी से कम की स्थिति में है, तो उसे नुकसान पहुँच सकता है। अगर रिएक्टर की स्थिति क्रिटिकैलिटी से आगे बढ़ जाती है, तो वह ओवरलोड हो सकता है और उसका मेल्टडाउन हो सकता है। हम मेल्टडाउन की संभावना कम करना चाहते हैं और रिएक्टर की स्थिति को ठीक से संभालना चाहते हैं।

नीचे दिए गए तीनों काम आदर्श रिएक्टर स्थिति बनाए रखने वाला कोड लिखने से जुड़े हैं।

1. क्रिटिकैलिटी की जाँच कीजिए

किसी भी नियंत्रण प्रणाली को सबसे पहले यह देखना होता है कि रिएक्टर क्रिटिकैलिटी में संतुलित है या नहीं। अगर रिएक्टर नीचे दी गई शर्तें पूरी करता है, तो उसे क्रिटिकल कहा जाता है:

  • तापमान 800 K से कम हो।
  • प्रति सेकंड उत्सर्जित होने वाले न्यूट्रॉनों की संख्या 500 से अधिक हो।
  • तापमान और प्रति सेकंड उत्सर्जित होने वाले न्यूट्रॉनों की संख्या का गुणनफल 500000 से कम हो।

Reactor.criticality_balanced? नाम का मेथड बनाइए, जो केल्विन में मापा गया temperature और neutrons_emitted पैरामीटर के रूप में लेता है। अगर क्रिटिकैलिटी की शर्तें पूरी होती हैं तो यह true लौटाता है, वरना false।

Reactor.criticality_balanced?(750, 600)
# => true

2. पावर आउटपुट की रेंज तय कीजिए

रिएक्टर के पावर पैदा करना शुरू करने के बाद उसकी दक्षता तय करनी होती है। दक्षता को 4 बैंडों में बाँटा जा सकता है:

  1. green -> 80% या उससे अधिक की दक्षता,
  2. orange -> 80% से कम पर कम से कम 60% की दक्षता,
  3. red -> 60% से कम, पर फिर भी 30% या उससे अधिक की दक्षता,
  4. black -> 30% से कम की दक्षता।

प्रतिशत वैल्यू की गणना (generated_power/theoretical_max_power)*100 से की जा सकती है, जहाँ generated_power = voltage * current है। ध्यान दीजिए कि प्रतिशत वैल्यू आम तौर पर पूर्णांक संख्या नहीं होती, इसलिए < और <= तुलनाओं के सही इस्तेमाल का ध्यान रखिए।

Reactor.reactor_efficiency नाम का मेथड बनाइए, जो तीन पैरामीटर लेता है: voltage, current और theoretical_max_power। यह फंक्शन रिएक्टर का दक्षता बैंड लौटाना चाहिए: "green", "orange", "red", या "black"।

Reactor.reactor_efficiency(200,50,15000)
# => "orange"

3. फेल-सेफ तंत्र

आपके अंतिम काम में ओवरलोड और मेल्टडाउन से बचने के लिए एक फेल-सेफ तंत्र बनाना है। यह तंत्र तय करेगा कि रिएक्टर आदर्श क्रिटिकैलिटी थ्रेशोल्ड से नीचे है, उस पर है, या उससे ऊपर है। इसके बाद रिएक्टर में कंट्रोल रॉड डालकर (या निकालकर) क्रिटिकैलिटी को बढ़ाया, घटाया या रोका जा सकता है।

Reactor.fail_safe() नाम का मेथड बनाइए, जो 3 पैरामीटर लेता है: केल्विन में मापा गया temperature, neutrons_produced_per_second और threshold, और रिएक्टर के लिए एक स्टेटस कोड देता है।

  • अगर temperature * neutrons_produced_per_second, threshold के 90% से कम है, तो "LOW" स्टेटस कोड दीजिए, जो बताता है कि पावर पैदा करने के लिए कंट्रोल रॉड निकालना ज़रूरी है।

  • अगर temperature * neutrons_produced_per_second, threshold के 10% कम या ज़्यादा के भीतर है, तो रिएक्टर क्रिटिकैलिटी में है और "NORMAL" स्टेटस कोड दिया जाना चाहिए, जो बताता है कि रिएक्टर अनुकूल स्थिति में है और कंट्रोल रॉड अपनी आदर्श जगह पर हैं।

  • अगर temperature * neutrons_produced_per_second ऊपर बताई गई रेंज में नहीं है, तो रिएक्टर का मेल्टडाउन होने वाला है और रिएक्टर को तुरंत बंद करने के लिए "DANGER" स्टेटस कोड देना ज़रूरी है।

temperature = 1000
neutrons_produced_per_second = 30
threshold = 5000
Reactor.fail_safe(temperature, neutrons_produced_per_second, threshold)
# => "DANGER"
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Crystal Exercism

मेल्टडाउन रोकथाम शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Crystal को 26 कॉन्सेप्ट142 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।