Encontre a soma de todos os números abaixo de n que são múltiplos de algum conjunto de números

31

Quase equivalente à primeira pergunta do Projeto Euler:

Se listarmos todos os números naturais abaixo de 10 que são múltiplos de 3 ou 5, obtemos 3, 5, 6 e 9. A soma desses múltiplos é 23.

Encontre a soma de todos os múltiplos de 3 ou 5 abaixo de 1000.

Desafio:

Dado um número inteiro positivo Ne um conjunto de pelo menos um número inteiro positivo A, produza a soma de todos os números inteiros positivos menores que Nisso são múltiplos de pelo menos um membro de A.

Por exemplo, para o caso do Project Euler, a entrada seria:

1000
3
5

Casos de teste:

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
Cisplatina
fonte
4
1) Contamos números que são múltiplos de ambos duas vezes? 2) Podemos obter apenas outros dois números? ou qualquer valor digamos um ou 3?
Wheat Wizard
3
Você pode dar alguns casos de teste? Obviamente, não publique a resposta na PE, mas e outros exemplos?
Rɪᴋᴇʀ
1
@ WheatWizard: A palavra "ou" implica que cada número é contado apenas uma vez, no máximo. Concordo que a questão precisa deixar claro quantos argumentos "números para verificar múltiplos de" devem ser suportados. Exatamente dois? Um ou mais? Zero ou mais?
SMLS
1
Podemos pegar " números iguais ou inferiores a 10 " ou pegar 9 como entrada em vez de 10?
Stewie Griffin
"e um conjunto de pelo menos um número inteiro positivo A" qual o tamanho do conjunto?
betseg

Respostas:

13

Gelatina , 6 bytes

ḍþṖḅTS

Experimente online!

Como funciona

ḍþṖḅ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
fonte
3
É claro que o @Dennis tem que vir com algo que fará você se perguntar o que está fazendo no ppcg
Grajdeanu Alex.
8

Python, 59 55 bytes

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

repl.it

Função sem nome usando um número inteiro ne uma lista de números inteiros l. Percorre um intervalo dos números naturais (mais zero) até mas não inclui ne soma ( sum(...)) aqueles que têm um restante após a divisão de zero ( v%m<1) para anyos números inteiros mna lista l. Usa multiplicação em vez de uma condição para salvar 3 bytes.

Jonathan Allan
fonte
8

Oitava, 38 36 33 bytes

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

Tome entrada como: f(10, [3;5]). Isso seria 2 bytes mais curto se a entrada pudesse ser f(9,[3;5])para o mesmo caso de teste.

Verifique todos os casos de teste aqui.


Explicação:

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

A oitava pode pré-diminuir, portanto, usar em 1:--xvez de 1:x-1(duas vezes) salva dois bytes.

mod(a,b)1 2 0 1 2 0 1 2 0para mod(1:9,3). Se o segundo argumento for um vetor vertical, ele replicará a primeira entrada verticalmente e assumirá o módulo para cada um dos valores no segundo argumento de entrada. Portanto, para entrada, mod(1:9, [3;5])isso fornece:

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

Assumir ~all(_,1)isso fornece trueas colunas onde pelo menos um valor é zero e falseonde todos os valores são diferentes de zero:

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

O ,1é necessário caso haja apenas um número y. Caso contrário, ele atuaria em todo o vetor, em vez de número por número.

Transpor isso para uma matriz vertical e usar a multiplicação de matrizes nos dará a resposta correta, sem a necessidade de soma explícita:

Stewie Griffin
fonte
Oh, isso é cruel: eu tive que adicionar 2 bytes por causa da diferença entre x e x-1, mas você tinha que adicionar 4 bytes, e agora estou à frente por 1 byte> :)
Greg Martin
6

JavaScript (ES6), 40 39 36 bytes

Entrada: número inteiro ne matriz de números inteiros acom sintaxe de currying(n)(a)

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

Casos de teste

Arnauld
fonte
I teve uma formulação ligeiramente diferente para o mesmo comprimento de: f=(n,a)=>n--&&a.some(v=>n%v<1)*n+f(n,a). O melhor que pude fazer de forma não recursiva foi de 61 bytes.
Neil
@ Neil Seu comentário me incentivou a procurar mais uma formulação. Curiosamente, a sintaxe de currying salva 3 bytes.
Arnauld
5

MATL , 9 bytes

q:ti\~*us

Experimente online!

Luis Mendo
fonte
1
Apenas verificando se li corretamente (sem verificar os documentos). Você está diminuindo, criando um vetor 1 2 .... Você o duplica e pega a outra entrada no módulo. Você negá-lo e se multiplicam com o vector 1 2 .., use única para se livrar de duplicatas e, finalmente, soma isso ...
Stewie Griffin
Exatamente! Estou no celular e não incluí uma explicação. Agora não é necessário :-)
Luis Mendo
5

