누락 된 소수를 인쇄


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" " 의 요소에 관여 할 수 는 없습니다."숫자는 제곱근보다 큰 하나의 소수를 가질 수 있습니다. 실제로, 당신의 처음 두 예제 (5와 20)는 모든 프라임, 두 번의 홀수 프라임과 마찬가지로이 속성을 가지고 있습니다. ...
Greg Martin

1
@GregMartin 예, 가능합니다. 그러나 전반부의 요소 안에서는 찾을 수 없습니다. 7 ^ 2가 48보다 크므로 누락 된 소수 48에 7을 포함하지 않는 것이 좋습니다. (내 추론은 여기에 있습니다)
Addison Crump

답변:


8

젤리, 젤리 코드 페이지의 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을 시도,하지만 P ^ 0.5 또는 어쩌면 쪽과 같이 쓸 수있다 그것에 대해 무엇을 읽고, SQRT (P)에 따라 결코 ^ 0.5 나는 비록 확실하지 두 번째 제안에 대한
t-clausen.dk

좋은! :) 나는 같은 접근법을 사용하여 옥타브 제출 을 게시했습니다 .
Stewie Griffin

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

매스 매 티카, 46 바이트

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

익명의 기능. 숫자를 입력으로 사용하고 숫자 목록을 출력으로 반환합니다. 유니 코드 문자는의 U + 2223 DIVIDES입니다 \[Divides].


2

루비, 55 바이트

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

기본 프라임 열거자를 사용하는 다소 게으른 답변.


2

Wonder , 14 바이트

@(_> > ^#0.5)P

용법:

(@(_> > ^#0.5)P)10

항목이 인수의 제곱근보다 작은 동안 무한 소수 목록에서 항목을 가져옵니다.



2

PowerShell v2 +, 71 바이트

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

반복 솔루션. 입력을 받아서 $n범위를 생성 1합니다 Sqrt($n)(범위 연산자는 [int]기본적으로 뱅커의 반올림을 수행 하는 범위로 상단을 캐스트합니다 ). 그런 다음 사용 |?{...}합니다 ( Where-Object필터와 같은 역할 운영자는) 그 숫자를 빼기 $n%$_제로가 아닌을 (즉, 모듈 수단에 대한 나머지는 고려되지, 그리고 0이 아닌이 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

NB- 범위 연산자가 최대 50,000 개의 항목 만 지원할 수 2500000000있기 때문에 입력이 around보다 큰 경우 이전 버전에서 실패 ..합니다. 그러나 이것이 기본 [int]데이터 유형의 최대 값 보다 크기 때문에 2147483647OK라고 가정합니다. 내 컴퓨터에서 PSv4 Win8.1을 사용하면 더 높아질 수 있지만 차이점을 설명하는 설명서를 찾을 수 없습니다.


2

자바 스크립트 (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 answer 에서 영감을 얻었 지만 옥타브 관련 기능을 사용하여 골프를 쳤습니다.

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

입력을받는 익명 함수입니다 x. 옥타브는 인라인 변수 할당 및 인덱싱 y기능을 통해 함수에서 먼저 생성 된 다음 (MATLAB에서는 불가능) 논리 마스크의 일부로 사용됩니다 ismember(MATLAB에서는 이와 같은 방식으로 수행 할 수 없음).


아주 좋은, 옥타브를 살펴 봐야합니다. 이러한 기능은 골프에 도움이 될 것입니다!
MattWH

1

펄 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 i0 -> False경우 i의 약수 x>0 -> True경우가 i아니다.

numbers::Primes(n)함수가 소수를 허용하지 않기 때문에 +5 바이트 , 2:sqrt(x)작동 하는 동안 if명령문 에 프라임 체크를 추가했습니다 .


1

하스켈, 55 54 바이트

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

가장 간단한 중첩 된 목록 이해. GCD는 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 .
Zgarb

또한 y * y <x 검사를 먼저 설정하여 조금 더 빨랐습니다.
James Hollis

0

망막 , 69 66 바이트

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

프라임을 가장 큰 것에서 가장 작은 것까지 별도의 줄에 인쇄합니다.

온라인으로 사용해보십시오! (마지막 두 개의 테스트 사례로 인해 약 10 초가 소요됩니다. 머리글과 바닥 글은 줄 바꿈으로 구분 된 테스트 스위트를 활성화하고 가독성을 위해 출력을 쉼표로 변환합니다.)

설명

.+
$*

입력을 단항으로 변환하십시오.

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

입력의 제곱근 앞에을 구분합니다 :. 제곱근은 제곱이 n첫 번째 n홀수 정수 의 합 이라는 사실을 기반으로 계산됩니다 . 연속 홀수 정수를 정방향 참조와 일치시킬 수 있습니다 (11\1|^1). 이 과정에서 그룹은 정확히 n시간 으로 사용 n되며, 입력에 제곱이 맞는 가장 큰 숫자입니다.

이 숫자의 단항 표현을로 $#1$*1다음에 콜론과 일치 항목을 삽입합니다.

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

이것은 제곱근에 맞는 모든 누락 된 소수와 일치합니다. 프라임 탐지는 표준 프라임 검사 정규 표현식을 기반 으로하며 방금 캡처 한 프라임이 입력을 두 번째 예측으로 나누지 않도록합니다. &옵션 을 사용하면 모든 소수를 얻을 수 있도록 겹치는 일치 항목이 표시됩니다.

M%`1

이것은 1s 의 수와 일치하여 각 행 (즉, 누락 된 소수)을 다시 십진수로 변환합니다 . 유일한 문제는 누락 된 소수가 전혀 없으면 0을 삽입한다는 것입니다.

^0

따라서이 단계는 추가 된 경우 0을 제거합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.