줄리아, 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)==[])
이 함수는 먼저 텍스트를 바꿈으로써 행이 열이되고 그 반대가됩니다. 줄 바꿈은 실제 줄 바꿈 형식으로 코드에 표시되어 인스턴스 당 하나의 문자를 저장합니다.
그런 다음이 함수는 구름 / 방울 쌍을 공백으로 반복적으로 대체하며, 일단 그러한 쌍이 모두 제거되면 방울이 남아 있으면 true를, 그렇지 않으면 false를 반환합니다.
r"[()_@$&](.*?)[!|.\":]"
-이것은 구름과 방울 사이의 모든 것을 포함하는 그룹 1과 함께 게으른 방식으로 구름 / 방울 쌍과 일치하는 정규식입니다. 그런 다음 s"\g<1>"
일치하는 구름과 물방울을 제거하라고 말하지만 (구름이 포함될 수 있으므로) 사이에 물건을 보관하십시오 \g<1>
. ∩("!|.\":",t)==[]
드롭 릿 문자와 최종 문자열의 교차점을 생성하며, 비어 있으면 드롭 릿 문자가없고 비가 내립니다.