Найти сумму всех чисел ниже n, кратных некоторому набору чисел

31

Почти эквивалентно первому вопросу проекта Эйлера:

Если мы перечислим все натуральные числа ниже 10, кратные 3 или 5, мы получим 3, 5, 6 и 9. Сумма этих кратных равна 23.

Найти сумму всех кратных 3 или 5 ниже 1000.

Вызов:

Учитывая положительное целое число Nи набор по крайней мере одного положительного целого числа A, выведите сумму всех положительных целых чисел, меньшую, чем Nкратные по крайней мере одного члена A.

Например, для случая Project Euler вход будет:

1000
3
5

Тестовые случаи:

Input : 50, [2]
Output: 600

Input : 10, [3, 5]
Output: 23

Input : 28, [4, 2]
Output: 182

Input : 19, [7, 5]
Output: 51

Input : 50, [2, 3, 5]
Output: 857
Цисплатин
источник
4
1) Считаем ли мы числа, кратные обоим, в два раза? 2) Можем ли мы получить только два других числа? или любую сумму скажем один или 3?
Wheat Wizard
3
Можете ли вы дать несколько тестов? Очевидно, что не публикуйте ответ на вопрос PE, но как насчет других примеров?
Rɪᴋᴇʀ
1
@WheatWizard: слово «или» подразумевает, что каждое число считается не более одного раза. Я согласен, что вопрос должен прояснить, сколько «чисел для проверки на множественность» аргументов должно быть поддержано. Точно два? Один или больше? Ноль или больше?
Smls
1
Можем ли мы взять « числа, равные или ниже 10 », или взять 9 в качестве ввода вместо 10?
Стьюи Гриффин
"и набор по крайней мере одного положительного целого числа A", насколько большим может быть набор?
Betseg

Ответы:

13

Желе , 6 байт

ḍþṖḅTS

Попробуйте онлайн!

Как это работает

ḍþṖḅTS  Main link. Left argument: D (array). Right argument: n (integer)

ḍþ       Divisible table; test each k in [1, ..., n] for divisibility by all
        integers d in D.
  Ṗ     Pop; discard the last Boolean array, which corresponds to n.
   ḅ    Unbase; convert the Boolean arrays of base n to integer. This yields a 
        non-zero value (truthy) and and only if the corresponding integer k is 
        divisible by at least one d in D.
    T   Truth; yield the array of all indices of truthy elements.
     S  Compute their sum.
Деннис
источник
3
Конечно, @Dennis должен прийти с чем-то, что заставит вас задуматься о том, что вы делаете на PPCG
Grajdeanu Alex.
8

Python, 59 55 байт

lambda n,l:sum(v*any(v%m<1for m in l)for v in range(n))

repl.it

Безымянная функция принимает целое число nи список целых чисел l. Обходит диапазон натуральных чисел (плюс ноль) до, но не включая, nи сумм ( sum(...)) тех, которые имеют остаток после деления на ноль ( v%m<1) для anyцелых чисел mв списке l. Использует умножение, а не условное, чтобы сохранить 3 байта.

Джонатан Аллан
источник
8

Октава, 38 36 33 байта

@(x,y)(1:--x)*~all(mod(1:x,y),1)'

Возьмите вход как: f(10, [3;5]). Это будет на 2 байта короче, если вводf(9,[3;5]) для одного и того же контрольного примера.

Проверьте все контрольные примеры здесь.


Объяснение:

@(x,y)        % Anonymous function that takes two inputs, x and y
              % x is a scalar and y is a vertical vector with the set of numbers
(1:--x)*      % Pre-decrement x and create a vector 1 2 ... x-1    

Октава может предварительно уменьшать, поэтому 1:--xвместо1:x-1 (два раза) сохраняет два байта.

mod(a,b)дает 1 2 0 1 2 0 1 2 0за mod(1:9,3). Если второй аргумент является вертикальным вектором, он будет реплицировать первый вход по вертикали и принимать модуль для каждого из значений во втором входном аргументе. Итак, для ввода mod(1:9, [3;5])это дает:

1 2 0 1 2 0 1 2 0
1 2 3 4 0 1 2 3 4

Принятие ~all(_,1)этого дает trueдля столбцов, где по крайней мере одно значение равно нулю, и falseгде все значения отличны от нуля:

~all(mod(1:x,y),1)
0 0 1 0 1 1 0 0 1

,1Требуется в случае , если имеется только один номер в y. В противном случае он будет действовать на весь вектор, а не на число за номером.

Транспонирование этого в вертикальную матрицу и использование умножения матриц даст нам правильный ответ без необходимости явного суммирования:

