Приём ответов завершён, всем спасибо за участие! Можете оставлять свои решения, но победители уже выбраны и пересчёта не будет.
Приветствую. Задача: Напишите функцию, которая из произвольного входящего массива выберет все комбинации чисел, сумма которых будет равняться 10. Подробнее: Диапазон чисел: 0 - 1000 включительно. Количество чисел во входящем массиве: 1 - 10 включительно. Уже выбранные числа могут использоваться неоднократно, но комбинации должны быть уникальны. --- Смена позиций не делает комбинацию уникальной, т. е. [1,9] и [9,1] не позволяются). --- При входных данных [5,5,2,3] можно сделать [5,5], [5,2,3]. Продолжительность конкурса: 14 дней. Обязательный формат метки ответа (для автоматического парсера в таблицу):
Язык, КоличествоСимволов
Определение победителя: Определяется по градации: Реализация, состоящая из наименьшего количества символов. Реализация, получившая больше всего плюсов (общий рейтинг минус голоса против). Реализация, время первой редакции которой раньше. Необходимо так же давать ссылку на один из онлайн-компиляторов с Вашим рабочим кодом. Тесты приветствуются. Настоятельно рекомендуется давать как конкурсную версию кода (минифицированную и/или с колдунствами), так и наглядное описание этого же кода. Всем интересно не только увидеть языковую магию, но и что-то почерпнуть для себя. От одного участника допустимо несколько ответов, если они реализованы на разных языках. Но не более одного на язык
Все вопросы по деталям и/или разногласиям и/или трактовке условий, прошу обсуждать в комментариях к этому сообщению или в комнате чата по код-гольфу.
Итоги: Стандартные 3 места + 1 за самое большое количество плюсов (общий рейтинг минус голоса против). 1 место: @PavelMayorov - Haskell, 42 символа. 2 место: @ArtemKonovalov - Scala, 69 символов. 3 место: @Mike - Perl, 78 символов. Зрительские симпатии: @D-side (Ruby, 84) - 19 баллов. Поздравления всем участникам, вы хорошо сражались. Особенно страсти накалились в самом конце, когда неожиданно было опубликовано решение обгоняющее лидера на 1 символ. Но судьба вернула всё обратно. Хотелось бы отметить необычное для данного соревнования решение от пользователя @AlexanderGavrikov - 1437 символов! Это своеобразный рекорд, стоит отметить.
Ответ Ruby, 84 91 ->a{(1..a.size).flat_map{|n|a.sort.combination(n).select{|c|c.reduce(:+)==10}.uniq}} Первое решение, которое таки умещается в одну строку при просмотре с сайта! Это литерал лямбды, который надо вызвать с массивом входных данных. Результатом будет массив из найденных комбинаций. Ideone В Ruby функция получения комбинаций элементов массива реализована прямо в классе Array, в стандартной библиотеке. Ой. В остальном, решение максимально прямое и неплохо переводится на естественный язык: (1..a.size) # Для диапазона от 1 до длины массива А .flat_map{ |n| # ...сконкатенировать для каждого N в нём следующее: a.sort # Из отсортированного массива А... .combination(n) # ...взять все комбинации длиной N элементов .select{ |c| # ...выбрав только те С из них, в которых: c.reduce(:+)==10} # Cвёртка С сложением равна 10. .uniq} # ...убрав повторения. Поскольку порядок в комбинациях неважен, чтобы не получить дубликатов, массив можно отсортировать. Можно отсортировать и комбинации постфактум, но это медленнее и требует больше символов.