N'nin altındaki bazı sayı kümelerinin katı olan sayıların toplamını bulun.


31

Project Euler'in ilk sorusuna neredeyse eşdeğer:

10'un altındaki 3 veya 5'in katları olan tüm doğal sayıları listelersek, 3, 5, 6 ve 9 sayısını elde ederiz.

1000'in altındaki 3 veya 5'in katlarının toplamını bulun.

Meydan okuma:

Olumlu bir tamsayı Nve en az bir pozitif tamsayı kümesi göz önüne alındığında A, tüm pozitif tamsayıların toplamından N, en az bir üyenin katlarından daha az çıktısını alın A.

Örneğin, Proje Euler durumu için girdi şöyle olacaktır:

1000
3
5

Test durumları:

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) İkisinin katları olan sayıları iki kere mi sayıyoruz? 2) Sadece iki başka numara alabilir miyiz? veya herhangi bir miktarda bir veya 3 demek?
Buğday Sihirbazı

3
Bazı test durumları verebilir misiniz? Belli ki cevabı PE olanına göndermeyin, peki ya diğer örnekler?
Rɪᴋᴇʀ

1
@WheatWizard: "veya" sözcüğü, her sayının en fazla bir kere sayıldığını belirtir. Bununla birlikte, sorunun kaç tane "sayıyı kontrol edeceğimiz" argümanlarının desteklenmesi gerektiği konusunda netleşmesi gerektiğine katılıyorum. Tam olarak iki mi? Bir veya daha fazla? Sıfır mı yoksa daha mı?
smear

1
" 10'a eşit veya altı sayılar " alabilir veya 10 yerine girdi olarak 9 alabilir miyiz?
Stewie Griffin

"ve en az bir pozitif tamsayı A kümesi" ne kadar büyük olabilir?
16'da

Yanıtlar:


13

Jöle , 6 bayt

ḍþṖḅTS

Çevrimiçi deneyin!

Nasıl çalışır

ḍþṖḅ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
Elbette @Dennis, ppcg
Grajdeanu

8

Python, 59 55 bayt

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

repl.it

Bir tamsayı alarak adsız fonksiyon ve bir tamsayı nlistesi l. Tamsayılar için sıfıra ( ) bölündükten sonra kalanları içeren n( ancak sıfır olan) bir Tabiat sayı aralığını (artı sıfır) geçirir.sum(...)v%m<1anymListedekil . 3 bayt kaydetmek için koşullu yerine çarpma kullanır.


8

Octave, 38 36 33 bayt

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

Girişi şu şekilde al: f(10, [3;5]) . Giriş f(9,[3;5])aynı test durumu için olabilirse bu 2 bayt daha kısa olacaktır .

Tüm test durumlarını burada doğrulayın.


Açıklama:

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

Oktav ön azaltma yapabilir, bu nedenle 1:--x1:x-1 (iki kere) yerine iki bayttan tasarruf sağlar.

mod(a,b)verir 1 2 0 1 2 0 1 2 0için mod(1:9,3). İkinci argüman dikey bir vektör ise, ilk girişi dikey olarak çoğaltır ve ikinci giriş argümanındaki değerlerin her biri için modülü alır. Yani, giriş için mod(1:9, [3;5])bu verir:

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

Bunu kabul etmek ~all(_,1), trueen az bir değerin sıfır olduğu ve falsetüm değerlerin sıfır olmadığı sütunlar için verir :

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

,1Durumunda ihtiyaç duyulan tek sayı vardır y. Aksi halde, numaralar yerine tüm vektör üzerinde etki eder.

Bunu dikey bir matrise aktarmak ve matris çarpımını kullanmak, açıkça toplamaya gerek kalmadan bize doğru cevabı verecektir:


Ah bu çok acımasız: x ve x – 1 arasındaki farktan dolayı 2 bayt eklemek zorunda kaldım, ama 4 bayt eklemek zorunda kaldım ve şimdi 1 bayt ileride yerim> :)
Greg Martin

6

JavaScript (ES6), 40 39 36 bayt

Girdi: tamsayı nve akörleme sözdizimi olan tamsayıların dizisi(n)(a)

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

Test durumları


Aynı uzunlukta biraz daha farklı bir formülasyona sahip olmuştur: f=(n,a)=>n--&&a.some(v=>n%v<1)*n+f(n,a). Özyinmeden yapabileceğim en iyi 61 baytı.
Neil

