Найти сумму всех чисел ниже 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)

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


У меня был немного другой состав для одной и той же длины: 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, однако я придумал его независимо и в любом случае публикую его.


Тебе не нужна точка с запятой в 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: перебирает диапазон чисел и возвращает те, для которых предикат истинен.

Я думаю, что добавление ^для объявления параметра-заполнителя является довольно явным. Тем более, что вы можете использовать его позже в блоке как раз $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. Затем берется сумма всех уникальных записей в этом векторе.


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 байта


(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

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))


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

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


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))

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). Результат суммирования остается на конвейере, а вывод неявным.


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.


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, решение по-прежнему завершено без этого.


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)



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 элементы не влияют на сумму.


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


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[]массив.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.