Я могу сформулировать эту программу в английском предложении: «Вернуть все теги, которые встречаются равномерно среди сообщений.»
Давая имя all_tags
списку тегов и post_tags
списку тегов, связанных с сообщениями, я могу сказать то же самое с этим предложением на языке программирования J
all_tags #~ (#=+/) all_tags e.&>"_ 0 post_tags
Рассмотрим это подробнее:
#~
означает «копия где»
(# = +/)
означает «сумма равна сумме»
e.
означает «существует в»
&>"_ 0
изменяет e.
, поэтому все значения all_tags
сравниваются с каждым из наборов тегов в post_tags
Если мы хотим сделать это программой, которая принимает два аргумента, а не программой, специфичной для этих именованных списков, соответствующая программа может быть:
common_to=: [ #~ [:(#=+/) [ e.&>"_ 0 ]
Запуск этой программы с теми же именами данных будет выглядеть так:
all_tags common_to post_tags
Кажется, стоит отметить, что нам на самом деле не нужен полный список тегов, так как его можно получить. (Расчет ~. ; post_tags
.) Это означает, что мы могли бы написать программу, которая бы принимала только один аргумент. Но так как проблема предполагает, что у нас уже есть список all_tags
, нет необходимости вычислять его снова.