Retina , 34 bytes

A contagem de bytes assume a codificação ISO 8859-1.

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

O formato de entrada é

50
2,3,5

Experimente online!

Martin Ender
fonte
4

Python, 67 bytes

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

Depois de escrever isso, notei que meu código era semelhante à resposta existente em python, no entanto, eu o criei independentemente e estou publicando de qualquer maneira.

Rɪᴋᴇʀ
fonte
Você não precisa do ponto-e-vírgula no exec, pois você tem uma quebra de linha depois disso. Eu sabia que minha resposta poderia ser ultrapassada!
Theo
A especificação diz "um conjunto de pelo menos um número inteiro positivo"; isso parece lidar apenas com o caso em que o conjunto é de dois números inteiros. Também ter x=y=0em uma linha separada economizaria quatro bytes.
Jonathan Allan
@JonathanAllan legal, muito obrigado!
Rɪᴋᴇʀ
4

Mathematica, 37 27 bytes

Agradecemos a Martin Ender por uma observação perspicaz que levou a grandes economias de bytes!

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

Função sem nome, recebendo dois argumentos, uma lista #de números inteiros (os divisores desejados A) e um número inteiro #2(o limite superior N) e retornando um número inteiro. Range[#,#2-1,#]fornece, para cada elemento dda lista #, todos os múltiplos dmenores ou iguais a #-1(portanto, menores que #); a união dessas listas é então calculada e resumida Tr.

Versão anterior:

Tr[x=#;Union@@(Range[#,x-1,#]&/@#2)]&
Greg Martin
fonte
1
Rangeé listável: Tr[Union@@Range[#2,#-1,#2]]&(e, em seguida, excepto outro byte, trocando a ordem das entradas)
Martin Enders
4

Perl 6 , 25 bytes

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

Um lambda que aceita os números de entrada como argumentos. (Um argumento para N e um número arbitrário de argumentos para A).

( Experimente online. )

Explicação:

  • { ... }: Um lambda.
  • $^a: Primeiro argumento da lambda.
  • @_: Argumentos restantes do lambda ("parâmetro variável").
  • ^$^a: Faixa de 0até $^a - 1.
  • * %% @_.any: Outro lambda, que testa seu argumento *usando o operador divisível por %%contra uma junçãoany - da lista .@_
  • grep PREDICATE, RANGE: itera o intervalo de números e retorna aqueles para os quais o predicado é verdadeiro.
smls
fonte
Eu acho que adicionar ^para declarar um parâmetro de espaço reservado é bastante explícito. Especialmente porque você pode usá-lo mais tarde no bloco como justamente $a. Eu acho que apenas um $_ @_ %_ selfdia pode ser considerado implicitamente declarado. Eu acho que eu teria essa linha ler " declarar primeiro parâmetro como um espaço reservado "
Brad Gilbert b2gills
@ BradGilbertb2gills: eu quis dizer que isso se torna implicitamente parte da assinatura do lambda, mesmo que o código não tenha introduzido uma assinatura antes do corpo do lambda. @_, e %_no caso de funções, não são diferentes a esse respeito: elas também só se tornam parte da assinatura se aparecerem no corpo. Apenas $_ (e selfe %_em métodos) pode se tornar parte de uma assinatura por padrão.
SMLS
PS: Eu removi a frase "declarado implicitamente" agora, pois não é necessário para entender o código.
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))

Toma um vetor para STDIN no seguinte formato: [N, a_1, a_2, ...]. Suporta qualquer número de a. Para cada a, cria a sequência apara N-1com tamanho de passo a. Em seguida, leva a soma de todas as entradas exclusivas desse vetor.

JAD
fonte
3

Haskell, 42 39 bytes

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

Uso:

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

Obrigado a @Zgarb por 3 bytes

Angs
fonte
(x`mod`)é o mesmo que mod x.
Zgarb
@Zgarb whoops :)
Angs
3

05AB1E , 9 bytes

FND²%P_*O

Experimente 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
fonte
8 bytes ou 8 bytes alternativos usando um filtro . (O primeiro 8-byter não foi possível quando você postou sua resposta, no entanto. Como à(no máximo) aparece a lista agora, mas não antes).
Kevin Cruijssen
3

Oitava, 49 37 bytes

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

a função será chamada como f([2 3 4],50)

Suponha que A=[2 3 4];precisamos ter soma dos números como

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

podemos multiplicar [2 3 4]por 1:50chegar matriz(1:N)'.*A

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

então extraia da matriz aqueles que são menores que 50: z(z<N)

Como existem elementos repetidos na matriz, extraímos valores únicos e os somamos.

resposta anterior : (esta solução falhará se N == 1)

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

função deve ser chamada como f(unit64([2 3 4]),uint64(50))

