Юлія, 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)==[]
буде генерувати перетин краплинних символів із завершальним рядком, і якщо він порожній, то жоден із символів краплі не присутній, і йде дощ.