Julia, 90 ký tự
s->all(cumsum(map(i->i∈"!|.\":"?-1:i∈"()_@\$&",mapfoldl(collect,hcat,split(s,"
")))').>-1)
Không giống như giải pháp ban đầu (bên dưới), điều này sử dụng toán học để xác định giải pháp. mapfoldl(collect,hcat,split(s,"\n"))
(được viết ở trên với \n
thay thế bằng một dòng mới thực tế để lưu các ký tự) chuyển đổi chuỗi thành một mảng các ký tự 2d. map(i->i∈"!|.\":"?-1:i∈"()_@\$&",...)
tạo một mảng các số, với 1 nếu ký tự là một đám mây, -1 nếu ký tự đó là mưa và 0 nếu không.
cumsum(...')
tính tổng các khoản tích lũy của các hàng (thông thường sẽ được viết cumsum(...,2)
, nhưng vì chúng tôi không quan tâm đến định hướng từ thời điểm này, nên việc chuyển đổi chỉ tốn một ký tự), và sau đó all(... .>-1)
kiểm tra số âm - sẽ chỉ xảy ra nếu một ký tự mưa xuất hiện mà không có trước một nhân vật đám mây.
Julia, 139 136 ký tự
s->(t=join(mapfoldl(i->split(i,""),.*,split(s,"
")),"
");while t!=(t=replace(t,r"[()_@$&](.*?)[!|.\":]",s"\g<1>"))end;∩("!|.\":",t)==[])
Hàm này trước tiên chuyển văn bản để các hàng trở thành cột và ngược lại. Lưu ý rằng các dòng mới có mặt trong mã dưới dạng các dòng mới thực tế, để lưu một ký tự cho mỗi phiên bản.
Hàm sau đó lặp lại thay thế các cặp đám mây / giọt bằng khoảng trắng và một khi tất cả các cặp như vậy được loại bỏ, nó sẽ trả về true nếu có bất kỳ giọt nào còn lại và sai.
r"[()_@$&](.*?)[!|.\":]"
- đây là một regex sẽ khớp với các cặp đám mây / giọt một cách lười biếng, với nhóm 1 chứa mọi thứ giữa đám mây và giọt nước. Sau đó s"\g<1>"
bảo nó xóa đám mây và các giọt phù hợp, nhưng giữ các thứ ở giữa (cần thiết vì nó có thể chứa các đám mây) - đó \g<1>
là bất cứ thứ gì được khớp trong nhóm 1 của biểu thức chính quy. ∩("!|.\":",t)==[]
sẽ tạo ra giao điểm của các ký tự giọt với chuỗi cuối cùng và nếu nó trống, thì không có ký tự giọt nào xuất hiện và trời đang mưa.