いくつかの数値セットの倍数であるn以下のすべての数値の合計を見つける


31

Project Eulerの最初の質問とほぼ同等:

3または5の倍数である10未満のすべての自然数をリストすると、3、5、6、および9が得られます。これらの倍数の合計は23です。

1000未満の3または5のすべての倍数の合計を見つけます。

チャレンジ:

正の整数Nと少なくとも1つの正の整数のセットが与えられると、それAより小さいすべての正の整数の合計をのN少なくとも1つのメンバーの倍数で出力しAます。

たとえば、プロジェクトオイラーの場合、入力は次のようになります。

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回数えますか?2)他の2つの番号しか取得できませんか?または、1つまたは3つと言う量ですか?
小麦ウィザード

3
いくつかのテストケースを提供できますか?明らかにPEに答えを投稿しないでください。しかし、他の例はどうでしょうか?
Rɪᴋᴇʀ

1
@WheatWizard:「または」という言葉は、各数値が1回だけカウントされることを意味します。ただし、「倍数を確認するための数」引数をいくつサポートする必要があるかを質問で明確にする必要があることに同意します。正確に2つ?1つ以上?ゼロ以上?
SMLS

1
10以下の数字」を入力できますか、10の代わりに9を入力として使用できますか?
スチューイーグリフィン

「および少なくとも1つの正の整数Aのセット」セットの大きさ
betseg 16

回答:


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アレックス。

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およびsums(sum(...))を含まない範囲で、自然数(プラスゼロ)の範囲をトラバースします。条件ではなく乗算を使用して、3バイトを節約します。v%m<1anyml


8

オクターブ、38 36 33バイト

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

次のように入力しますf(10, [3;5])。入力がf(9,[3;5])同じテストケース用である場合、これは2バイト短くなります。

ここですべてのテストケースを確認します。


説明:

@(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は事前にデクリメントできるため1:--x1:x-1(2回)の代わりに使用すると2バイト節約されます。

mod(a,b)与え1 2 0 1 2 0 1 2 0mod(1:9,3)。2番目の引数が垂直ベクトルの場合、最初の入力を垂直に複製し、2番目の入力引数の各値のモジュラスを取得します。したがって、入力の場合は次の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。それ以外の場合は、番号ごとではなくベクトル全体に作用します。

これを垂直行列に転置し、行列乗算を使用すると、明示的な合計を必要とせずに正しい答えが得られます。


ああ、それは残酷です。xとx–1の違いのために2バイトを追加する必要がありましたが、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

1
私がこの権利を読んだかどうかを確認するだけです(ドキュメントを確認せずに)。ベクトルを作成して、デクリメントしています1 2 ...。それを複製し、他の入力をモジュラスにします。あなたはそれを否定し、乗算ベクターを用いて1 2 ..、重複を取り除くためにユニーク使用し、最終的に...それを合計する
Stewieグリフィン

まさに!私はモバイルにいるので、説明を含めませんでした。今では必要ありません:-)
ルイスメンドー


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にセミコロンは必要ありません。私は自分の答えがゴルフを上回りうることを知っていました!
テオ

仕様には、「少なくとも1つの正の整数のセット」と書かれています。これは、セットが2つの整数である場合のみを処理するようです。またx=y=0、別の行を使用すると、4バイト節約できます。
ジョナサンアラン

@JonathanAllanクール、ありがとう!
Rɪᴋᴇʀ

4

Mathematica、37 27バイト

ビッグバイトの節約につながった鋭い観察をしてくれたMartin Enderに感謝!

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

#整数のリスト(必要な除数A)と整数#2(上限)の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には1つの引数、Aには任意の数の引数)。

オンラインで試してください。

説明:

  • { ... }:ラムダ。
  • $^a:ラムダの最初の引数。
  • @_:ラムダの残りの引数(「変数パラメータ」)。
  • ^$^a:からレンジ0$^a - 1
  • * %% @_.any:引数をテストする別のラムダ、*オペレータによって割り切れる-使用%%に対してany- ジャンクションリストの@_
  • grep PREDICATE, RANGE:数値の範囲を反復処理し、述語が真であるものを返します。

^プレースホルダーパラメーターを宣言するために追加することは、かなり明示的だと思います。特に、ブロック内で後で使用できるためです$a$_ @_ %_ self暗黙的に宣言されているとのみ考えられると思います。私はそのラインを読んで、「持っていると思うのプレースホルダとして最初のパラメータを宣言
ブラッド・ギルバートがb2gills

@ BradGilbertb2gills:コードがラムダの本体の前に署名を導入していなくても、暗黙的にラムダの署名の一部になることを意味しました。@_、および%_関数の場合、その点で違いはありません。これらも、本文に表示される場合にのみ署名の一部になります。のみ$_ (及びself及び%_方法で)デフォルトで署名の一部になることができます。
smls 16

PS:コードを理解するのに必要ではないので、「暗黙的に宣言された」というフレーズを今削除しました。
smls 16

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、stepsizeでシーケンスaを作成します。次に、そのベクトル内のすべての一意のエントリの合計を取ります。N-1a


3

Haskell、42 39バイト

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

使用法:

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

3バイトの@Zgarbに感謝


(x`mod`)はと同じmod xです。
ズガルブ16

@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
非常に素晴らしい!他のオクターブの答えとほぼ同じですが、まったく異なるアプローチです。これはまったく私の心を交差させませんでした!しかし、いくつかの説明とおそらくイデオンへのリンクを持っていることから利益を得ることができますが、あなたはすでに私の投票を持っています:
Stewie Griffin

私は、入力の順序を変更しましたが、ここではリンクのideone.com/8Bljrlは
Stewieグリフィン

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

非ゴルフ

(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最大1つ下から$a(を介して--$a)ループします。Where-Object|?{...}

節は$i、入力配列$bを別の配列に送信する前に現在の番号に設定します|?{...}。ここでは、現在の番号がの少なくとも1つの番号で均等に分割されている項目を選択し$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;

外側のループは$i1から最初の引数以下まで実行され$i$sif $fが設定されていない場合に追加されます。
内側のループは、後続のすべての引数に対して$f$iモジュロ引数)で乗算され、if がそれらのいずれかの倍数に設定さ$fれます。0$i

で実行し-rます。


1

Scala、47バイト

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

nは最初の引数を含むリストでN、残りは次の要素ですA

iが倍数であるAが少なくとも1つ存在しない数を除外し、合計することにより機能します。厳密に言えば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

ルビー、52 48 46バイト

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

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

ささやき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

オンラインでお試しください!

構造ツリー:

構造ツリー

使い方

EachLα

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

αβ

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

αiiαββ0



0

実際には、13バイト

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

オンラインでお試しください!

説明:

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

処理、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アプローチを使用し、すべての倍数を合計して返します。入力はフォーマットintint[]配列です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.