@Neil Yorumunuz beni başka bir formülasyon aramaya teşvik etti. İlginçtir ki, körleme sözdizimi 3 bayt kazandırır.
Arnauld

5

MATL , 9 bayt

q:ti\~*us

Çevrimiçi deneyin!


1
Sadece bu hakkı okuyup anlamadığımı kontrol ediyorum (belgeleri kontrol etmeden). Azalıyorsunuz, bir vektör yaratıyorsunuz 1 2 .... Siz kopyalayın ve diğer girdiyi alın. Onu yok sayıyor ve vektörle 1 2 ..
Stewie Griffin

Kesinlikle! Cep telefonundayım, bu yüzden bir açıklama eklemedim. Şimdi gerekli değil :-)
Luis Mendo


4

Python, 67 bayt

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

Bunu yazdıktan sonra kodumun mevcut python cevabına benzer olduğunu fark ettim, ancak bağımsız olarak yazdım ve yine de gönderiyorum.


Uygulamada noktalı virgül gerekmez, çünkü zaten bir satır sonu var. Cevabımın aşırıya kaçabileceğini biliyordum!
Theo

Spec "en az bir pozitif tamsayı kümesi" diyor; Bu, yalnızca kümenin iki tamsayı olduğu durumun üstesinden gelir. Ayrıca x=y=0ayrı bir satıra sahip olmak dört bayttan tasarruf sağlar.
Jonathan Allan

@ JonathanAllan harika, çok teşekkürler!
Rɪᴋᴇʀ

4

Mathematica, 37 27 bayt

Büyük bayt tasarrufuna yol açan zekice bir gözlem için Martin Ender'e teşekkürler!

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

İki argüman alan bir isimsiz fonksiyon, bir #tamsayı listesi (istenen bölenler A) ve bir tamsayı #2(üst sınır N) ve bir tamsayı döndürür. listenin Range[#,#2-1,#]her bir elemanı için eşit veya daha küçük tüm katları (dolayısıyla daha az ) verir; Bu listelerin birliği daha sonra hesaplanır ve toplanır.d#d#-1#Tr .

Önceki versiyon:

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

