복합 번호 시퀀스


12

복합 번호 시퀀스

질문에서 영감을 얻은

양의 정수 n이 주어지면 코드는 첫 n 개의 복합 숫자를 출력해야합니다 .

입출력

프로그램이나 함수를 작성할 수 있습니다. 입력은 STDIN 또는 함수 인수를 통해 이루어지며 출력은 STDOUT 또는 함수 리턴 값으로 이루어집니다.

출력은 List, Array 또는 String 일 수 있습니다.

 0 -> 
 1 -> 4
 2 -> 4, 6
 3 -> 4, 6, 8
13 -> 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22

규칙

  • 항상 표준 허점 은 허용되지 않습니다.

  • 소수 또는 복합 번호를 생성하는 내장 기능은 허용되지 않습니다.

  • 소수 또는 복합 번호와 관련된 내장 기능은 허용되지 않습니다.


물론, 그것은 OEIS에 있습니다 : A002808
NinjaBearMonkey

답변:


11

Pyth-10 바이트

유효한 답변입니다. 윌슨 정리를 사용합니다 .

.f%h.!tZZQ

여기에서 온라인으로 사용해보십시오 .


이전 답변

Pyth-6 자

프라임 검사가 아닌 기본 인수 분해를 위해 내장 기능을 사용합니다 .

.ftPZQ

여기에서 온라인으로 사용해보십시오 .

.f  Q         First n that passes filter of lambda Z, uses input for how many
 t            Tail. This makes all that have len-one prime factorization become empty list, and thus falsey.
  P           Prime factorization - primes have a len-one factorization.
   Z          Lambda var

흠, 그것에 대해 생각해야 : /
Downgoat

1
규칙이 변경되어이 답변은 더 이상 유효하지 않습니다.
orlp

@orlp는 답변을 업데이트했습니다.
Maltysen

@Maltysen이 10 바이트 아닌가요?
kirbyfan64sos

@ kirbyfan64sos : / 분명히 길이 카운터를 읽을 수 없습니다. 고정.
Maltysen

8

Pyth, 11 바이트

<S{*M^tSQ2Q

[2, n] 및 잘린 모든 조합의 지나치게 큰 제품 목록을 생성합니다.


입력이 1또는 인 경우 작동하지 않습니다 2.
칫솔

7

TeX, 382 바이트

넌 할 수 있으니까.

\newcount\a\newcount\b\newcount\c\newcount\n\newcount\p\newcount\q\let\v\advance\let\e\else\let\z\ifnum
\def\d#1:#2:#3:{\z#1>#2\v#1 by-#2\d#1:#2:#3:\e\z#1=#2#3=1\e#3=0\fi\fi}
\def\i#1:#2:#3:{#3=0\z#1>#2\a=#1\d\a:#2:\c:
\z\c=0\b=#2\v\b by 1\i#1:\the\b:#3:\e#1\par\fi\e#3=1\fi}
\def\l#1:#2:#3:#4:{\i\the#1:2:#4:
\z#4=0\v#2 by 1\fi\z#2<#3\v#1 by 1\l#1:#2:#3:#4:\fi}
\l\p:\n:10:\q:\end

마지막 줄의 숫자는 원하는 복합 숫자의 수입니다.

이것은 간단한 제수 테스터입니다. 나누는 지 \d확인합니다 . 가능한 모든 분배자를 호출 합니다 (예 : < ). 0 을 반환 하는 첫 번째 숫자를 나열합니다 .#2#1\i\d#1\l#2\i

언 골프 (잘, 반 골프) 버전 :

\newcount\a
\newcount\b
\newcount\c
\newcount\n
\newcount\p
\newcount\q

\def\div#1:#2:#3:{%
  \ifnum#1>#2 %
    \advance#1 by-#2 %
    \div#1:#2:#3:%
  \else%
    \ifnum#1=#2 %
      #3=1%
    \else%
      #3=0%
    \fi%
  \fi%
}

\long\def\isprime#1:#2:#3:{%
  #3=0%
  \ifnum#1>#2 %
    \a=#1 %
    \div\a:#2:\c: %
    \ifnum\c=0 %
      \b=#2 %
      \advance\b by 1 %
      \isprime#1:\the\b:#3:%
    \else
      #1\par%
    \fi%
  \else%
    #3=1%
  \fi%
}

\def\listprimes#1:#2:#3:#4:{%
  \isprime\the#1:2:#4: %
  \ifnum#4=0 %
    \advance#2 by 1 %
  \fi
  \ifnum#2<#3 %
    \advance#1 by 1 %
    \listprimes#1:#2:#3:#4: %
  \fi
}

\listprimes\p:\n:11:\q:

\end

