Tìm tổng của tất cả các số bên dưới n là bội số của một số bộ số


31

Gần như tương đương với câu hỏi đầu tiên của Project Euler:

Nếu chúng ta liệt kê tất cả các số tự nhiên dưới 10 là bội số của 3 hoặc 5, chúng ta sẽ nhận được 3, 5, 6 và 9. Tổng của các bội số này là 23.

Tìm tổng của tất cả các bội số của 3 hoặc 5 dưới 1000.

Thử thách:

Cho một số nguyên dương Nvà một tập hợp ít nhất một số nguyên dương A, xuất ra tổng của tất cả các số nguyên dương nhỏ hơn Nđó là bội số của ít nhất một thành viên A.

Ví dụ, đối với trường hợp Project Euler, đầu vào sẽ là:

1000
3
5

Các trường hợp thử nghiệm:

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) Chúng ta có đếm các số là bội số của cả hai lần không? 2) Chúng ta chỉ có thể có được hai số khác? hoặc bất kỳ số tiền nào nói một hoặc 3?
Phù thủy lúa mì

3
Bạn có thể cho một số trường hợp thử nghiệm? Rõ ràng không đăng câu trả lời cho PE, nhưng những ví dụ khác thì sao?
Rɪᴋᴇʀ

1
@WheatWizard: Từ "hoặc" ngụ ý rằng mỗi số chỉ được tính một lần, tối đa. Tuy nhiên, tôi đồng ý rằng câu hỏi cần phải làm rõ có bao nhiêu "số để kiểm tra bội số" phải được hỗ trợ. Chính xác là hai? Một hay nhiều? Không hay nhiều hơn?
smls

1
Chúng ta có thể lấy " số bằng hoặc dưới 10 " hoặc lấy 9 làm đầu vào thay vì 10 không?
Stewie Griffin

"Và một tập hợp ít nhất một số nguyên dương A" tập hợp đó có thể lớn đến mức nào?
betseg

Câu trả lời:


13

Thạch , 6 byte

ḍþṖḅTS

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

ḍþṖḅ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
Tất nhiên @Dennis phải đi kèm với một cái gì đó sẽ khiến bạn tự hỏi những gì bạn đang làm trên ppcg
Grajdeanu Alex.

8

Con trăn, 59 55 byte

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

thay thế

Hàm không tên lấy một số nguyên nvà một danh sách các số nguyên l. Di chuyển một phạm vi các số tự nhiên (cộng với 0) lên đến nhưng không bao gồm nvà tổng ( sum(...)) các số còn lại sau khi chia 0 ( v%m<1) cho anycác số nguyên mtrong danh sách l. Sử dụng phép nhân chứ không phải là điều kiện để lưu 3 byte.


8

Octave, 38 36 33 byte

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

Lấy đầu vào là : f(10, [3;5]). Điều này sẽ ngắn hơn 2 byte nếu đầu vào có thểf(9,[3;5]) cho cùng một trường hợp thử nghiệm.

Xác nhận tất cả các trường hợp thử nghiệm ở đây.


Giải trình:

@(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    

Octave có thể giảm trước, vì vậy sử dụng 1:--xthay vì1:x-1 (hai lần) sẽ tiết kiệm được hai byte.

mod(a,b)đưa ra 1 2 0 1 2 0 1 2 0cho mod(1:9,3). Nếu đối số thứ hai là một vectơ dọc, nó sẽ sao chép đầu vào đầu tiên theo chiều dọc và lấy mô-đun cho từng giá trị trong đối số đầu vào thứ hai. Vì vậy, đối với đầu vào mod(1:9, [3;5])này cung cấp:

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

Việc thực ~all(_,1)hiện điều này mang lại truecho các cột trong đó ít nhất một giá trị bằng 0 và falsetrong đó tất cả các giá trị đều khác không:

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

Điều ,1này là cần thiết trong trường hợp chỉ có một số trong y. Nếu không, nó sẽ tác động lên toàn bộ vectơ thay vì theo từng số.

Chuyển đổi điều này sang một ma trận dọc và sử dụng phép nhân ma trận, sẽ cho chúng ta câu trả lời chính xác mà không cần phải tóm tắt rõ ràng:


Ôi thật là tàn nhẫn: Tôi đã phải thêm 2 byte vì sự khác biệt giữa x và x mộc 1, nhưng bạn phải thêm 4 byte, và bây giờ tôi đi trước 1 byte> :)
Greg Martin

6

JavaScript (ES6), 40 39 36 byte

Dữ liệu vào: số nguyên nvà mảng số nguyên avới cú pháp currying(n)(a)

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

Các trường hợp thử nghiệm


Tôi đã có một công thức hơi khác nhau cho cùng một chiều dài : f=(n,a)=>n--&&a.some(v=>n%v<1)*n+f(n,a). Tốt nhất tôi có thể làm không đáng tin cậy là 61 byte.
Neil

