Это капли дождя:
! | . " :
Это частицы облаков:
( ) _ @ $ &
Я хочу, чтобы вы, при наличии блока текста, убедились, идет ли дождь. Идет дождь, если где-то над каждой дождевой каплей находится облачная частица. На каждую каплю дождя должна быть одна частица облака. Выведите истинное или ложное значение, обозначающее ваши выводы.
Допустимые примеры
(@@@@@@)
( $ & )
Q ( )
.. . !
: .
|" !
.
()()()
......
@_$ &
errrr
h_r-5
.:. .
"
Неверные примеры
!
()
$$$$$
( )
:::::
.....
Это код-гольф, поэтому выигрывает самая короткая программа в персонажах .
Ответы:
APL (30)
Это функция, которая принимает в качестве входных данных матрицу символов и выдает логический вывод.
Тестовое задание:
Объяснение:
⍵∘∊¨'!|.":' '()_@$&'
: для обоих наборов символов (дождь и облака) и для каждого символа в in посмотрите, является ли символ членом набора.+⍀¨
: получить промежуточную сумму для каждого столбца и каждого набора≤/
: для каждой позиции в check убедитесь, что количество капель дождя не превышает количество частиц облаков в текущей сумме∧/∊
: вернуть логическое И всех элементов в результатеисточник
C ++ 11,
186184 байтаUngolfed
Базовый подход: хранение положений облачных частиц в ряду и, если встречается дождевая частица, она проверяет, находится ли облачная частица над ней, и уменьшает счетчик облачных частиц в этом столбце. Программа возвращает 0, если она действительна, и 1 в противном случае.
источник
c-m?0:p[i]++
наp[i]+=c==m
? Или это больше не работает в C ++ 11?Улитки , 125
Программа выводит площадь сетки (или 1, если ее площадь равна 0), если идет дождь; иначе 0. Если бы я только реализовал классы символов в стиле регулярных выражений.
Неуправляемая версия Это содержит поддельные инструкции для облаков или капель дождя вместо того, чтобы выписывать все бред.
\whatever
(заменяется.
на в реальной программе) означает вещь, которая должна быть дождевой каплей, но на самом деле может быть чем угодно, потому что не имеет значения, если мы сопоставим не дождевую каплю с облаком.источник
Python 2, 121 байт
Предполагается, что ввод будет прямоугольным.
источник
JavaScript ES6, 112
Протестируйте приведенный ниже фрагмент в браузере, совместимом с EcmaScript 6, реализующем функции стрелок, оператор распространения и строки шаблонов (я использую Firefox)
источник
Perl 5, 80
79, плюс один
-E
вместо-e
источник
Юлия, 90 знаков
В отличие от исходного решения (ниже), здесь используется математика для определения решения.
mapfoldl(collect,hcat,split(s,"\n"))
(написано выше с\n
заменой фактической новой строки для сохранения символов) преобразует строку в 2d массив символов.map(i->i∈"!|.\":"?-1:i∈"()_@\$&",...)
создает массив чисел, с 1, если символ является облаком, -1, если символ дождь, и 0 в противном случае.cumsum(...')
вычисляет кумулятивные суммы строк (обычно записываетсяcumsum(...,2)
, но, поскольку с этого момента мы не заботимся об ориентации, транспонирование стоит только один символ), а затемall(... .>-1)
проверяет наличие отрицательного числа - отрицания будут появляться только в том случае, если символ дождя появляется без предшествующего облачного персонажа.Юлия,
139136 символовЭта функция сначала транспонирует текст так, что строки становятся столбцами, и наоборот. Обратите внимание, что новые строки присутствуют в коде в виде реальных новых строк, чтобы сохранить один символ на экземпляр.
Затем функция итеративно заменяет пары облако / капля пробелами, и как только все такие пары удаляются, она возвращает true, если есть какие-либо оставшиеся капли, и false в противном случае.
r"[()_@$&](.*?)[!|.\":]"
- это регулярное выражение, которое будет лениво сопоставлять пары облако / капелька, а группа 1 содержит все, что находится между облаком и каплей. Затемs"\g<1>"
говорит ему удалить совпадающее облако и капли, но держать материал между ними (необходимо, поскольку он может содержать облака) -\g<1>
это то, что было найдено в группе 1 регулярного выражения.∩("!|.\":",t)==[]
сгенерирует пересечение символов капли с последней строкой, и если она пуста, то ни один из символов капли не присутствует, и идет дождь.источник
h
в использовании фактическую анонимную функцию. Примерно так:g((s->join(foldl(.*,[split(i,"")for i=split(s,"\n")]),"\n")s->join(foldl(.*,[split(i,"")for i=split(s,"\n")]),"\n"))("()()()\n......"))
- вызов этогоh
просто облегчает вызов .