rahnema1
fonte
1
Muito agradável! Quase tão gentil quanto a outra oitava, mas com uma abordagem completamente diferente. Isso não passou pela minha cabeça! Poderia beneficiar de ter alguma explicação embora e talvez um link para ideone, mas você tem o meu voto já :-)
Stewie Griffin
Eu mudei a ordem da entrada, mas aqui está um link ideone.com/8Bljrl
Stewie Griffin
2

Pitão, 10 bytes

s{sm:0hQdt

Explicação

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

fonte
2

T-SQL, 87 bytes

Isso funcionará desde que @itenha um valor igual ou inferior a 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

Experimente

t-clausen.dk
fonte
2

APL (Dyalog Unicode) , 12 bytes

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

Experimente online!

Função tácita anônima. Agradeço ao @ Adám por me ajudar a eliminar 3 bytes disso. Usos ⎕IO←0.

Quão:

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

Pip , 43 41 39 35 bytes

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

Experimente online!

Explicação:

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
fonte
gritos! Eu li muito rápido
Kenneth Taylor
Muito melhor. Ótima resposta!
mbomb007 27/06
1

Python 2, 80 bytes

Isso é muito longo. Definitivamente pode ser reduzido. Tomar os 3 números como entradas separadas definitivamente prejudica a pontuação.

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
fonte
Você poderia fazer x,y,z=input()e dar entrada na forma de (1000,3,5).
quer
1

Lisp comum, 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
fonte
1

PowerShell , 57 bytes

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

Experimente online!

Solução iterativa. Recebe a entrada como um número $ae como uma matriz literal $b. Loops de 1até um abaixo $a(via --$a), usando um Where-Objectoperador |?{...}com uma cláusula para selecionar determinados números.

A cláusula define $icomo o número atual antes de enviar a matriz de entrada $bpara outra |?{...}, escolhendo aqui os itens em que o número atual é dividido igualmente por pelo menos um dos números em $b. Os elementos $bque se dividem igualmente são deixados no pipeline.

Portanto, se houver pelo menos um elemento $b, o pipeline conterá um elemento; portanto, o exterior Whereé $truee o número atual é deixado no pipeline. Caso contrário, sem elementos $bno pipeline, o externo Whereserá $false, portanto, o número atual não será colocado no pipeline.

Esses números são todos reunidos em parênteses, editados -joincom +sinais e canalizados para |iex(abreviação Invoke-Expressione semelhante a eval). O resultado da soma é deixado no pipeline e a saída é implícita.

AdmBorkBork
fonte
1

PHP, 78 76 74 bytes

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

O loop externo é executado $ide 1 a abaixo do primeiro argumento e adiciona $ia $sse não$f estiver definido. O loop interno se multiplica com ( argumento de módulo) para todos os argumentos subseqüentes, configurando para se é o múltiplo de qualquer um deles.
$f$i$f0$i

Corra com -r.

Titus
fonte
1

Scala, 47 bytes

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

n é uma lista que contém um primeiro argumento N, o restante são elementos deA

Funciona filtrando os números onde não existe pelo menos um A dos quais i é múltiplo e, em seguida, somando. A rigor, devemos usar n.tail.existsdentro do fechamento, mas como i é sempre menor que N e, portanto, nunca um múltiplo de N, a solução ainda está completa sem isso.

sprague44
fonte
1

Java 8, 75 bytes

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

A assinatura do método para isso é int f(int N, List<Integer> A)

NonlinearFruit
fonte
1

Ruby, 52 48 46 bytes

->b{b[s=0].times{|x|b.find{|y|x%y<1&&s+=x}};s}
GB
fonte
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;}

Requer este conjunto de cabeçalhos na mesma pasta e a fnv-hashbiblioteca encontrada lá também. Compilar comogcc 1.c ../fnv-hash/libfnv.a -o 1 -DNODEBUG

Programa de teste:

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

saídas

23
23
23
gato
fonte
1

Japonês -x, 9 7 6 bytes

Ç*VøZâ

Tente

           :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
fonte
1

Sussurros 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

Experimente online!

Árvore de estrutura:

árvore struct

Como funciona

EachLα

f(x)={Eu|(Eu|x),EuN}ou seja, o conjunto de divisores dexg(x)=f(x)αou seja, a união dos divisores dexcomαh(x)=|g(x)|>0 0ieg(x)não está vazio

αβ

βEu={αEuh(αEu)0 0h(αEu)

αEuEuαββ0 0

caird coinheringaahing
fonte
1

K (ok) , 15 14 bytes

Solução:

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

Experimente online!

Exemplos:

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

Explicação:

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

Na verdade , 13 bytes

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

Experimente online!

Explicação:

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
fonte
0

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

Utiliza a forabordagem simple -loop, soma todos os múltiplos e a retorna. Entrada é o formato int, int[]matriz.

Kritixi Lithos
fonte