Znajdź sumę wszystkich liczb poniżej n, które są wielokrotnością pewnego zestawu liczb

31

Niemal równoważne z pierwszym pytaniem Project Euler:

Jeśli podamy wszystkie liczby naturalne poniżej 10, które są wielokrotnościami 3 lub 5, otrzymamy 3, 5, 6 i 9. Suma tych wielokrotności wynosi 23.

Znajdź sumę wszystkich wielokrotności 3 lub 5 poniżej 1000.

Wyzwanie:

Biorąc pod uwagę dodatnią liczbę całkowitą Ni zestaw co najmniej jednej dodatniej liczby całkowitej A, wypisz sumę wszystkich dodatnich liczb całkowitych mniejszą niż Nwielokrotności co najmniej jednego elementu A.

Na przykład w przypadku projektu Euler dane wejściowe będą następujące:

1000
3
5

Przypadki testowe:

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
Cisplatyna
źródło
4
1) Czy liczymy liczby, które są wielokrotnościami dwóch razy? 2) Czy możemy uzyskać tylko dwie inne liczby? lub jakakolwiek kwota powiedzmy jeden lub 3?
Wheat Wizard
3
Czy możesz podać jakieś przypadki testowe? Oczywiście nie zamieszczaj odpowiedzi na PE, ale co z innymi przykładami?
Rɪᴋᴇʀ
1
@WheatWizard: Słowo „lub” oznacza, że ​​każda liczba jest liczona tylko raz. Zgadzam się, że pytanie musi wyjaśnić, ile „liczb, aby sprawdzić wielokrotność” argumentów, musi być obsługiwanych. Dokładnie dwa? Jeden lub więcej? Zero czy więcej?
smls,
1
Czy możemy wziąć „ liczby równe lub mniejsze niż 10 ”, czy też wziąć 9 jako dane wejściowe zamiast 10?
Stewie Griffin,
„i zestaw co najmniej jednej dodatniej liczby całkowitej A” jak duży może być ten zestaw?
betseg

Odpowiedzi:

13

Galaretka , 6 bajtów

ḍþṖḅTS

Wypróbuj online!

Jak to działa

ḍþṖḅ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.
Dennis
źródło
3
Oczywiście @Dennis musi mieć coś, co sprawi, że będziesz się zastanawiać, co robisz na ppcg
Grajdeanu Alex.
8

Python, 59 55 bajtów

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

repl.it

Nienazwana funkcja przyjmująca liczbę całkowitą ni listę liczb całkowitych l. Przechodzi przez zakres liczb naturalnych (plus zero) do, ale nie wliczając ni sumuje ( sum(...)) te, które mają resztę po dzieleniu zera ( v%m<1) dla anyliczb całkowitych mna liście l. Używa mnożenia zamiast warunkowego, aby zapisać 3 bajty.

Jonathan Allan
źródło
8

Oktawa, 38 36 33 bajtów

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

Weź dane jako: f(10, [3;5]) . Byłoby to 2 bajty krótsze, gdyby dane wejściowe mogły dotyczyć f(9,[3;5])tego samego przypadku testowego.

Sprawdź tutaj wszystkie przypadki testowe.


Wyjaśnienie:

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

Oktawa może wstępnie zmniejszyć, więc używając 1:--x zamiast 1:x-1(dwa razy) oszczędza dwa bajty.

mod(a,b)daje 1 2 0 1 2 0 1 2 0za mod(1:9,3). Jeśli drugi argument jest wektorem pionowym, powiela pierwsze wejście pionowo i przyjmuje moduł dla każdej wartości drugiego argumentu wejściowego. Tak więc dla danych wejściowychmod(1:9, [3;5]) daje to:

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

Przyjęcie ~all(_,1)tego daje truekolumny, w których co najmniej jedna wartość wynosi zero, ifalse wszystkie wartości są niezerowe:

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

The ,1Jest potrzebne w przypadku, gdy istnieje tylko jeden numer w y. W przeciwnym razie działałby na cały wektor zamiast liczby po liczbie.

Przeniesienie tego na macierz pionową i użycie mnożenia macierzy da nam prawidłową odpowiedź, bez potrzeby wyraźnego podsumowania:

Stewie Griffin
źródło
Och, to okrutne: musiałem dodać 2 bajty z powodu różnicy między x i x – 1, ale musiałeś dodać 4 bajty, a teraz jestem o 1 bajt> :)
Greg Martin
6

