欠落している素数を印刷する


18

タスク

数値入力を渡すと、の因子ではない1のx平方根の下の素数を表示または返すプログラムまたは関数を記述します。xx

ましょうf(x)と呼ばれる関数であります:

>>> f(4)
[]

>>> f(5)
[2]

>>> f(20)
[3]

>>> f(60)
[7]

>>> f(100)
[3, 7]

>>> f(10000)
[3, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

ボーナスルール

  • あなたの言語が提供するビルトインを使用できます。
  • プログラムはx、言語で定義された上限と同じ高さの入力をサポートする必要があります。

1平方根の下の素数のみとして平方根を使用することは、実際にの因子に含まれxます。この制限を行わないと、大きな数字には多くの余分な数字が印刷されます。


3
「平方根より下の素数のみが実際にx」の要因に関与することはできません。数は平方根よりも大きい素数を1つ持つことができます。確かに、あなたの最初の2つの例(5と20)は、二回すべての奇数の素数、....すべての素数を行い、この特性を持っている
グレッグ・マーティン

1
@GregMartinはい、できますが、要因の前半では見つけることができません。7 ^ 2は48より大きいため、欠落している48の素数に7を含めないことは理にかなっています(私の推論はそこにあります)
Addison Crump

回答:


8

Jelly、Jellyのコードページの6バイト

½ÆRḟÆf

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

説明:

½ÆRḟÆf
 ÆR    All primes less than or equal to
½      the square root of the input
   ḟ   but with the following removed:
    Æf All prime factors of {the input, by default}

5
P:ゼリーは、文字通りの課題について説明し、多くの場合、答え
ETHproductions



5

MATLAB、57 54バイト

function h(p);a=primes(p^.5);a(~ismember(a,factor(p)))

かなり簡単で、sqrt(p)までの素数の配列を取得し、pの因子でもあるものをすべて削除します。セミコロンが省略されているため、デフォルトで最後の行の出力を印刷します。


1
私はMATLABを試したことがないが、私は第二の提案についてはわかりませんが、私はそれについて読んだものによると、SQRT(p)は、P ^ 0.5または多分P ^ 0.5のように記述することができます
t-clausen.dk

いいね!:) 同じアプローチを使用してOctaveの投稿投稿しました。
スチューウィーグリフィン

4

Pyth、10バイト

fP_T-S@Q2P

数字を入力してリストを印刷するプログラム。

テストスイート

使い方

fP_T-S@Q2P   Program. Input: Q
fP_T-S@Q2PQ  Implicit input fill
f            Filter
     S@Q2    the 1-indexed range up to floor(sqrt(Q))
    -    PQ  with the prime factors of Q removed
 P_T         by primality
             Implicitly print


3

PHP、76バイト

for($n=1;++$n*$n<$x=$argv[1];){for($i=$n;$n%--$i;);if($i<2&&$x%$n)echo$n,_;}

$ n> 1でゴルフしたis_primeソリューションを使用します

コマンドライン引数から入力を受け取ります。で実行し-rます。


2

Mathematica、46バイト

