いくつかの首相


20

(ランダムに触発/mathpro//q/339890
(関連:12

異なる素数の入力リスト(例[2, 5, 7]:)と整数を指定すると、それらの素数のみを除数として含むものnよりも厳密に小さいすべての正の整数を出力nします。入力の場合[2, 5, 7]n=15これはの出力を意味します[2, 4, 5, 7, 8, 10, 14]

さらなる例

[list] n | output

[2, 5, 7] 15 | [2, 4, 5, 7, 8, 10, 14]
[2, 5, 7] 14 | [2, 4, 5, 7, 8, 10]
[2] 3 | [2]
[2] 9 | [2, 4, 8]
[103, 101, 97] 10000 | [97, 101, 103, 9409, 9797, 9991]
[97, 101, 103] 104 | [97, 101, 103]

規則と説明

  • 入力リストは空でないことが保証されていますが、単一の要素のみである場合があります
  • 入力リストは、最も便利な方法で事前にソートされていると想定できます。
  • n 入力リストの最大要素よりも常に大きくなります
  • たとえば、のように2**0 = 1、オプション1で出力リストに含めることができます
  • 入力と出力は任意の便利な方法で与えることができます
  • 結果をSTDOUTに出力するか、関数結果として返すことができます
  • 完全なプログラムまたは機能のいずれかが受け入れられます
  • 該当する場合は、入力/出力整数が言語のネイティブint範囲に収まると想定できます
  • 標準的な抜け穴は禁止されています
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

任意の順序で出力できますか?
xnor

@xnorはい、任意の順序で出力できます。
AdmBorkBork

すみませんが、確かに、「それらの素数を除数として含む」とは、「それらの素数の少なくとも1つを素数の除数として含む」という意味です。
アステカ

1出力で許可するために、仕様の変更を既存のソリューションに通知しておく必要があります。
シャギー

@AZTECCOそう。ただし、たとえば、リストがの[2, 3, 7]場合はを使用できません5
AdmBorkBork

回答:



5

05AB1E、6 バイト

<LʒfåP

最初の入力として整数を取り、2番目としてリストを取ります。1出力にオプションを含めます。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

<       # Decrease the (implicit) input by 1
 L      # Create a list in the range [1,input-1]
  ʒ     # Filter it by:
   f    #  Get all prime factors of the current number (without duplicates)
    å   #  Check for each if its in the (implicit) input-list
     P  #  And check if this is truthy for all
        # (after the filter, the result is output implicitly)

@Grimyが提供する2つの6 バイトの選択肢:

GNfåP

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

G       # Loop `N` in the range [1, (implicit) input):
 Nf     #  Get all prime factors of `N` (without duplicates)
   å    #  Check for each if its in the (implicit) input-list
    P   #  And check if this is truthy for all
       #  If it is, output the current `N` with trailing newline

これは非常に遅いですが([2,5,7], 15テストケースは既にタイムアウトしています)、他の2つのアプローチとは異なります。

sиPÑʒ›

上記の他の2つのプログラムとは異なり、最初の入力としてリストを、2番目として整数を使用します。1ただし、出力にもオプションが含まれます。

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

s       # Swap so the stack is now [list-input, integer-input]
 и      # Repeat the list (flattened) the integer amount of times
        #  i.e. [2,5] and 10 → [2,5,2,5,2,5,2,5,2,5,2,5,2,5,2,5,2,5,2,5]
  P     # Take the product of this list
        #  → 10000000000
   Ñ    # Get all divisors of this integer
        # (the bottleneck for larger integers in this approach)
        #  → [1,2,4,5,8,10,16,20,25,32,40,50,64,80,100,125,128,160,200,250,256,320,400,500,512,625,640,800,1000,1024,1250,1280,1600,2000,2500,2560,3125,3200,4000,5000,5120,6250,6400,8000,10000,12500,12800,15625,16000,20000,25000,25600,31250,32000,40000,50000,62500,64000,78125,80000,100000,125000,128000,156250,160000,200000,250000,312500,320000,390625,400000,500000,625000,640000,781250,800000,1000000,1250000,1562500,1600000,1953125,2000000,2500000,3125000,3200000,3906250,4000000,5000000,6250000,7812500,8000000,9765625,10000000,12500000,15625000,16000000,19531250,20000000,25000000,31250000,39062500,40000000,50000000,62500000,78125000,80000000,100000000,125000000,156250000,200000000,250000000,312500000,400000000,500000000,625000000,1000000000,1250000000,2000000000,2500000000,5000000000,10000000000]
    ʒ   # Filter these divisors:
       #  And only keep those where the (implicit) input-integer is larger than the divisor
        #  → [1,2,4,5,8]
        # (after the filter, the result is output implicitly)

1
7代替:sиPѦʒ›。私は6を持っていたと思ったが、使用して回避する方法があるようには思えないs/ I/¹
Grimmy

@Grimy Niceの代替案ですが、実行には長い時間がかかります。最初のテストケースでは、のすべての約数を見つける必要があり4747561509943000000000000000ます。;)
Kevin Cruijssen

1
垂直出力の場合:GNfåP–
Grimmy

4

JavaScript(ES6)、 64 ... 52  50バイト

primesが集合(n)(primes)である場所として入力を受け取ります。セットを変更して出力します。

n=>g=(s,q=1)=>{for(p of s)(p*=q)<n&&g(s.add(p),p)}

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

コメント済み

n =>              // n = maximum value
g = (             // g is a recursive function taking:
  s,              //   s = set of primes
  q = 1           //   q = current product, initialized to 1
) => {            //
  for(p of s)     // for each value p in s:
    (p *= q)      //   multiply p by q
    < n &&        //   if the result is less than n:
      g(          //     do a recursive call:
        s.add(p), //       with p added to the set
        p         //       with q = p
      )           //     end of recursive call
}                 //

4

Pythonの368の 65バイト

f=lambda s,n,c=1:n//c*s and f(s,n,s[0]*c)+f(s[1:],n,c)or[c][:c<n]

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

@xnorのおかげで-3バイト

この関数は、入力として素数列と整数nを取ります。出力は1を含むリストです。

ゴルフをしていない:

def f(s, n, c=1):
    if not c < n:
       return []
    elif not s:
       return [c]
    else:
       return f(s,n,s[0]*c) + f(s[1:],n,c)

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


それはあなたが持っているいくつかのきちんとした短絡コードです。最初の2つの条件をとして組み合わせることができるようですc*s<n*s。編集:n//c*s短いです。
xnor

@xnor改善してくれてありがとう。あなたのアプローチも非常に良いです。
ジョエル



3

Python 2、65バイト

lambda l,n:[k for k in range(2,n)if reduce(int.__mul__,l)**n%k<1]

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

高倍率の積kがで割り切れるかどうかを調べることにより、素数だけで割り切れるかどうかをチェックします。llk

場合はl、文字列のリストとすることができるeval("*".join(l)) 3バイトをセーブ以上reduce(int.__mul__,l)と欠けているのPython 3で使用することができますreduce

Python 3、64バイト

def f(l,n,P=1):
 for x in l:P*=x
 n-=1;P**n%n or print(n);f(l,n)

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

関数が逆順で出力し、エラーで終了する関数。

以下の再帰的な解決策は、nそれ自体がリストに含まれている場合は短くなります。の積も再帰的に計算してみましたlが、それより長くなりました。

62バイト(非稼働)

f=lambda l,n:n*[f]and[n][reduce(int.__mul__,l)**n%n:]+f(l,n-1)

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


1

ガイア、10バイト

…@e⟪ḍ‡⁻!⟫⁇

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

私はこれまでにモナドを使用したことがないので、スタック操作に非常に役立ちます。

…		| push [0..n-1]
@e		| push list of primes
  ⟪    ⟫⁇	| filter [0..n-1] for where the following predicate is true:
   ḍ‡		| the list of prime factors
     ⁻		| minus the list of primes
      !		| is empty





0

これは1出力に含まれますが、そうすべきではありません。私k e!øVも自分のソリューションで始めましたが、0&をフィルタリングするために2バイト余分に必要でした1
シャギー

Since, e.g., 2**0 = 1, you can optionally include 1 in your output list
無知の具現化

それは元の仕様の一部ではありませんでした。
シャギー


0

Retina 0.8.2、64バイト

\d+
$*
\G1
$.`,$`;
+`,(1+)(\1)*(?=;.* \1\b)
,1$#2$*
!`\d+(?=,1;)

オンラインでお試しください!リストには、より小さいテストケースが含まれます(10000すべての長い文字列のためにタイムアウトします)。入力を順番に受け取りますn f1 f2 f3...(因子は素数である必要はありませんが、互いに素である必要があります)。出力にはが含まれ1ます。説明:

\d+
$*

単項に変換します。

\G1
$.`,$`;

n-110進数と単項の両方で0からのリストを生成します。

+`,(1+)(\1)*(?=;.* \1\b)
,1$#2$*

単項式を利用可能な因子で繰り返し除算します。

!`\d+(?=,1;)

単項数をに減らした10進数を出力し1ます。


0

Pyth、10バイト

f!-PThQtUe

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

入力を受け取ります [[primes...], n]

        Ue  # range(0, Q[-1])  (Q is the input, implicit)
       t    #                [1:] -> range(1, Q[-1]), tUe == PSe
f           # filter that on the condition: lambda T:
   PT       # prime_divisors(T)
  -  hQ     #                   - Q[0]
 !          # logical negation (![] == True)


0

22 20バイト

IΦ…²η⬤…·²ι∨﹪ιλ⊙θ¬﹪λν

オンラインでお試しください!リンクは、コードの詳細バージョンです。大きなテストケースでは遅すぎます。説明:

 Φ                      Filter on
  …                     Range from
   ²                    Literal `2` to
    η                   Input limit
     ⬤                  Where all values
      …·                Inclusive range from
        ²               Literal `2` to
         ι              Filter value
          ∨             Either
             λ          Inner value
           ﹪            Is not a divisor of
            ι           Filter value
              ⊙         Or any of
               θ        Input primes
                   ν    Current prime
                ¬﹪      Is a divisor of
                  λ     Inner value
I                       Cast to string for implicit print

以前のより高速な22バイトの回答:

⊞υ¹FυF×ιθF›‹κη№υκ⊞υκIυ

オンラインでお試しください!リンクは、コードの詳細バージョンです。出力にはが含まれ1ます。説明:

⊞υ¹

1定義済みの空のリストにプッシュします。

Fυ

ループ中にプッシュされた項目を含むリストをループします。

F×ιθ

現在のアイテムに各素数を乗算し、製品をループします。

F›‹κη№υκ

製品が新しい値であるかどうかを確認します。

⊞υκ

その場合は、リストにプッシュします。

Iυ

リストを印刷します。


0

C(clang)、115バイト

#define f(n,l,z){int j,i,k,x[n]={};for(i=x[1]=1;i<n;printf(x[i]+"\0%d ",i++))for(j=z;j--;k<n?x[k]=x[i]:0)k=i*l[j];}

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

エラトステネスベースのソリューションのふるい。

(出力に1を含む)

@ceilingcatの提案のおかげで:x [i] && printf( "%d"、i)、i ++の代わりにprintf(x [i] + "\ 0%d"、i ++)ドキュメントは見つかりませんでした。誰かが私に洞察を与えてくれるなら歓迎します。


ありがとう。
アステカ

1
その場合x[i]==1、文字列は"%d "です。その場合x[i]==0、文字列は""です。Cストリングはヌルで終了するため、明示的なヌル文字でストリングが終了します。また、このハックは、に関連するclangの未定義の動作を乱用しi++ます。
天井猫
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.