1
프로그래밍 퍼즐과 코드 골프에 오신 것을 환영합니다! 아무도 도전에 적합하지 않을 것이라고 생각한 언어로 된 첫 번째 대답. 매우 길지만 TeX에서는 독특하고 깔끔한 답변을 제공하며 그러한 답변에 감사드립니다.
TanMath

1
@TanMath 덕분에 따뜻한 환영, 나는이 경쟁에 너무 깁니다 실현,하지만 :) 재미

6

파이썬, 57

lambda n:sorted({(k/n+2)*(k%n+2)for k in range(n*n)})[:n]

덜 골프 :

def f(n):
 R=range(n)
 return sorted({(a+2)*(b+2)for a in R for b in R})[:n]

아이디어는 0과 1을 제외한 모든 자연수 쌍을 곱하여 복소수 집합을 생성하는 것입니다. 그런 다음이 집합을 정렬하고 첫 번째 n요소를 가져옵니다 . 세트의 카티 전 곱을 {2, 3, ..., n+2}자체 로 가져 가면 충분합니다.이 값은 range(n)2만큼 증가하여 얻을 수 있습니다 .

골프하기 위해, 우리는 두 개의 값을 저장하는 고전적인 골프 속임수 할 (a,b)range(n)하나의 값 k에를 range(n*n), 그리고로 압축을 풉니 다 a=k/n, b=k%n.


4

자바 8, 98 97 바이트

i->{int a[]=new int[i],c=3,k=0,d;for(;k<i;c++)for(d=c;d-->2;)if(c%d<1){a[k++]=c;break;}return a;}

상용구로 확장 :

public class C {
    public static void main(String[] args) {
        Function<Integer, int[]> f = i -> {
            int a[] = new int[i], c = 3;
            for (int k = 0; k < i; c++) {
                for (int d = c; d --> 2;) {
                    if (c % d < 1) {
                        a[k++] = c;
                        break;
                    }
                }
            }
            return a;
        };
        System.out.println(Arrays.toString(f.apply(5)));
    }
}

4

R, 53 바이트

n=scan();t=1:(n*n+3);t[factorial(t-1)%%t!=(t-1)][1:n]

작동 원리

이것은 또한 윌슨의 정리를 기반으로 1:n*n하며, 위에서 언급 한 정리에 따라 범위를 뛰어 넘고 복소수를 추출하기 만하면됩니다. 정수의 범위가 충분하지 +3않기 때문에 추가했습니다.n*nn < 3


이 솔루션의 유일한 문제는 (슬프게도) R이 충분히 큰 계승에 대한 정밀도를 잃어 버려서 제대로 작동하지 않는다는 것입니다 n > 19


3

CJam, 20 18 바이트

li_5*{_,2>f%0&},<`

온라인으로 사용해보십시오

내장 된 소수 또는 인수 분해 연산자를 사용하지 않습니다. 복합적인 숫자에 대한 상당히 무차별 한 힘 검사.

여기서 사용되는 한 가지 관찰은 테스트해야 할 숫자의 안전한 상한을 쉽게 계산할 수 있다는 것입니다. 4보다 큰 두 번째 숫자는 모두 복합이므로 4 + n * 2n 번째 복합 숫자의 상한입니다.

@Dennis의 제안에 따라 최신 구현은 실제로 n * 5상한선으로 사용되는데, 이는 훨씬 덜 효율적이지만 2 바이트 더 짧습니다.

설명:

li    Get and convert input.
_     Copy, will need the value to trim the list at the end.
5*    Calculate upper bound.
{     Start of filter.
  _     Copy value.
  ,     Create list [0 .. value-1].
  2>    Slice off the first two, leaving candidate factors [2 .. value-1].
  f%    Apply modulo with all candidate factors to value.
  0&    Check if one of the modulo results is 0.
},    End of filter.
<     Trim output to n values.
`     Convert list to string.

3

자바 스크립트 ES6, 88 자

n=>{r=[];for(q=2;r.length!=n;++q)if(/^(..+)\1+$/.test("-".repeat(q)))r.push(q);return r}

변수 할당을 제거하는 f=것이 합법적 이라고 생각합니다 .
DankMemes


1
이것은 83입니다 :n=>eval('for(r=[],q=2;r.length-n;/^(..+)\\1+$/.test("-".repeat(++q))&&r.push(q))r')
DankMemes

@DankMemes, cool :)
Qwertiy

1
@Qwertiy 죄송합니다 n&&!r[n-1]. 길이는 r.length<n한 문자보다 짧지 만 r.length!=n코드 골프 여야합니다. 맞습니까? :-]
칫솔

2

하스켈, 49 46 바이트

(`take`[x|x<-[4..],or[mod x y<1|y<-[2..x-1]]])

사용 예 :

*Main> (`take`[x|x<-[4..],or[mod x y<1|y<-[2..x-1]]]) 13
[4,6,8,9,10,12,14,15,16,18,20,21,22]