Стьюи Гриффин
источник
О, это жестоко: мне пришлось добавить 2 байта из-за разницы между x и x – 1, но вы должны были добавить 4 байта, и я теперь впереди на 1 байт> :)
Грег Мартин
6

JavaScript (ES6), 40 39 36 байт

Ввод: целое число nи массив целых чисел aс синтаксисом карри(n)(a)

n=>F=a=>n--&&!a.every(v=>n%v)*n+F(a)

Контрольные примеры

Arnauld
источник
У меня был немного другой состав для одной и той же длины: f=(n,a)=>n--&&a.some(v=>n%v<1)*n+f(n,a). Лучшее, что я мог сделать нерекурсивно - 61 байт.
Нил
@Neil Ваш комментарий подтолкнул меня к поиску еще одной формулировки. Интересно, что синтаксис карри экономит 3 байта.
Арно
5

MATL , 9 байт

q:ti\~*us

Попробуйте онлайн!

Луис Мендо
источник
1
Просто проверяю, правильно ли я прочитал (без проверки документации). Вы уменьшаете, создавая вектор 1 2 .... Вы дублируете его и берете модуль другого входа. Вы отрицаете это и умножаете на вектор 1 2 .., используете уникальные, чтобы избавиться от дубликатов и, наконец, суммировать ...
Stewie Griffin
В точку! Я на мобильном телефоне, поэтому я не включил объяснение. Теперь это не нужно :-)
Луис Мендо
4

Python, 67 байт

a,b,c=input()
x=y=0
exec("if x%c<1or 1>x%b:y+=x\nx+=1\n"*a)
print y

После написания этого я заметил, что мой код был похож на существующий ответ на Python, однако я придумал его независимо и в любом случае публикую его.

Rɪᴋᴇʀ
источник
Тебе не нужна точка с запятой в exec, так как в любом случае после нее у тебя разрыв строки. Я знал, что мой ответ может быть перехвачен!
Тео
Спецификация говорит "набор по крайней мере одного положительного целого числа"; это, кажется, обрабатывает только случай, когда набор состоит из двух целых чисел. Кроме того, наличие x=y=0на отдельной строке сэкономит четыре байта.
Джонатан Аллан
@JonathanAllan круто, большое спасибо!
Rɪᴋᴇʀ
4

Mathematica, 37 27 байт

Спасибо Мартину Эндеру за проницательное наблюдение, которое привело к большой экономии байтов!

