क्लोजर में लिस्ट एक कलेक्शन है, बिल्कुल दूसरी भाषाओं की लिस्ट की तरह। Lisp परिवार की दूसरी भाषाओं की तरह क्लोजर भी लिस्ट लिखने के लिए कोष्ठकों का इस्तेमाल करता है।
क्लोजर में लिस्ट बनाने के दो तरीके हैं। list फंक्शन से लिस्ट बना सकते हैं, या किसी लिटरल लिस्ट को quote कर सकते हैं।
लिस्ट इसलिए खास होती हैं क्योंकि क्लोजर इन्हें कॉल मानता है। क्लोजर उम्मीद करता है कि कॉल की शुरुआत एक ऑपरेटर से होगी, जो आम तौर पर एक फंक्शन होता है। लिस्ट के बाकी एलिमेंट ऑपरेंड माने जाते हैं, यानी वे उस फंक्शन के आर्गुमेंट बन जाते हैं।
क्लोजर लिस्ट के साथ जो खास व्यवहार करता है, उसी वजह से हम सीधे लिस्ट लिटरल नहीं बना सकते। quote या उसके छोटे रूप ' से किसी लिस्ट को कोट करने का मतलब है कि उस लिस्ट का मूल्यांकन नहीं होना चाहिए।
कुछ आधुनिक भाषाओं के उलट, क्लोजर की लिस्टों में अलग-अलग तरह की चीज़ें रखी जा सकती हैं, यानी एक ही लिस्ट के अंदर कई डेटा टाइप की चीज़ें हो सकती हैं, जैसे '(2 "a" "b" 3).
बाकी Lisp से अलग, क्लोजर में खाली लिस्ट भी सत्य होती है और nil या false के बराबर नहीं होती।
Elyse अपनी आने वाली Vegas यात्रा में थोड़ा पोकर (और दूसरे कार्ड गेम) खेलने के लिए बहुत उत्सुक है। "self-tracking" की बड़ी प्रशंसक होने के नाते वह कुछ छोटे फंक्शन बनाना चाहती है जो उसके ट्रैकिंग के कामों में मदद करें, और उसने इन्हें अच्छी तरह सोचने में आपसे मदद माँगी है।
Elyse को पोकर खास तौर पर पसंद है, और वह यह ट्रैक करना चाहती है कि वह कितने राउंड खेलती है और कौन-कौन से राउंड खेलती है। हर राउंड का अपना नंबर होता है, और हर टेबल पर अभी खेला जा रहा राउंड नंबर दिखता है। Elyse एक टेबल चुनती है और अपना पहला राउंड खेलने के लिए बैठ जाती है। वह तीन राउंड खेलने की योजना बनाती है।
rounds नाम का एक फंक्शन बनाइए जो वर्तमान राउंड नंबर लेता है और एक ही list लौटाता है, जिसमें वह राउंड और उसके बाद आने वाले अगले दो राउंड होते हैं:
(rounds 27)
;;=> (27 28 29)
Elyse ने पहली टेबल पर कुछ राउंड खेले, फिर ब्रेक लिया और दूसरी टेबल पर कुछ और राउंड खेले ... लेकिन अंत में हर टेबल के लिए अलग ऐरे बन गई! वह दोनों ऐरे को एक साथ रखना चाहती है, ताकि वह पोकर के सारे राउंड एक ही जगह ट्रैक कर सके।
concat-rounds नाम का एक फंक्शन बनाइए जो दो ऐरे लेता है और एक ही list लौटाता है, जिसमें पहली list के सारे राउंड और उसके बाद दूसरी list के सारे राउंड होते हैं:
(concat-rounds '(27 28 29) '(35 36))
;;=> (27 28 29 35 36)
कुछ पिछले पोकर राउंड की बात करते हुए एक और खिलाड़ी कहता है कि उनमें से दो राउंड कितने मिलते-जुलते तरीके से खेले गए थे। Elyse को यकीन नहीं है कि उसने वे राउंड खेले थे या नहीं।
contains-round? नाम का एक फंक्शन बनाइए जो दो आर्गुमेंट लेता है: खेले गए राउंड की एक ऐरे और एक राउंड नंबर। अगर राउंड खेले गए राउंड की ऐरे में है तो फंक्शन true लौटाएगा, और अगर नहीं है तो false:
(contains-round? '(27 28 29 35 36) 29)
;;=> true
(contains-round? '(27 28 29 35 36) 30)
;;=> false
Elyse Black Joe नाम का एक नया गेम आज़माना चाहती है। यह Black Jack जैसा ही है, जिसमें आपका लक्ष्य होता है कि आपके हाथ के कार्डों का जोड़ एक लक्ष्य वैल्यू तक पहुँचे, लेकिन Black Joe में लक्ष्य यह है कि कार्ड की वैल्यू का औसत 7 हो जाए। औसत निकालने के लिए सारी कार्ड वैल्यू को जोड़िए और फिर उस जोड़ को हाथ के कार्डों की संख्या से भाग दीजिए।
card-average नाम का एक फंक्शन बनाइए जो Black Joe के एक हाथ की औसत वैल्यू लौटाए।
(card-average '(5 6 7))
;;=> 6.0
Black Joe में रफ़्तार ज़रूरी है। Elyse औसत निकालने का कोई तेज़ तरीका खोजने की कोशिश करेगी।
उसने औसत जैसी संख्या निकालने के दो तरीके सोचे हैं:
hand, यानी आपके हाथ के कार्डों की वैल्यू रखने वाली ऐरे दी हो, तो approx-average? फंक्शन बनाइए।
ऊपर बताई गई दोनों रणनीतियों में से कोई एक or दोनों अगर वास्तविक औसत के बराबर संख्या देती हैं, तो true लौटाइए।
नोट: माध्यिका निकालना आसान हो जाए, इसलिए सभी हाथों की लंबाई विषम होती है।
(approx-average? '(1 2 3))
;;=> true
(approx-average? '(2 3 4 8 8))
;;=> true
(approx-average? '(1 2 3 5 9))
;;=> false
अपने औसत वाले प्रयोग के नतीजों से उत्साहित Elyse सोच रही है कि क्या सम स्थानों के कार्डों का औसत और विषम स्थानों के कार्डों का औसत एक ही नतीजे देंगे। एक और टेस्ट फंक्शन बनाने का समय आ गया है!
average-even-odd? नाम का एक फंक्शन बनाइए जो एक बूलियन लौटाता है, जो बताता है कि सम इंडेक्स वाले कार्डों का औसत विषम इंडेक्स वाले कार्डों के औसत के बराबर है या नहीं।
(average-even-odd? '(1 2 3))
;;=> true
(average-even-odd? '(1 2 3 4))
;;=> false
Black Joe में हर 11वाँ हाथ एक बोनस हाथ होता है, जिस पर एक बोनस नियम लागू होता है: अगर आपका अंतिम खींचा गया कार्ड जैक है, तो उसकी वैल्यू दोगुनी कर दीजिए।
maybe-double-last नाम का एक फंक्शन बनाइए जो एक हाथ लेता है और जाँचता है कि अंतिम कार्ड जैक (11) है या नहीं। अगर अंतिम कार्ड जैक (11) है, तो हाथ लौटाने से पहले उसकी वैल्यू दोगुनी कर दीजिए।
(maybe-double-last '(5 9 11))
;;=> '(5 9 22)
(maybe-double-last '(5 9 10))
;;=> '(5 9 10)
Exercism पर साइन अप कीजिए और Clojure को 12 कॉन्सेप्ट105 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।