Julia, 90 karakter
s->all(cumsum(map(i->i∈"!|.\":"?-1:i∈"()_@\$&",mapfoldl(collect,hcat,split(s,"
")))').>-1)
Orijinal çözümün aksine (aşağıda), çözümü belirlemek için matematik kullanılır. mapfoldl(collect,hcat,split(s,"\n"))
(yukarıda \n
karakterleri kaydetmek için gerçek bir satırsonu ile yazılmıştır ) dizeyi 2d karakter dizisine dönüştürür. map(i->i∈"!|.\":"?-1:i∈"()_@\$&",...)
karakter bir bulutsa 1, karakter yağmurda -1 ve aksi takdirde 0 olan bir sayı dizisi oluşturur.
cumsum(...')
satırların kümülatif toplamlarını hesaplar (normal olarak yazılır cumsum(...,2)
, ancak bu noktadan itibaren yönlendirmeyi umursamadığımız için, aktarma yalnızca bir karaktere mal olur) ve daha sonra all(... .>-1)
negatif bir sayı olup olmadığını kontrol eder - negatifler yalnızca yağmur karakteri olduğunda gerçekleşir öncesinde bulut karakteri olmadan görünür.
Julia, 139 136 karakter
s->(t=join(mapfoldl(i->split(i,""),.*,split(s,"
")),"
");while t!=(t=replace(t,r"[()_@$&](.*?)[!|.\":]",s"\g<1>"))end;∩("!|.\":",t)==[])
Bu işlev önce metni satırlar sütun haline gelecek şekilde tersine çevirir. Yeni satırların kodda, örnek başına bir karakter kaydetmek için gerçek satır satırları biçiminde bulunduğunu unutmayın.
İşlev daha sonra bulut / damlacık çiftlerini boşluklarla yinelemeli olarak değiştirir ve tüm bu çiftler kaldırıldığında, kalan damlacıklar varsa true değerini, aksi halde false değerini döndürür.
r"[()_@$&](.*?)[!|.\":]"
- bu, bulut / damlacık çiftlerini tembel bir şekilde eşleştirecek ve grup 1, bulut ve damlacık arasındaki her şeyi içeren bir normal ifade. Ardından s"\g<1>"
, eşleşen bulutu ve damlacıkları kaldırmasını söyler, ancak aradaki öğeleri (bulut içerebileceğinden gerekli) arasında tutun - \g<1>
normal ifadenin 1. grubunda eşleşen şey budur. ∩("!|.\":",t)==[]
damlacık karakterlerinin son dizeyle kesişimini oluşturur ve boşsa damlacık karakterlerinden hiçbiri yoktur ve yağmur yağıyor.