Tr[Union@@Range[#,#2-1,#]]&

Безымянная функция, принимающая два аргумента, список #целых чисел (требуемые делители A) и целое число #2(верхняя граница N) и возвращающая целое число. Range[#,#2-1,#]дает для каждого элемента dсписка #все кратные числа, dменьшие или равные #-1(следовательно, меньшие #); объединение этих списков затем вычисляется и суммируется Tr.

Предыдущая версия:

Tr[x=#;Union@@(Range[#,x-1,#]&/@#2)]&
Грег Мартин
источник
1
Rangeв списке: Tr[Union@@Range[#2,#-1,#2]]&(а затем сохранить еще один байт, меняя порядок входов)
Мартин Эндер
4

Perl 6 , 25 байт

{sum grep *%%@_.any,^$^a}

Лямбда, которая принимает входные числа в качестве аргументов. (Один аргумент для N и произвольное количество аргументов для A).

( Попробуйте онлайн. )

Объяснение:

  • { ... }Лямбда
  • $^a: Первый аргумент лямбды
  • @_: Остальные аргументы лямбды («переменный параметр»).
  • ^$^a: Диапазон от 0до $^a - 1.
  • * %% @_.any: Другая лямбда, которая проверяет свой аргумент, *используя оператор делимого на- %%против any- Junction из списка @_.
  • grep PREDICATE, RANGE: перебирает диапазон чисел и возвращает те, для которых предикат истинен.
SMLS
источник
Я думаю, что добавление ^для объявления параметра-заполнителя является довольно явным. Тем более, что вы можете использовать его позже в блоке как раз $a. Я думаю, что только $_ @_ %_ selfкогда-либо можно считать неявно объявленным. Я думаю, что в этой строке будет
указано
@ BradGilbertb2gills: я имел в виду, что это неявно становится частью сигнатуры лямбды, хотя код не вводил сигнатуру перед телом лямбды. @_и %_в случае функций ничем не отличаются в этом отношении: они тоже становятся частью подписи, только если они появляются в теле. Только $_selfи %_в методах) может стать частью подписи по умолчанию.
Smls
PS: теперь я удалил фразу «неявно объявлено», так как это не обязательно для понимания кода.
смлс
3

R, 67 байт

a=scan();x=c();for(i in a[-1])x=c(x,seq(i,a[1]-1,i));sum(unique(x))

Принимает вектор для STDIN в следующем формате: [N, a_1, a_2, ...] . Поддерживает любое количество a. Для каждого a, создает последовательность , aчтобы N-1с размер шага a. Затем берется сумма всех уникальных записей в этом векторе.

JAD
источник
3

Haskell, 42 39 байт

a!b=sum[x|x<-[1..a-1],any((<1).mod x)b]

Использование:

Main> 50![2,3,5]
857

Спасибо @Zgarb за 3 байта

Angs
источник
(x`mod`)так же, как mod x.
Згарб
@Zgarb whoops :)
Angs
3

05AB1E , 9 байтов

FND²%P_*O

Попробуйте онлайн!

F         For N in [0, ..., input[0]-1]
 ND²%     Evaluate N%input[1]; yields an array of results
     P    Take the total product of the array. Yields 0 only if at least one of the value is 0, in other words if N is multiple of at least one of the specified values
      _   Boolean negation, yields 1 if the last value is 0 and yields 0 otherwise
       *  Multiply by N: yields N if the last value is 0 and yields 0 otherwise
        O Display the total sum
Osable
источник
8 байтов или 8 байтов альтернативы с использованием фильтра . (Впрочем, первый 8-байт был невозможен, когда вы опубликовали свой ответ. Так как à(максимум) сейчас появляется в списке, но не раньше.)
Кевин Круйссен
3

Октава, 49 37 байт

@(A,N)sum(unique((z=(1:N)'.*A)(z<N)))

функция будет называться f([2 3 4],50)

Предположим, что A=[2 3 4];мы требуем, чтобы сумма чисел как

sum(
2,4,6...,50-1 ,
3,6,9...,50-1,
4,8,12,...50-1)

мы можем умножить [2 3 4]на, 1:50чтобы получить матрицу(1:N)'.*A

[2 4 6 ... 2*50
3 6 9 ... 3*50
4 8 12 ...4*50]

затем извлеките из матрицы те, которые меньше 50: z(z<N)

Поскольку в матрице есть повторяющиеся элементы, мы извлекаем уникальные значения и суммируем их.

предыдущий ответ : (это решение потерпит неудачу, если N == 1)

@(A,N)sum((k=uint64(1:N-1))(any(k==(k./A').*A')))

функция должна называться f(unit64([2 3 4]),uint64(50))

rahnema1
источник
1
Очень хорошо! Почти такой же ответ, как и другой октавный ответ, но совершенно другой подход. Это не приходило мне в голову вообще! Может быть полезно получить какое-то объяснение и, возможно, ссылку на ideone, но у вас уже есть мой голос :-)
Стьюи Гриффин
Я изменил порядок ввода, но вот ссылка ideone.com/8Bljrl
Стьюи Гриффин
2

Pyth, 10 байт

s{sm:0hQdt

объяснение

s{sm:0hQdtQ   Implicit input
    :0hQd     Get multiples of d below the bound
   m     tQ   ... for each d given
  s           Concatenate results
 {            Remove repeats
s             Take the sum

источник
2

T-SQL, 87 байт

Это будет работать до тех пор, пока @i имеет значение 2048 или ниже

USE master--needed for databases not using master as default
DECLARE @i INT=50
DECLARE @ table(a int)
INSERT @ values(2),(3),(5)

SELECT sum(distinct number)FROM spt_values,@ WHERE number%a=0and abs(number)<@i

Попробуйте это

t-clausen.dk
источник
2

APL (Dyalog Unicode) , 12 байт

+/⊢∘⍳∩∘∊×∘⍳¨

Попробуйте онлайн!

Анонимная молчаливая функция. Спасибо @ Adám за помощь, чтобы избавиться от этого на 3 байта. Использует ⎕IO←0.

Как:

+/⊢∘⍳∩∘∊×∘⍳¨  Tacit function. Left and right arguments will be called  and  respectively.

        ×∘⍳¨  Multiply  with each element of [0..⍵-1]
             Enlist (flattens the vector)
     ∩∘       Then, get the intersection of that vector with
  ⊢∘⍳         The vector [0..⍵-1].
+/            Then sum
Дж. Салле
источник
2

Пип , 43 41 39 35 байт

b^:sFc,a{f:0Fdb{f?0c%d?0(f:i+:c)}}i

Попробуйте онлайн!

Объяснение:

Takes inputs like so:

    arg1 1000
    arg2 3 5

b^:s                      ;read rest of inputs as array
                          ;(s is " " and ^ is split into array on char)
F c ,a{                   ;for(c in range(0,a))
  f:0                     ;flag to prevent double counting 15,30,etc.
  F d b {                 ;forEach(d in b)
    f? 0 c%d? 0 (f:i+:c)  ;if flag {continue}elif c%d {f=i+=c}
                          ;      (i will always be truthy so why not)     
  }
}
i                         ;print sum
Кеннет Тейлор
источник
упс! Я читаю слишком быстро
Кеннет Тейлор
Намного лучше. Отличный ответ!
mbomb007
1

Python 2, 80 байт

Это очень долго. Определенно можно сократить. Принятие 3-х чисел в качестве отдельных входов определенно повредит счету.

i=input
x=i();y=i();z=i();s=c=0
exec("if c%z<1 or c%y<1:s+=c\nc+=1\n"*x)
print s
Тео
источник
Вы могли бы сделать x,y,z=input()и дать вклад в виде (1000,3,5).
Скайлер
1

Common Lisp, 77

(lambda(n x)(loop for i below n when(some(lambda(u)(zerop(mod i u)))x)sum i))

Ungolfed

(lambda (limit seeds)
  (loop for i below limit
        when (some (lambda (u) (zerop (mod i u))) seeds)
          sum i))
CoreDump
источник
1

PowerShell , 57 байт

param($a,$b)(1..--$a|?{$i=$_;$b|?{!($i%$_)}})-join'+'|iex

Попробуйте онлайн!

Итеративное решение. Принимает ввод в виде числа $aи в виде литерального массива $b. Цикл 1до одного ниже $a(через --$a), используя Where-Objectоператор |?{...}с предложением для выбора определенных чисел.

Предложение устанавливает $iтекущий номер перед отправкой входного массива $bв другой |?{...}, здесь выбираются те элементы, в которых текущий номер равномерно разделен по крайней мере на одно из чисел в $b. Те элементы, $bкоторые делятся равномерно, остаются на конвейере.

Таким образом, если существует, по крайней мере , один элемент из $b, трубопровод содержит элемент, так что внешняя Whereявляется $trueи текущий номер остается на трубопроводе. В противном случае, если нет элементов из $bконвейера, внешний Whereявляется внешним $false, поэтому текущий номер не помещается в конвейер.

Все эти числа собраны в парены, помечены -joinвместе со +знаками и переданы по трубопроводу |iex(сокращенно Invoke-Expressionи аналогично eval). Результат суммирования остается на конвейере, а вывод неявным.

AdmBorkBork
источник
1

PHP, 78 76 74 байта

for(;++$i<$argv[$f=$k=1];$s+=$i*!$f)for(;$v=$argv[++$k];)$f*=$i%$v;echo$s;

Внешний цикл запускается $iот 1 до первого аргумента ниже и добавляет $iзначение $sif, если $fоно не установлено.
В умножает внутренний цикл $fс ( по $iмодулю аргумента) для всех последующих аргументов, полагая , $fчтобы , 0если $iэто кратно любой из них.

Беги с -r.

Titus
источник
1

Скала, 47 байт

n=>1.to(n(0)-1).filter(i=>n.exists(i%_==0)).sum

n является списком, который содержит первый аргумент N, остальные являются элементамиA

Работает, отфильтровывая числа, где не существует хотя бы одного A, для которого i кратно, затем суммируя. Строго говоря, мы должны использовать n.tail.existsвнутри замыкания, но так как i всегда меньше N и, следовательно, никогда не кратно N, решение по-прежнему завершено без этого.

sprague44
источник
1

Java 8, 75 байт

(N,A)->IntStream.range(1,N).filter(x->A.stream().anyMatch(y->x%y==0)).sum()

Подпись метода для этого int f(int N, List<Integer> A)

NonlinearFruit
источник
1

Рубин, 52 48 46 байт

->b{b[s=0].times{|x|b.find{|y|x%y<1&&s+=x}};s}
гигабайт
источник
1

C11, 177 байт

#include"object.h"
#define S size_t
S g(S m,array_t*d){S s,i,l,j;for(s=i=0;i<m;i++){for(l=1,j=0;j<d->idx+1;l*=i%(S)(*array_get_ref(d,j++,NULL))->fwi->value);s+=l?0:i;}return s;}

Требуется этот набор заголовков в той же папке, и fnv-hashбиблиотека, найденная там же. Компилировать какgcc 1.c ../fnv-hash/libfnv.a -o 1 -DNODEBUG

Тестовая программа:

#include "../calc/object/object.h"
#include <stdio.h>

size_t f (const size_t max, const size_t a, const size_t b);
size_t f2 (const size_t max, const array_t* const divs);
size_t g (size_t max, array_t* divs);

define_array_new_fromctype(size_t);

int main(void) {
  printf("%zu\n", f(10, 3, 5));
  static const size_t a[] = {
    3, 5
  };
  array_t* b = array_new_from_size_t_lit(a, 2, t_realuint);
  printf("%zu\n", f2(10, b));
  printf("%zu\n", g(10, b));
  array_destruct(b);
  return 0;
}

size_t f (const size_t max, const size_t a, const size_t b) {
  size_t sum = 0;
  for (size_t i = 0; i < max; i++) {
    sum += (i % a * i % b) ? 0 : i;
  }
  return sum;
}

size_t f2 (const size_t max, const array_t* const divs) {
  size_t sum = 0;
  const size_t len = array_length(divs);

  for (size_t i = 0; i < max; i++) {
    size_t mul = 1;
    for (size_t j = 0; j < len; j++) {
      object_t** this = array_get_ref(divs, j, NULL);

      fixwid_t*   num = (*this)->fwi;

      mul *= i % (size_t) num->value;
    }
    sum += mul ? 0 : i;
  }
  return sum;
}

#define S size_t
S g(S m,array_t*d){S s,i,l,j;for(s=i=0;i<m;i++){for(l=1,j=0;j<d->idx+1;l*=i%(S)(*array_get_ref(d,j++,NULL))->fwi->value);s+=l?0:i;}return s;}

выходы

23
23
23
Кот
источник
1

Japt -x, 9 7 6 байт

Ç*VøZâ

Попытайся

           :Implicit input of integer U and array V
Ç          :Map each Z in the range [0,U)
 *         :  Multiply by
  Vø       :  Does V contain
    Zâ     :   Any of the divisors of Z
           :Implicit output of sum of resulting array
мохнатый
источник
1

Whispers v2 , 178 байт

> Input
> Input
> ℕ
>> (1)
>> ∤L
>> {L}
>> L∩2
>> #L
>> L∈3
>> L⋅R
>> Each 5 4
>> Each 6 11
>> Each 7 12
>> Each 8 13
>> Each 9 14
>> Each 10 15 4
>> ∑16
>> Output 17

Попробуйте онлайн!

Структура дерева:

структура дерева

Как это работает

Очень просто, мы помещаем каждое число (строки с Eachними) через ряд функций (строки с Lними), затем, основываясь на результатах этих функций, мы отбрасываем некоторые числа и сохраняем остальные, прежде чем их окончательно суммировать. , На самом деле, мы можем определить те функции, гдеα обозначает набор чисел, заданных в качестве входных данных:

е(Икс)знак равно{я|(я|Икс),яN}т.е. множество делителейИксг(Икс)знак равное(Икс)αт.е. объединение делителейИкссαчас(Икс)знак равно|г(Икс)|>0т.е.г(Икс)не пусто

Это то, что представляют строки с 5 по 10 . Строки с 11 по 16 являются просто применением этих трех функций. Как только мы определили все функции, мы затем мутируемα в β согласно следующему правилу:

βязнак равно{αячас(αя)0час(αя)

где αя обозначает яй элемент αи то же самое для β, Наконец, мы можем просто взять суммуβкак 0 элементы не влияют на сумму.

Caird Coneheringaahing
источник
1

K (ок) , 15 14 байт

Решение:

{+/&|/~y!\:!x}

Попробуйте онлайн!

Примеры:

{+/&|/~y!\:!x}[50;,2]
600
{+/&|/~y!\:!x}[10;3 5]
23

Объяснение:

{+/&|/~y!\:!x} / the solution
{            } / lambda taking implicit x and y
           !x  / range 0..x-1
       y!\:    / modulo (!) x with each-left (\:) item in y
      ~        / not
    |/         / min-over to flatten into single list
   &           / indices where true
 +/            / sum up
streetster
источник
0

На самом деле , 13 байтов

DR∙`i;)%Y*`MΣ

Попробуйте онлайн!

Объяснение:

DR∙`i;)%Y*`MΣ
DR             range(1, N)
  ∙            Cartesian product with A
   `i;)%Y*`M   for each pair:
    i;)          flatten, make a copy of the value from the range
       %Y        test if value from range divides value from A
         *       value from range if above is true else 0
            Σ  sum
Mego
источник
0

Обработка, 88 байт

int q(int a,int[]b){int s=0,i=0;for(;++i<a;)for(int j:b)if(i%j<1){s+=i;break;}return s;}

Использует простой for-loop подход, суммирует все кратные и возвращает его. Ввод - это формат int, int[]массив.

Kritixi Lithos
источник