จูเลีย 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)
ตรวจสอบหาจำนวนลบ - เชิงลบจะเกิดขึ้นหากอักขระฝน ปรากฏขึ้นโดยไม่ถูกนำหน้าด้วยอักขระเมฆ
Julia, 139 136 ตัวอักษร
s->(t=join(mapfoldl(i->split(i,""),.*,split(s,"
")),"
");while t!=(t=replace(t,r"[()_@$&](.*?)[!|.\":]",s"\g<1>"))end;∩("!|.\":",t)==[])
ฟังก์ชันนี้แปลงข้อความก่อนเพื่อให้แถวกลายเป็นคอลัมน์และกลับกัน โปรดทราบว่ามีการขึ้นบรรทัดใหม่ในรหัสในรูปแบบของการขึ้นบรรทัดใหม่เพื่อบันทึกหนึ่งอักขระต่อหนึ่งอินสแตนซ์
จากนั้นฟังก์ชั่นจะทำการแทนที่คู่ของ cloud / droplet ด้วยช่องว่างและเมื่อลบคู่ดังกล่าวทั้งหมดแล้วมันจะคืนค่าจริงถ้ามีหยดใด ๆ ที่เหลืออยู่และเป็นเท็จ
r"[()_@$&](.*?)[!|.\":]"
- นี่คือ regex ที่จะจับคู่คลาวด์ / หยดในลักษณะขี้เกียจกับกลุ่มที่ 1 ที่มีทุกสิ่งระหว่างคลาวด์และหยด จากนั้นs"\g<1>"
บอกให้ลบคลาวด์ที่จับคู่และหยด แต่เก็บสิ่งของไว้ในระหว่าง (จำเป็นเนื่องจากมันอาจมีเมฆ) - \g<1>
สิ่งใดก็ตามที่ถูกจับคู่ในกลุ่มที่ 1 ของ regex ∩("!|.\":",t)==[]
จะสร้างจุดตัดของอักขระดรอปเล็ตด้วยสตริงสุดท้ายและถ้าเป็นค่าว่างจะไม่มีอักขระหยดแสดงอยู่และฝนตก