Select[Prime@Range@PrimePi@Sqrt[a=#],!#∣a&]&

匿名関数。入力として数値を受け取り、出力として数値のリストを返します。Unicode文字はU + 2223 DIVIDES for \[Divides]です。


2

Ruby、55バイト

require'prime'
->x{Prime.to_a(x**0.5).select{|n|x%n>0}}

組み込みの素数列挙子を使用したやや怠laな回答。




2

PowerShell v2 +、71バイト

param($n)1..[math]::Sqrt($n)|?{$n%$_-and'1'*$_-match'^(?!(..+)\1+$)..'}

反復ソリューション。入力$nを取得し、から1までの範囲を作成しますSqrt($n)(範囲演算子は[int]、デフォルトで上限を暗黙的にキャストして、バンカーの丸めを行います)。次いで、使用|?{...}Where-Objectこれらの数字引き出すためのフィルタのように作用する演算子を、) $n%$_(すなわち、モジュロ手段への残りはそれが要因ではない、任意の非ゼロtruthyある)非ゼロであるが、通常の正規表現プライム試験であります。これらはパイプラインに残り、出力は暗黙的です。-and$true

(出力をきれいにするためのいくつかの追加のフォーマットを使用)

PS C:\Tools\Scripts\golfing> 5,20,60,100,10000|%{"f($_)";(.\print-the-missing-primes.ps1 $_)-join', ';""}
f(5)
2

f(20)
3

f(60)
7

f(100)
3, 7

f(10000)
3, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97

注- 範囲演算子は最大50,000個のアイテムしかサポートできない2500000000ため、入力がaroundよりも大きい場合、これは以前のバージョンでは失敗し..ます。しかし、それはデフォルトの[int]データ型の最大値であるより大きいので2147483647、私はそれがOKであると推測しています。しかし、私のマシンであるPSv4 Win8.1では、上位に移動できますが、違いを説明するドキュメントを見つけることができません。


2

JavaScript(ES6)、79 76バイト

f=(q,n=2,x=n)=>n*n<q?[...--x<2&&q%n?[n]:[],...x>1&&n%x?f(q,n,x):f(q,n+1)]:[]

再帰的素数テスト関数に基づいています。これを簡素化する方法はいくつかあると思いますが、どうすればよいかわかりません...

テストスニペット

f=(q,n=2,x=n)=>n*n<q?[...--x<2&&q%n?[n]:[],...x>1&&n%x?f(q,n,x):f(q,n+1)]:[]
<input type="number" step=1 min=4 value=4 oninput="O.innerHTML='['+f(this.value)+']'"><br>
<pre id=O>[]</pre>


2

オクターブ、44バイト

この回答は、MattWHのMATLABの回答に触発されていますが、Octave固有の機能を使用してゴルフをしました。

@(x)(y=primes(x^.5))(~ismember(y,factor(x)))

これは、入力を受け取る匿名関数ですx。Octaveにはインライン変数の割り当てとインデックスがありy、関数で最初に作成でき(MATLABでは不可能)、作成された論理マスクの一部として使用できます(MATLABではismemberこの方法ではできません)。


とてもいい、Octaveを調べなければならない。これらの機能はゴルフに役立つでしょう!
MattWH 16

1

Perl 6、37バイト

{grep {$^a.is-prime&$_%$a},2.. .sqrt}

拡張:

{   # bare block lambda with implicit parameter 「$_」

  grep
  {
    $^a.is-prime  # check if it is prime
    &             # and junction
    $_ % $a       # check if the input is not evenly divisible by it
  },
  2.. .sqrt          # Range of values up-to and including squareroot
}

1

TSQL、130バイト

DECLARE @v int=10000

,@ INT=2SELECT 2p INTO #
g:INSERT # SELECT @ FROM # HAVING isnull(min(@%p),1)>0SET @+=1IF @*@<@v GOTO g
SELECT*FROM # WHERE @v%p>0

これは一度だけ実行されます。その後、同じエディターで一時テーブルを削除して再度実行する必要があります

DROP TABLE #

それをテストするためのバージョンを作成しましたが、テーブルを作成するためのオンライン権限が利用できないため、少し長くなります。同じ理由で、ドロップテーブルは必要ありません。

オンラインで試す


1

R、58 63バイト

for(i in 2:sqrt(x<-scan()))if(x%%i&numbers::isPrime(i))print(i)

2からまでのすべての値をループしsqrt(x)、それらがnumbersパッケージで素数であるかどうかをチェックします。x%%i計算x mod iされ0 -> Falseた場合iの除数であるx>0 -> True場合はiありません。

+5バイト。numbers::Primes(n)関数は小数を許可しないため、機能しますが、ステートメントに2:sqrt(x)プライムチェックを追加しましたif


1

Haskell、55 54バイト

f x=[y|y<-[2..x],y*y<x,[z|z<-[1..y],gcd(z*x)y>1]==[y]]

ほとんどの場合、ネストされたリストの内包表記。GCDは2つの役割を果たします。yの下の数値がyの因子であるかどうかをテストし、yがxの因子であるかどうかをテストします。

少し間隔をあけて:

f x = [ y|y<-[2..x],     y*y<x,     [z|z<-[1..y], gcd (z*x) y > 1] == [y] ]

でバイトを保存しますgcd(z*x)y>1
ズガルブ16

また、y * y <xチェックを最初に配置して、少し速くしました。
ジェームズ・ホリス

0

網膜69 66バイト

.+
$*
(11\1|^1)+
$#1$*1:$&
M!&`(?!(11+)\1+:)(1+):(?!\2+$)
M%`1
^0

素数を最大から最小まで別々の行に印刷します。

オンラインでお試しください!(最後の2つのテストケースのために約10秒かかります。ヘッダーとフッターは、改行分離テストスイートを有効にし、出力を読みやすくするためにコンマ区切りに変換します。)

説明

.+
$*

入力を単項に変換します。

(11\1|^1)+
$#1$*1:$&

これにより、入力の平方根が先頭に追加され:ます。平方根は、平方nも最初のn奇数の整数の合計であるという事実に基づいて計算されます。連続した奇数の整数を前方参照と一致させることができます(11\1|^1)。プロセスでは、グループは正確にn何回も使用さnれます。ここで、は入力に収まる正方形の最大数です。

この数値の単項表現を挿入し$#1$*1、その後にコロンと一致自体を続けます。

M!&`(?!(11+)\1+:)(1+):(?!\2+$)

これは、平方根に収まるすべての欠落した素数に一致します。素数検出は標準の素数チェックregexに基づいており、キャプチャしたばかりの素数が2番目の先読みで入力を分割しないことを確認します。この&オプションを使用することにより、すべての素数を取得できるように、一致する部分が重複します。

M%`1

これは、1s の数を一致させることにより、各行(つまり、欠落している各素数)を10進数に変換し直します。唯一の問題は、欠落している素数がまったく見つからなかった場合にゼロを挿入することです。

^0

そのため、この段階では、ゼロが追加された場合は削除されます。

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