작동 원리

  [x|x<-[4..]    ]           -- keep all x from the integers starting with 4 where
      ,or                    -- where at least one element of the following list is "True"
    [mod x y<1|y<-[2..x-1]]  -- "x mod y < 1" for all y from [2,3,...x-1]
(`take`[   ])                -- take the first n elements from the xes
                             -- where n is the parameter supplied when calling the function

2

F #, 78 바이트

fun n->(Array.filter(fun i->Seq.exists((%)i>>(=)0)[2..i-1])[|2..n*n|]).[..n-1]

설명 :

fun n->                                                                      
                                                           [|2..n*n|]          // Generate an array of integers from 2 to n * n
        Array.filter(fun i->                              )                    // Filter it using the following function on each element
                                                  [2..i-1]                        // Generate a list of possible divisors (from 2 to i-1)
                            Seq.exists(          )                                // Check if at least one of the divisors is valid, that is
                                       (%)i>>(=)0                                    // That i % it is equal to 0. This is equivalent to (fun d -> i % d = 0)
       (                                                             ).[..n-1] // Take the n first elements of the resulting, filtered array

1
이것은 훌륭한 답변이지만 변수를 i두 번 사용하는 것은 약간 혼란 스럽 습니다. F #에 익숙하지 않지만 사용할 수 j없습니까?
wizzwizz4

그렇습니다. 그림자로 인해 작동했지만 골프를 칠 때 가독성을 잊어 버린 것 같습니다. ^ _ ^ '
Roujo

나는하지 않는 이제까지 실수의 종류를 확인하십시오. 아마 내가 왜 골프를
좋아하지 않는지

1

C ++ 109

int main(){int n,i,x=4;cin>>n;while(n){for(i=2;i<x-1;i++){if(x%i==0){cout<<x<<' ';n--;break;}}x++;}return 0;}

언 골프

int main(){
int n,i,x=4;cin>>n;
while(n)
{
for(i=2;i<x-1;i++)
{
if(x%i==0){cout<<x<<' ';n--;break;}
}
x++;
}
return 0;
}

1. ungolfed 버전에 적합한 형식을 지정하지 않는 이유는 무엇입니까? 2. 두 코드 모두에 추가 괄호가있는 것 같습니다. 3. 교체 할 수 있습니다 whilefor.
Qwertiy

1

줄리아, 103 바이트

n->(n>0&&println(4);n>1&&(i=0;c=big(6);while i<n-1 mod(factorial(c-1),c)<1&&(i+=1;println(c));c+=1end))

이것은 윌슨 정리를 사용합니다.

언 골프 드 :

function f(n::Int)
    # Always start with 4
    n > 0 && println(4)

    # Loop until we encounter n composites
    if n > 1
        i = 0
        c = big(6)
        while i < n-1
            if mod(factorial(c-1), c) == 0
                i += 1
                println(c)
            end
            c += 1
        end
    end
end

1

ECMAScript 6 – 107 91 84 바이트

n=>eval('for(a=[],x=4;n&&!a[~-n];x++)for(y=2;y*2<=x;)if(x%y++<1){a.push(x);break}a')

이 함수는 첫 번째 n복합 숫자 의 배열을 반환합니다 .

~-n멋진 글쓰기 방법입니다 n-1. 같은 길이지만 훨씬 더 재미 있죠?
내가 사용하는 유일한 이유 eval는 템플릿 n=>eval('...returnValue')이 1 자보다 짧기 때문 n=>{...return returnValue}입니다.

이전 버전

n=>eval('for(a=[],x=4;n&&!a[~-n];x++){for(z=0,y=2;y*2<=x;)if(x%y++<1)z=1;if(z)a.push(x)}a')

n=>eval('for(a=[],i=4;a.length<n;i++)if((x=>{for(y=2,z=1;y*2<=x;)if(x%y++<1)z=0;return!z})(i))a.push(i);a')

산출

 0 -> []
 1 -> [4]
 2 -> [4, 6]
 3 -> [4, 6, 8]
13 -> [4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22]

1

하스켈 , 44 바이트

Nimi의 이전 답변 에서 크게 영감을 받아 any중첩 된 목록 이해 대신 포인트 프리 람다를 기반으로 술어를 2 바이트 더 짧은 것으로 바꿉니다.

(`take`[x|x<-[4..],any((<)1.gcd x)[2..x-1]])

온라인으로 사용해보십시오!
( 정확한 TIO 링크를위한 Laikoni 덕분에 )

설명:

[x|x<-[4..],       -- consider all integers x >=4
[2..x-1]           -- consider all integers smaller than x
any((<)1.gcd x)    -- if for any of them 
    (<)1           -- 1 is smaller than
        .gcd x     -- the gcd of x and the lambda input
                   -- then we found a non-trivial factor and thus the number is composite
(`take`[  ])       -- take the first <argument> entries
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.