@Neil Nhận xét của bạn khuyến khích tôi tìm kiếm một công thức khác. Thật thú vị, cú pháp currying tiết kiệm 3 byte.
Arnauld

5

MATL , 9 byte

q:ti\~*us

Hãy thử trực tuyến!


1
Chỉ cần kiểm tra nếu tôi đọc đúng (không kiểm tra tài liệu). Bạn đang giảm dần, tạo ra một vector 1 2 .... Bạn nhân đôi nó và lấy mô-đun đầu vào khác. Bạn phủ nhận nó và nhân với vectơ 1 2 .., sử dụng duy nhất để loại bỏ các bản sao và cuối cùng tóm tắt nó ...
Stewie Griffin

Chính xác! Tôi đang ở trên điện thoại di động nên tôi không bao gồm một lời giải thích. Bây giờ không cần thiết :-)
Luis Mendo


4

Python, 67 byte

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

Sau khi viết bài này, tôi nhận thấy mã của mình giống với câu trả lời của con trăn hiện có, tuy nhiên tôi đã nghĩ ra nó một cách độc lập và dù sao thì nó cũng được đăng.


Bạn không cần dấu chấm phẩy trong exec, vì dù sao bạn cũng có một dấu ngắt dòng. Tôi biết câu trả lời của tôi có thể vượt quá!
Theo

Thông số kỹ thuật cho biết "một tập hợp ít nhất một số nguyên dương"; điều này dường như chỉ xử lý trường hợp tập hợp là hai số nguyên. Ngoài ra có x=y=0trên một dòng riêng biệt sẽ tiết kiệm bốn byte.
Jonathan Allan

@Jonathan ALLan thật tuyệt, cảm ơn rất nhiều!
Rɪᴋᴇʀ

4

Toán học, 37 27 byte

Cảm ơn Martin Ender cho một quan sát sắc sảo dẫn đến tiết kiệm byte lớn!

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

Hàm không tên lấy hai đối số, một danh sách #các số nguyên (ước số mong muốn A) và một số nguyên #2(giới hạn trên N) và trả về một số nguyên. Range[#,#2-1,#]cho, đối với mỗi phần tử dcủa danh sách #, tất cả các bội số dnhỏ hơn hoặc bằng #-1(do đó nhỏ hơn #); sự kết hợp của các danh sách này sau đó được tính toán và tổng hợp lại Tr.

Phiên bản trước:

Tr[x=#;Union@@(Range[#,x-1,#]&/@#2)]&

1
Range is listable: Tr[Union@@Range[#2,#-1,#2]]& (and then save another byte by swapping the order of the inputs)
Martin Ender

4

Perl 6, 25 bytes

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

A lambda that takes the input numbers as arguments. (One argument for N, and an arbitrary number of arguments for A).

(Try it online.)

Explanation:

  • { ... }: A lambda.
  • $^a: First argument of the lambda.
  • @_: Remaining arguments of the lambda ("variadic parameter").
  • ^$^a: Range from 0 to $^a - 1.
  • * %% @_.any: Another lambda, which tests its argument * using the divisible-by operator %% against an any-Junction of the list @_.
  • grep PREDICATE, RANGE: iterates the range of numbers and returns the ones for which the predicate is true.

I think adding ^ to declare a placeholder parameter is fairly explicit. Especially since you could use it later in the block as just $a. I think only $_ @_ %_ self can ever be considered to be implicitly declared. I think I would have that line read "declare first parameter as a placeholder"
Brad Gilbert b2gills

@BradGilbertb2gills: I meant that it implicitly becomes part of the lambda's signature, even though the code didn't introduce a signature before the lambda's body. @_, and %_ in case of functions, are no different in that regard: They too only become part of the signature if they appear in the body. Only $_ (and self and %_ in methods) can become part of a signature by default.
smls

PS: I removed the phrase "implicitly declared" now, though, as it's not necessary for understanding the code.
smls

3

R, 67 bytes

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

Takes a vector to STDIN in the following format: [N, a_1, a_2, ...]. Supports any number of a. For each a, creates the sequence a to N-1 with stepsize a. Then takes the sum of all the unique entries in that vector.


3

Haskell, 42 39 bytes

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

Usage:

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

Thanks to @Zgarb for 3 bytes


(x`mod`) is the same as mod x.
Zgarb

@Zgarb whoops :)
Angs

3

05AB1E, 9 bytes

FND²%P_*O

Try it online!

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 bytes or 8 bytes alternative using a filter. (The first 8-byter wasn't possible when you posted your answer, though. Since à (maximum) pops the list now, but didn't before.)
Kevin Cruijssen

3

Octave, 49 37 bytes

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

the function will be called as f([2 3 4],50)

Assume that A=[2 3 4]; we require to have sum of numbers as

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

we can multiply [2 3 4] by 1:50 to get matrix (1:N)'.*A

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

then extract from the matrix those that are smaller than 50 : z(z<N)

Since there are repeated elements in the matrix we extract unique values and sum them.

previous answer: (this solution will fail if N==1)

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

function should be called as f(unit64([2 3 4]),uint64(50))


1
Very nice! Almost as sort as the other octave answer, but a completely different approach. This didn't cross my mind at all! Could benefit from having some explanation though and maybe a link to ideone, but you have my vote already :-)
Stewie Griffin

I changed the order of the input, but here's a link ideone.com/8Bljrl
Stewie Griffin

2

Pyth, 10 bytes

s{sm:0hQdt

Explanation

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 bytes

This will work as long as @i has a value of 2048 or lower

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

Try it out


2

APL (Dyalog Unicode), 12 bytes

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

Try it online!

Anonymous tacit function. Thanks to @Adám for helping me shave 3 bytes off of this. Uses ⎕IO←0.

How:

+/⊢∘⍳∩∘∊×∘⍳¨  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

Pip, 43 41 39 35 bytes

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

Try it online!

Explanation:

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

whoops! I read too fast
Kenneth Taylor

Much better. Great answer!
mbomb007

1

Python 2, 80 Bytes

This is very long. Can definitely be shortened. Taking the 3 numbers as separate inputs is definitely hurting the score.

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

You could do x,y,z=input() and give input in the form of (1000,3,5).
Skyler

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 bytes

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

Try it online!

Iterative solution. Takes input as a number $a and as a literal array $b. Loops from 1 up to one below $a (via --$a), using a Where-Object operator |?{...} with a clause to select certain numbers.

The clause sets $i to be the current number before sending input array $b into another |?{...}, here picking out those items where the current number is evenly divided by at least one of the numbers in $b. Those elements of $b that do divide evenly are left on the pipeline.

Thus, if there is at least one element from $b, the pipeline contains an element, so the outer Where is $true and the current number is left on the pipeline. Otherwise, with no elements from $b on the pipeline, the outer Where is $false, so the current number is not placed on the pipeline.

Those numbers are all gathered up in parens, -joined together with + signs, and piped to |iex (short for Invoke-Expression and similar to eval). The summation result is left on the pipeline, and output is implicit.


1

PHP, 78 76 74 bytes

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

The outer loop runs $i from 1 to below first argument and adds $i to $s if $f is not set.
The inner loop multiplies $f with ($i modulo argument) for all subsequent arguments, setting $f to 0 if $i is the multiple of any of them.

Run with -r.


1

Scala, 47 bytes

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

n is a List which contains of a first argument N, the rest are elements of A

Works by filtering out numbers where there doesn't exist at least one A of which i is a multiple, then summing. Strictly speaking we should use n.tail.exists inside the closure, but as i is always less than N and therefore never a multiple of N the solution is still complete without this.


1

Java 8, 75 bytes

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

The method signature for this is int f(int N, List<Integer> A)


1

Ruby, 52 48 46 bytes

->b{b[s=0].times{|x|b.find{|y|x%y<1&&s+=x}};s}

1

C11, 177 bytes

#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;}

Requires this set of headers in the same folder, and the fnv-hash library found there as well. Compile like gcc 1.c ../fnv-hash/libfnv.a -o 1 -DNODEBUG

Test Program:

#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;}

outputs

23
23
23

1

Japt -x, 9 7 6 bytes

Ç*VøZâ

Try it

           :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 bytes

> 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

Try it online!

Structure tree:

struct tree

How it works

Very simply, we put each number (the lines with Each on them) through a series of functions (the lines with L on them), then, based off the results of those functions, we discard some numbers and keep the rest, before finally summing them. In fact, we can define those functions, where α denotes the set of numbers given as input:

f(x)={i|(i|x),iN}i.e. the set of divisors ofxg(x)=f(x)αi.e. the union of the divisors ofxwithαh(x)=|g(x)|>0i.e.g(x)is not empty

This is what lines 5 through to 10 represent. Lines 11 through 16 are simply the application of those three functions. Once we've defined all the functions, we then mutate α to β according to the following rule:

βi={αih(αi)0h(αi)

where αi denotes the ith element of α, and the same for β. Finally, we can simply take the sum of β, as the 0 elements do not affect the sum.


1

K (oK), 15 14 bytes

Solution:

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

Try it online!

Examples:

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

Explanation:

{+/&|/~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

Actually, 13 bytes

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

Try it online!

Explanation:

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

0

Processing, 88 bytes

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;}

Uses the simple for-loop approach, sums all the multiples up and returns it. Input is the format int, int[]array.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.