1
Rangekiralanabilir: Tr[Union@@Range[#2,#-1,#2]]&(ve daha sonra girdilerin sırasını değiştirerek başka bir bayttan tasarruf edin)
Martin Ender

4

Perl 6 , 25 bayt

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

Girdi sayılarını argüman olarak alan bir lambda. (N için bir argüman ve A için isteğe bağlı bir argüman sayısı).

( Çevrimiçi deneyin. )

Açıklama:

  • { ... }: Bir lambda.
  • $^a: Lamda'nın ilk argümanı.
  • @_: Lambda'nın argümanları ("variadic parametresi").
  • ^$^a: Den Aralığı 0için $^a - 1.
  • * %% @_.any: *Bölünebilir-by operatörünü kullanarak argümanını listenin %%bir any- birleşimine karşı test eden başka bir lambda @_.
  • grep PREDICATE, RANGE: sayı aralığını yineler ve yüklemin doğru olduğu değerleri döndürür.

^Bir yer tutucu parametresi bildirmek için eklemenin oldukça açık olduğunu düşünüyorum . Özellikle daha sonra blokta kullanabildiğiniz için $a. Bence sadece $_ @_ %_ selförtük olarak ilan edilebilecek kadar sayılabilir. Ben bu hat okuma "olurdu düşünmek yer tutucu olarak birinci parametreyi beyan "
Brad Gilbert b2gills

@ BradGilbertb2gills: Kod lambda'nın vücudundan önce bir imza koymamış olsa bile, dolaylı olarak lambanın imzasının bir parçası haline geldiğini kastettim. @_ve %_fonksiyonlar söz konusu olduğunda, bu konuda hiçbir fark yoktur: Vücutta ortaya çıkarlarsa, sadece imzanın bir parçası olurlar. Yalnızca $_ (ve selfve %_yöntemlerde) varsayılan olarak bir imzanın parçası olabilir.
16'da

Not: Kodun anlaşılması gerekmediği için şimdi "dolaylı olarak ilan edildi" ifadesini kaldırdım.
16'da

3

R, 67 bayt

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

Aşağıdaki biçimde STDIN için bir vektör Alır: [N, a_1, a_2, ...]. Herhangi bir sayıda destekler a. Her biri için , basamaksız aolan diziyi oluşturur . Sonra o vektördeki tüm benzersiz girişlerin toplamını alır.aN-1a


3

Haskell, 42 39 bayt

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

Kullanımı:

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

3 baytlık @Zgarb'a teşekkürler


(x`mod`)aynıdır mod x.
Zgarb

@Zgarb whoops :)
Angs

3

05AB1E , 9 bayt

FND²%P_*O

Çevrimiçi deneyin!

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

Bir filtre kullanarak 8 bayt veya 8 bayt alternatif . (İlk 8-byter, cevabınızı gönderdiğinizde mümkün değildi. à(En fazla) listeyi şimdi
açtığı için

3

Octave, 49 37 bayt

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

fonksiyon olarak adlandırılacak f([2 3 4],50)

A=[2 3 4];Toplam sayıları toplamamız gerektiğini varsayalım.

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

Biz çarpabilirsiniz [2 3 4]tarafından 1:50matrisi elde etmek(1:N)'.*A

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

daha sonra, 50'den küçük olanları matristen çıkarın: z(z<N)

Matriste tekrarlanan elemanlar bulunduğundan, benzersiz değerler çıkarır ve bunları toplarız.

Önceki cevap : (eğer N == 1 ise bu çözüm başarısız olur)

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

fonksiyon olarak adlandırılmalıdır f(unit64([2 3 4]),uint64(50))


1
Çok hoş! Neredeyse diğer oktav cevabı gibi sıralama, ancak tamamen farklı bir yaklaşım. Bu hiç aklımdan geçmedi! Yine de bir açıklama yapmaktan ve belki de ideone ile olan bağlantıdan yararlanmak mümkün olabilir, ama benim oyum zaten sizde :-)
Stewie Griffin

Giriş sırasını değiştirdim, ancak işte bir bağlantı ideone.com/8Bljrl
Stewie Griffin

2

Pyth, 10 bayt

s{sm:0hQdt

açıklama

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 bayt

Bu @i2048 veya daha düşük bir değere sahip olduğu sürece çalışacaktır.

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

Denemek


2

APL (Dyalog Unicode) , 12 bayt

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

Çevrimiçi deneyin!

Anonim tacit işlevi. Bunun için 3 baytı tıraş etmeme yardım ettiğin için @ Adám'a teşekkürler. Kullanır ⎕IO←0.

Nasıl:

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

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

Çevrimiçi deneyin!

Açıklama:

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

hoppala! Çok hızlı okurum
Kenneth Taylor,

Çok daha iyi. Mükemmel cevap!
mbomb007

1

Python 2, 80 Bayt

Bu çok uzun. Kesinlikle kısaltılabilir. 3 sayıyı ayrı girdiler olarak almak, skoru kesinlikle olumsuz etkiliyor.

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()Şeklinde giriş yapabilir ve verebilirsiniz (1000,3,5).
Skyler,

1

Ortak 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 bayt

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

Çevrimiçi deneyin!

Yinelemeli çözüm. Girdiyi sayı $ave değişmez dizi olarak alır $b. Bir işleç kullanarak, 1aşağıdan yukarıya doğru $a(üzerinden --$a) döngülerWhere-Object|?{...}Belirli sayıları seçmek için yan tümcesine sahip bir

Madde $i, giriş dizisini bir $bbaşkasına göndermeden önce o anki sayı olarak belirlenir |?{...}, burada o anki sayının eşit olarak en az bir sayıya bölündüğü öğeleri seçer $b. Bu unsurlar $beşit olarak bölünürler, boru hattında bırakılırlar.

Bu nedenle, en az bir eleman varsa $b, boru hattı bir eleman içerir, böylece dış Whereolur $trueve mevcut sayı boru hattında kalır. Aksi takdirde, hiçbir elemanları ile $bboru hattı üzerinde, dış Whereolduğunu$false, so the current number is not placed on the pipeline.

Bu sayılar parenler içinde toplanmış, işaretlerle -joinbirlikte dizilmiş +ve borulara aktarılmıştır |iex(kısa Invoke-Expressionve benzer şekilde eval). Toplama sonucu, boru hattında bırakılır ve çıktı kesindir.


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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.