संदर्भ कार्यान्वयन
- 10 मिनट्स
एक संदर्भ कार्यान्वयन किसी समस्या के समाधान को मान्य करने के लिए शर्तों के एक सेट को परिभाषित करता है। संदर्भ कार्यान्वयन का एक सेट छात्रों के लिए निर्धारित समस्या के विभिन्न समाधानों को परिभाषित करता है, और प्रशिक्षकों को एल्गोरिथम शुद्धता के लिए असंरचित छात्र कोड को मान्य करने की अनुमति देता है। PyBryt में, ये संदर्भ pybryt.ReferenceImplementation
वस्तु का रूप लेते हैं, जिसमें एनोटेशन की एक श्रृंखला होती है जो सबमिशन के मेमोरी फुटप्रिंट पर शर्तों का दावा करती है।
संदर्भ कार्यान्वयन को विभिन्न उपयोगों के लिए रखा जा सकता है: आप सही कार्यान्वयन के आधार पर कुछ लिख सकते हैं ताकि यह सत्यापित किया जा सके कि सबमिशन एक स्वीकृत प्रारूप का अनुसरण करता है, या कुछ ऐसा लिख सकते हैं जो छात्रों के लिए सामान्य मुद्दों को ध्वजांकित करने के लिए गलत समाधानों से मेल खाते हैं। वर्णनात्मक एनोटेशन संदेशों के साथ इन सत्यापनों को युग्मित करने से छात्र कार्य के लिए एक मजबूत स्वचालित प्रतिक्रिया प्रणाली की अनुमति मिलती है।
संदर्भ कार्यान्वयन बनाना और जाँचना
संदर्भ कार्यान्वयन कुछ तरीकों से बनाए जा सकते हैं: प्रोग्रामेटिक रूप से एक सूची में एनोटेशन एकत्र करके और pybryt.ReferenceImplementation
ऑब्जेक्ट को तत्काल करके, या एक संदर्भ नोटबुक संकलित करके जिसमें एनोटेशन शामिल हैं। PyBryt स्वचालित रूप से बनाए गए प्रत्येक एनोटेशन को ट्रैक करता है, इसलिए नोटबुक संकलित करते समय, एनोटेशन को सूची में एकत्र करना या संदर्भ कार्यान्वयन ऑब्जेक्ट बनाना आवश्यक नहीं है। इसके बजाय, PyBryt मानता है कि सभी एनोटेशन एकल संदर्भ कार्यान्वयन का हिस्सा हैं और आपके लिए ऑब्जेक्ट बनाता है। आप संदर्भ संकलन के बारे में अधिक जानकारी प्राप्त कर सकते हैं यहाँ.
प्रोग्रामेटिक रूप से एक संदर्भ कार्यान्वयन बनाने के लिए, जैसा कि हम इस मॉड्यूल में करेंगे, एनोटेशन को एक सूची में एकत्र किया जाता है, जिसे बाद में संदर्भ नाम के साथ pybryt.ReferenceImplementation
कन्स्ट्रक्टर को पास किया जाता है। आइए एक संख्या के ओलावृष्टि अनुक्रम खोजने के लिए एक संदर्भ का निर्माण करें। फ़ंक्शन hailstone
अनुक्रम को एक सूची के रूप में लौटाता है और इसमें सूची-निर्माण प्रगति को ट्रैक करने के लिए एनोटेशन शामिल हैं। एनोटेशन तब hailstone_annotations
में संग्रहीत किए जाते हैं।
hailstone_annotations = []
def hailstone(n: int) -> List[int]:
if n == 1:
ret = [n]
elif n % 2 == 0:
ret = [n] + hailstone(n // 2)
else:
ret = [n] + hailstone(3 * n + 1)
hailstone_annotations.append(pybryt.Value(ret))
return ret
आइए हमारे hailstone
कार्यान्वयन का परीक्षण करें। फ़ंक्शन run_hailstone_test_cases
फ़ंक्शन hailstone_fn
पर कुछ परीक्षण मामले चलाता है, जो एक संख्या के हाइलस्टोन अनुक्रम को लौटाता है, प्रत्येक रन से पहले hailstone_annotations
सूची को रीसेट करता है ताकि हम डुप्लिकेट एनोटेशन न बनाएं। आइए इसका उपयोग hailstone
परीक्षण करने के लिए करें:
def run_hailstone_test_cases(hailstone_fn):
global hailstone_annotations
hailstone_annotations = []
assert hailstone_fn(9) == [9, 28, 14, 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]
assert hailstone_fn(50) == \
[50, 25, 76, 38, 19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]
assert hailstone_fn(117) == \
[117, 352, 176, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]
run_hailstone_test_cases(hailstone)
अब hailstone_annotations
सूची का उपयोग करके एक संदर्भ कार्यान्वयन बनाते हैं। संदर्भ को hailstone
कॉल करें।
hailstone_ref = pybryt.ReferenceImplementation("hailstone", hailstone_annotations)
संदर्भ प्रबंधक pybryt.check
का उपयोग करके, हम इस संदर्भ कार्यान्वयन के खिलाफ हमारे परीक्षण मामलों को चला सकते हैं ताकि यह मान्य किया जा सके कि सब कुछ काम कर रहा है:
>>> with pybryt.check(hailstone_ref):
... run_hailstone_test_cases(hailstone)
REFERENCE: hailstone
SATISFIED: True
एकाधिक संदर्भ कार्यान्वयन का उपयोग करना
अब जब हम समझते हैं कि एकल संदर्भों का निर्माण कैसे किया जाता है, तो आइए कई संदर्भों के संयोजन पर एक नज़र डालें। PyBryt के मूल विचारों में से एक लचीला और छात्र-कार्यान्वयन अज्ञेयवादी होना है, जिससे प्रशिक्षकों को विभिन्न तरीकों के लिए कई संदर्भ कार्यान्वयन लिखने की अनुमति मिलती है जिससे छात्र समस्याओं को हल कर सकते हैं। इस लचीलेपन को प्रदर्शित करने के लिए, आइए ओलास्टोन अनुक्रम के लिए एक और संदर्भ बनाएं। पिछले कार्यान्वयन ने नीचे से सूची बनाने के लिए रिकर्सन का उपयोग किया, जिससे हमें इस तरह दिखने वाले एनोटेशन की एक श्रृंखला मिली:
>>> [hailstone_annotations[i].initial_value for i in range(len(hailstone_annotations)) if i < 20]
[[1],
[2, 1],
[4, 2, 1],
[8, 4, 2, 1],
[16, 8, 4, 2, 1],
[5, 16, 8, 4, 2, 1],
[10, 5, 16, 8, 4, 2, 1],
[20, 10, 5, 16, 8, 4, 2, 1],
[40, 20, 10, 5, 16, 8, 4, 2, 1],
[13, 40, 20, 10, 5, 16, 8, 4, 2, 1],
[26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1],
[52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1],
[17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1],
[34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1],
[11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1],
[22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1],
[7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1],
[14, 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1],
[28, 14, 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1],
[9, 28, 14, 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]]
लेकिन मान लीजिए कि छात्र ने इसके बजाय सूची का निर्माण किया, ऊपर से नीचे:
def iterative_hailstone(n: int) -> List[int]:
ret = [n]
while n != 1:
if n % 2 == 0:
n = n // 2
else:
n = 3 * n + 1
ret.append(n)
hailstone_annotations.append(pybryt.Value(ret))
return ret
आइए हमारे संदर्भ के खिलाफ इस कार्यान्वयन का परीक्षण करने का प्रयास करें। हमें यह देखना चाहिए कि यह विफल रहता है, भले ही run_hailstone_test_cases
कोई त्रुटि न उठाए। यह विफलता इसलिए है क्योंकि iterative_hailstone
फ़ंक्शन एक सही कार्यान्वयन है, लेकिन यह उस एल्गोरिथ्म का पालन नहीं करता है जिसकी hailstone_ref
अपेक्षा करता है।
>>> with pybryt.check(hailstone_ref):
... run_hailstone_test_cases(iterative_hailstone)
REFERENCE: hailstone
SATISFIED: False
इस समस्या को हल करने के लिए, आइए iterative_hailstone
अपने संदर्भ में बदल दें:
>>> iterative_hailstone_ref = pybryt.ReferenceImplementation("iterative_hailstone", hailstone_annotations)
>>> iterative_hailstone_ref
<pybryt.reference.ReferenceImplementation at 0x7fe4c242aa10>
एकाधिक संदर्भ कार्यान्वयन के विरुद्ध जाँच चलाने के लिए, उनकी एक सूची में पास करें. आइए pybryt.check
का उपयोग करके हमारे पुराने और नए संदर्भों को मान्य करें; हमें यह देखना चाहिए कि प्रत्येक कार्यान्वयन ने संदर्भों में से एक को संतुष्ट किया, जिससे हमें दो अलग-अलग प्रकार के कार्यान्वयन की जांच करने की अनुमति मिली!
>>> with pybryt.check([hailstone_ref, iterative_hailstone_ref]):
... run_hailstone_test_cases(hailstone)
>>> print()
>>> with pybryt.check([hailstone_ref, iterative_hailstone_ref]):
... run_hailstone_test_cases(iterative_hailstone)
REFERENCE: hailstone
SATISFIED: True
REFERENCE: iterative_hailstone
SATISFIED: False
REFERENCE: hailstone
SATISFIED: False
REFERENCE: iterative_hailstone
SATISFIED: True