JavaScript (ES6), 40 39 36 bajtów

Dane wejściowe: liczba całkowita ni tablica liczb całkowitych aze składnią curry(n)(a)

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

Przypadki testowe

Arnauld
źródło
Miałem nieco inny preparat o tej samej długości: f=(n,a)=>n--&&a.some(v=>n%v<1)*n+f(n,a). Najlepsze, co mogłem zrobić nierekurencyjnie, to 61 bajtów.
Neil,
@Neil Twój komentarz zachęcił mnie do poszukiwania kolejnego sformułowania. Co ciekawe, składnia curry oszczędza 3 bajty.
Arnauld,
5

MATL , 9 bajtów

q:ti\~*us

Wypróbuj online!

Luis Mendo
źródło
1
Sprawdzam tylko, czy przeczytałem to dobrze (bez sprawdzania dokumentów). Zmniejszasz się, tworząc wektor 1 2 .... Powielasz go i bierzesz moduł drugiego wejścia. Negujesz go i mnożysz z wektorem 1 2 .., użyj unikalnego, aby pozbyć się duplikatów, a na końcu zsumować ...
Stewie Griffin,
Dokładnie! Jestem na telefonie komórkowym, więc nie podałem żadnego wyjaśnienia. Teraz nie jest to konieczne :-)
Luis Mendo
5

Retina , 34 bajty

Liczba bajtów zakłada kodowanie ISO 8859-1.

