जूलिया, 90 वर्ण
s->all(cumsum(map(i->i∈"!|.\":"?-1:i∈"()_@\$&",mapfoldl(collect,hcat,split(s,"
")))').>-1)
मूल समाधान (नीचे) के विपरीत, यह समाधान को निर्धारित करने के लिए गणित का उपयोग करता है। mapfoldl(collect,hcat,split(s,"\n"))(ऊपर लिखा है\n पात्रों को बचाने के लिए एक वास्तविक नई पंक्ति के प्रतिस्थापित ) स्ट्रिंग को वर्णों के 2d सरणी में परिवर्तित करता है।map(i->i∈"!|.\":"?-1:i∈"()_@\$&",...)संख्या की एक सरणी बनाता है, 1 के साथ यदि चरित्र एक बादल है, -1 यदि चरित्र बारिश है, और 0 अन्यथा।
cumsum(...') पंक्तियों के संचयी योगों की गणना करता है (सामान्य रूप से लिखा जाएगा cumsum(...,2) , लेकिन जब से हम इस बिंदु से अभिविन्यास के बारे में परवाह नहीं करते हैं, केवल एक चरित्र का खर्च होता है), और फिर all(... .>-1)एक नकारात्मक संख्या की जांच करता है - नकारात्मक केवल तभी होगा जब एक बारिश चरित्र एक बादल चरित्र से पहले होने के बिना प्रकट होता है।
जूलिया, 139 136 वर्ण
s->(t=join(mapfoldl(i->split(i,""),.*,split(s,"
")),"
");while t!=(t=replace(t,r"[()_@$&](.*?)[!|.\":]",s"\g<1>"))end;∩("!|.\":",t)==[])
यह फ़ंक्शन पहले पाठ को स्थानांतरित करता है ताकि पंक्तियाँ स्तंभ बन जाएं और इसके विपरीत। ध्यान दें कि नए वर्ण वास्तविक उदाहरण के रूप में कोड में मौजूद हैं, उदाहरण के लिए एक वर्ण को बचाने के लिए।
तब फ़ंक्शन पुनरावृत्तियों से रिक्त स्थान के साथ क्लाउड / छोटी बूंदों के जोड़े को बदल देता है, और एक बार ऐसी सभी जोड़े हटा दिए जाने के बाद, यह सच है अगर कोई बूंदें शेष हैं और अन्यथा झूठी हैं।
r"[()_@$&](.*?)[!|.\":]"- यह एक रेगेक्स है जो एक आलसी तरीके से क्लाउड / छोटी बूंदों के जोड़े से मेल खाएगा, समूह 1 के साथ क्लाउड और ड्रॉपलेट के बीच सब कुछ होगा। फिर s"\g<1>"इसे मिलान किए गए बादल और बूंदों को हटाने के लिए कहता है, लेकिन सामान को बीच में रखें (आवश्यक रूप से इसमें बादल हो सकते हैं) - वह \g<1>है जो रेगेक्स के समूह 1 में मिलान किया गया था। ∩("!|.\":",t)==[]अंतिम स्ट्रिंग के साथ छोटी बूंद वर्णों के प्रतिच्छेदन को उत्पन्न करेगा, और यदि यह खाली है, तो छोटी बूंद पात्रों में से कोई भी मौजूद नहीं है, और बारिश हो रही है।