\d+
$*
M&!`(.+)\1*(?=1¶.*\b\1\b)
1

Format wejściowy to

50
2,3,5

Wypróbuj online!

Martin Ender
źródło
4

Python, 67 bajtów

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

Po napisaniu tego zauważyłem, że mój kod jest podobny do istniejącej odpowiedzi w Pythonie, ale wymyśliłem go niezależnie i i tak go publikuję.

Rɪᴋᴇʀ
źródło
Nie potrzebujesz średnika w exec, ponieważ i tak masz po nim podział linii. Wiedziałem, że moja odpowiedź może zostać rozegrana!
Theo,
Specyfikacja mówi „zbiór co najmniej jednej dodatniej liczby całkowitej”; wydaje się, że obsługuje to tylko przypadek, w którym zestaw zawiera dwie liczby całkowite. Również posiadanie x=y=0osobnego wiersza pozwoliłoby zaoszczędzić cztery bajty.
Jonathan Allan,
@JonathanAllan spoko, wielkie dzięki!
Rɪᴋᴇʀ
4

Mathematica, 37 27 bajtów

Dzięki Martin Ender za sprytną obserwację, która doprowadziła do dużych oszczędności bajtów!

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

Funkcja bez nazwy, która przyjmuje dwa argumenty, listę #liczb całkowitych (pożądane dzielniki A) i liczbę całkowitą #2(górna granica N) i zwraca liczbę całkowitą. Range[#,#2-1,#]daje dla każdego elementu dlisty #wszystkie wielokrotności dmniejsze lub równe#-1 (a więc mniejsze niż #); unia tych list jest następnie obliczana i sumowana Tr.

Poprzednia wersja:

Tr[x=#;Union@@(Range[#,x-1,#]&/@#2)]&
Greg Martin
źródło
1
Rangejest wymienny: Tr[Union@@Range[#2,#-1,#2]]&(a następnie zapisz kolejny bajt, zamieniając kolejność danych wejściowych)
Martin Ender
4

Perl 6 , 25 bajtów

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

Lambda, która przyjmuje liczby wejściowe jako argumenty. (Jeden argument dla N i dowolna liczba argumentów dla A).

( Wypróbuj online. )

Wyjaśnienie:

  • { ... }: A lambda.
  • $^a: Pierwszy argument lambda.
  • @_: Pozostałe argumenty lambda („parametr variadic”).
  • ^$^a: Zakres od 0do $^a - 1.
  • * %% @_.any: Kolejna lambda, która sprawdza swój argument *za pomocą operatora podzielnego przez %%względem any- Łączenie listy @_.
  • grep PREDICATE, RANGE: iteruje zakres liczb i zwraca te, dla których predykat jest prawdziwy.
smls
źródło
Myślę, że dodanie w ^celu zadeklarowania parametru zastępczego jest dość wyraźne. Zwłaszcza, że ​​możesz użyć go później w bloku jako sprawiedliwego $a. Myślę, że tylko $_ @_ %_ selfmożna kiedykolwiek uznać za dorozumiane. Myślę, że powinienem przeczytać ten wiersz „ zadeklaruj pierwszy parametr jako symbol zastępczy
Brad Gilbert b2gills
@ BradGilbertb2gills: Miałem na myśli, że domyślnie staje się częścią podpisu lambdy, mimo że kod nie wprowadził podpisu przed ciałem lambdy. @_, a %_w przypadku funkcji nie różnią się pod tym względem: one również stają się częścią podpisu tylko wtedy, gdy pojawiają się w ciele. Tylko $_ (a selfi %_metod) może stać się częścią podpis domyślnie.
smls,
PS: Teraz jednak usunąłem wyrażenie „niejawnie zadeklarowane”, ponieważ nie jest to konieczne do zrozumienia kodu.
smls,
3

R, 67 bajtów

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

Staje wektor do standardowego wejścia w następującym formacie: [N, a_1, a_2, ...]. Obsługuje dowolną liczbę a. Dla każdego a, tworzy sekwencję ado N-1z stepSize a. Następnie pobiera sumę wszystkich unikalnych wpisów w tym wektorze.

JAD
źródło
3

Haskell, 42 39 bajtów

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

Stosowanie:

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

Dzięki @Zgarb za 3 bajty

Angs
źródło
(x`mod`)jest taki sam jak mod x.
Zgarb,
@Zgarb whoops :)
Angs,
3

05AB1E , 9 bajtów

FND²%P_*O

Wypróbuj 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
Osable
źródło
8 bajtów lub 8 bajtów alternatywnie przy użyciu filtra . (Jednak pierwsze 8 bajtów nie było możliwe, kiedy opublikowałeś swoją odpowiedź. Ponieważ à(maksymalnie) pojawia się teraz na liście, ale nie wcześniej.)
Kevin Cruijssen
3

Oktawa, 49 37 bajtów

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

funkcja zostanie wywołana jako f([2 3 4],50)

Załóżmy, A=[2 3 4];że potrzebujemy sumy liczb jako

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

możemy pomnożyć [2 3 4], 1:50aby uzyskać macierz(1:N)'.*A

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

następnie wyodrębnij z macierzy te, które są mniejsze niż 50: z(z<N)

Ponieważ w macierzy występują powtarzające się elementy, wyodrębniamy unikalne wartości i sumujemy je.

poprzednia odpowiedź : (to rozwiązanie zawiedzie, jeśli N == 1)

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

funkcję należy wywołać jako f(unit64([2 3 4]),uint64(50))

rahnema1
źródło
1
Bardzo dobrze! Prawie tak samo, jak odpowiedź na drugą oktawę, ale zupełnie inne podejście. To wcale nie przyszło mi do głowy! Przydałoby się trochę wyjaśnienia i może link do ideonu, ale masz już mój głos :-)
Stewie Griffin,
Zmieniłem kolejność wprowadzania, ale tutaj jest link ideone.com/8Bljrl
Stewie Griffin
2

Pyth, 10 bajtów

s{sm:0hQdt

Wyjaśnienie

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

źródło
2

T-SQL, 87 bajtów

Będzie to działać tak długo, jak @ima wartość 2048 lub niższą

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

Wypróbuj to

t-clausen.dk
źródło
2

APL (Dyalog Unicode) , 12 bajtów

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

Wypróbuj online!

Anonimowa funkcja ukryta. Dzięki @ Adám za pomoc w goleniu 3 bajtów. Zastosowania ⎕IO←0.

W jaki sposób:

+/⊢∘⍳∩∘∊×∘⍳¨  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
J. Sallé
źródło
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
Kenneth Taylor
źródło
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
Theo
źródło
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))
coredump
źródło
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.

AdmBorkBork
źródło
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.

Titus
źródło
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.

sprague44
źródło
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)

NonlinearFruit
źródło
1

Ruby, 52 48 46 bytes

->b{b[s=0].times{|x|b.find{|y|x%y<1&&s+=x}};s}
G B
źródło
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
cat
źródło
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
Shaggy
źródło
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.

caird coinheringaahing
źródło
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
streetster
źródło
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
Mego
źródło
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.

Kritixi Lithos
źródło