트위스트가있는 가장 작은 프라임 (A068103)


33

주어진 과제는 숫자가 주어지면 숫자 의 시작 부분에 AT LEASTn시작하는 가장 작은 소수를 찾습니다 . 이것은 OEIS에서 찾은 시퀀스입니다 ( A068103 ). n2

시퀀스의 처음 17 숫자는 아래에 나와 있습니다. 더 많은 것을 원한다면 실제로 시퀀스를 구현해야합니다.

0  = 2
1  = 2
2  = 223
3  = 2221
4  = 22229
5  = 2222203
6  = 22222223                # Notice how 6 and 7 are the same! 
7  = 22222223                # It must be **AT LEAST** 6, but no more than necessary.
8  = 222222227
9  = 22222222223             # Notice how 9 and 10 are the same!
10 = 22222222223             # It must be **AT LEAST** 9, but no more than necessary.
11 = 2222222222243
12 = 22222222222201
13 = 22222222222229
14 = 222222222222227
15 = 222222222222222043
16 = 222222222222222221

이것이 문자열 조작, 주요 감지 및 시퀀스의 멋진 조합이라고 생각했습니다. 이것은 이며, 가장 낮은 바이트 수는 아마도 월말에 승자로 선언됩니다.


5
얼마나 높은 입력을 지원해야하는지에 대한 하한이 있습니까?
ETHproductions

1
시간 제한이 있습니까?
브래드 길버트 b2gills

@ETHProductions 죄송합니다.이 글을 쓴 후 빨리 사라졌습니다. 입력을 제한해야하는 경우, 언어가보다 높은 숫자를 지원하지 않는 이유에 대한 논리적 인 주장으로 제한을 뒷받침해야합니다 x. 예를 들어, 언어가 32 비트 정수만 지원하는 경우이를 설명 할 수 있습니다.
Magic Octopus Urn

답변:


12

Brachylog , 12 11 바이트

:2rj:Acb#p=

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

이것은 놀라 울 정도로 직접 Brachylog로 변환됩니다. 이것은 전체 프로그램이 아닌 함수입니다 (인터프리터 Z를 명령 행 인수로 제공하면 함수를 프로그램에 작성하기 위해 적절한 랩퍼를 추가하게되므로 TIO 링크가 작동하도록하는 것입니다). 또한 j1- 인덱싱 된 것으로 보이며이를 허용하기 위해 수정이 필요한 것은 상당히 불행한 일 입니다.

당신은 =필요하지 않다는 합리적인 주장을 할 수 있지만, 문제가 말한 방식을 고려할 때, 나는 그렇게 생각합니다. 함수가 주어진 수의 2s로 시작하는 모든 소수 세트를 설명 하지 않고 프로그램 이이 설명 (이 경우 첫 번째 값 생성)으로 무언가를 수행 해야한다는 명시 적 진술 이 없으면 아마도 그렇지 않습니다. 사양을 준수하십시오.

설명

:2rjbAcb#p=
:2rj         2 repeated a number of times equal to the input plus one
    :Ac      with something appended to it
       b     minus the first element
        #p   is prime;
          =  figure out what the resulting values are and return them

정수를 반환하는 함수로 사용될 때 첫 번째 값을 요구하는 값은 없으므로 첫 번째 값만 걱정하면됩니다.

하나 미묘 (코멘트에 지적) :Acbb:Ac수학적으로 동일 (한 처음부터 제거하고 다른 하나는 결코 중복되지 사이에있는 지역으로, 끝 부분에 추가로); 이전에는 b:Ac더 자연 스럽지만 입력 0에서 중단됩니다 ( c빈 목록을 다른 항목에 연결하는 것을 거부하기 때문에 추측합니다 . 많은 Brachylog 내장은 어떤 이유로 빈 목록을 위반하는 경향이 있습니다). 빈 목록을 볼 필요가 :Acb없도록합니다. 즉 c, 입력 0의 경우에도 작동 할 수 있습니다.


@muddyfish : 그렇습니다. 그러나 0명백한 이유없이 작동하지 않았습니다 (Brachylog는 어떤 이유로 0에 알레르기가있는 것으로 보입니다 c. 즉, 쉽게 고칠 수 있으므로 지금 고칠 것입니다.

b:Ac입력에 0대해 제공 하기 때문에 작동하지 않습니다 2b:Ac: 2b제공 0하고 c앞에 0을 사용할 수 없습니다 . 그 이유는 항상 0을 앞에두고 동일한 결과를 얻을 수있는 일반적인 경우 무한 루프를 피하기 위해서입니다.
Fatalize

또한, :2rj대신 쓰면 1 바이트 씩 줄일 수 있습니다.,2:?j
Fatalize

나는 잊었다 r; 그것은 단지 명백한 개선 일뿐입니다. 나는 무슨 일이 일어나고 있는지 이해 c합니다 (뒤로 돌아갈 때 무한한 결과를 원하지 않습니다). 그러나, 입력이 이미 축 퇴한 값에 바인드 될 때 허용되는 동안, 입력이 언 바운드 된 경우에만 축퇴 된 입력을 허용하지 않는 것이 개선 될 가능성이 있습니다.

이것은 확실히 가능하며 Github 트래커에 추가 할 것입니다. concatenate의 구현 은 이미 거의 100 행 이지만 프롤로그 술어에는 많은 영향을줍니다.
Fatalize

15

자바 (오픈 JDK 8) , 164 (110) 바이트

a->{int i=0;for(;!(i+"").matches("2{"+a+"}.*")|new String(new char[i]).matches(".?|(..+)\\1+");i++);return i;}

많은 바이트에 대해 @FryAmTheEggman에게 감사합니다!

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


2
주로 정규 표현식을 확인하는 방법을 설명해 주시겠습니까?
J. Antonio Perez

나도 몰라 그것은 내 것이 아니며, 원래 제작자가 누구인지 모르겠습니다. 방금 길이 n의 문자열을 취하고 n이 소수가 아닌 경우 일치합니다.
Pavel

원래 출처가 무엇인지 아십니까? 그것에 대해 어디서 배웠습니까? 코드를 테스트 했습니까?
J. Antonio Perez

3
@Pavel 그 정규성 검사는 정규식을 확인하지 않아도 놀라운 답변을 제공합니다. "Java에서 골프 팁"스레드에 추가해야합니다.
Magic Octopus Urn

3
나는 지금 코드를 테스트 할 수는 없지만 정규 표현식이 다음과 같이 작동 new String(new char[i]))한다고 확신합니다 . 길이의 단항 문자열을 숫자와 같습니다. 그런 다음 정규 표현식은 일련의 숫자가 전체 문자열 (기본 시험 시행)에 맞는지 확인하여 복합 숫자와 일치합니다. 내가 맞다면, 두 번째 부분이없는 골프를 할 수 있어야 함을 의미 ?합니다. 컴퓨터에 도착하면 알려 드리겠습니다.
FryAmTheEggman

5

Pyth, 12 바이트

f&!x`T*Q\2P_

의사 코드에서 :

f                key_of_first_truthy_value( lambda T:
  !                  not (
   x`T*Q\2               repr(T).index(input()*'2')
                     )
 &                   and
          P_T        is_prime(T)
                 )

조건이 충족 될 때까지 1부터 증가 하여 lambda시작부터 반복합니다 T=1. 의 문자열은 문자열의 2시작 부분부터 하위 문자열이어야합니다. 즉, index 메소드는을 반환해야합니다 0. 부분 문자열을 찾지 -1못하면 편리하게 진실을 반환 하므로 예외적 인 경우가 없습니다.

여기서 온라인으로 시도 할 수 있지만 서버는 최대 입력 만 허용합니다 4.


4

펄, 50 바이트

49 바이트의 코드 + -p플래그.

++$\=~/^2{$_}/&&(1x$\)!~/^1?$|^(11+)\1+$/||redo}{

마지막 줄 바꿈없이 입력을 제공하십시오. 예를 들어 :

echo -n 4 | perl -pE '++$\=~/^2{$_}/&&(1x$\)!~/^1?$|^(11+)\1+$/||redo}{'

모든 숫자를 테스트 할 때 4보다 큰 숫자를 실행하는 데 시간이 걸립니다 (2 개의 테스트가 있습니다. 첫 번째 테스트는 처음에 /^2{$_}/2 개가 충분한 지 확인하고 두 번째 (1x$\)!~/^1?$|^(11+)\1+$/테스트는 성능이 매우 낮은 원시성을 테스트 함).


3

하스켈, 73 바이트

f n=[x|x<-[2..],all((>0).mod x)[3..x-1],take n(show x)==([1..n]>>"2")]!!0

사용 예 : f 3 -> 2221.

무차별 대입 현재 소수의 문자열 표현에서 첫 번째 문자 와 비교되는 [1..n]>>"2"의 목록을 작성합니다 .n 2n


3

수학, 103 바이트

ReplaceRepeated[0,i_/;!IntegerDigits@i~MatchQ~{2~Repeated~{#},___}||!PrimeQ@i:>i+1,MaxIterations->∞]&

음이 아닌 정수 인수를 취하는 이름없는 함수 # 를 반환합니다. 문자 그대로 모든 양의 정수를 #2로 시작하고 소수 인 정수를 찾을 때까지 차례로 테스트합니다 . 5를 초과하는 입력의 경우 엄청나게 느립니다.

이전 결과 : Mathematica, 155 바이트

Mathematica는 골프를 타지 않으면 골프에 더 좋습니다. 정수 / 목록 / 문자열 유형간에 명시 적으로 앞뒤로 전환해야합니다.

(d=FromDigits)[2&~Array~#~Join~{1}//.{j___,k_}/;!PrimeQ@d@{j,k}:>({j,k+1}//.{a__,b_,10,c___}->{a,b+1,0,c}/.{a:Repeated[2,#-1],3,b:0..}->{a,2,0,b})]/. 23->2&

이 알고리즘은 이상하게 시작하여 숫자 목록에서 작동합니다 {2,...,2,1}. 소수의 자릿수가 아닌 한 규칙을 사용하여 마지막 자릿수에 1을 더한 {j___,k_}/;!PrimeQ@d@{j,k}:>({j,k+1}다음 수동으로 한 자릿수로 다음 자릿수를 구현합니다. 숫자를 10으로, 규칙을 사용하여 {a__,b_,10,c___}->{a,b+1,0,c}... 그리고 마지막으로 2s 의 마지막 이로 바뀌 었다면 3, 규칙을 사용하여 끝에 다른 숫자로 시작합니다 {a,b+1,0,c}/.{a:Repeated[2,#-1],3,b:0..}->{a,2,0,b}. /. 23->2끝에 그냥 입력이 특별한 경우 수정 1대부분의 소수가 끝날 수 없습니다 2,하지만 2할 수 있습니다. (입력에 약간의 오차가 생겼습니다.01 하지만 함수가 정답을 찾는 길을 찾습니다.)

이 알고리즘은 매우 빠릅니다. 예를 들어, 랩톱에서는 1,000 2초로 시작하는 첫 번째 소수가임을 계산하는 데 3 초 미만이 걸립니다 22...220521.


2

Pyth, 17 바이트

f&q\2{<`T|Q1}TPTh

n = 4온라인 으로 해결할 수는 없지만 이론 상으로는 정확합니다.

설명

               Th    Starting from (input)+1, 
f                    find the first T so that
      <              the first
          Q          (input) characters
         | 1         or 1 character, if (input) == 0
       `T            of T's string representation
     {               with duplicates removed
  q\2                equal "2", 
 &                   and
            }T       T is found in
              PT     the list of T's prime factors.

2

펄 6 , 53 바이트

{($/=2 x$^n-1)~first {+($/~$_) .is-prime&&/^2/},0..*}

시도 해봐

넓히는:

{
  ( $/ = 2 x $^n-1 )       # add n-1 '2's to the front (cache in 「$/」)
  ~
  first {
    +( $/ ~ $_ ) .is-prime # find the first that when combined with 「$/」 is prime
    &&
    /^2/                   # that starts with a 2 (the rest are in 「$/」)
  },
  0..*
}


2

파이크, 14 바이트

.fj`Q\2*.^j_P&

여기 사용해보십시오!

.fj            - first number (asj)
   `    .^     -   str(i).startswith(V)
    Q\2*       -    input*"2"
             & -  ^ & V
          j_P  -   is_prime(j)

버그 수정 후 12 바이트 및 새로운 기능

~p#`Q\2*.^)h

여기 사용해보십시오!

~p           - all the primes
  #       )h - get the first where...
   `    .^   - str(i).startswith(V)
    Q\2*     -  input*"2"

2

세이지, 69 68 바이트

lambda n:(x for x in Primes()if '2'*len(`x`)=>'2'*n==`x`[:n]).next()

생성기를 사용하여 무한히 많은 항의 첫 번째 (최소)를 찾습니다.


2

apt, 20 바이트

L²o@'2pU +Xs s1)nÃæj

온라인으로 테스트하십시오! 내 컴퓨터에서 최대 14까지의 모든 입력에 대해 2 초 이내에 완료되며 자연스럽게 정밀도를 잃습니다 (JavaScript는 정수 정밀도가 최대 2 53입니다 ).

이 작업을 해준 @obarakon에게 많은 감사합니다 :-)

설명

                       // Implicit: U = input integer, L = 100
L²o                    // Generate the range [0...100²).
   @             Ã     // Map each item X through the following function:
    '2pU               //   Take a string of U "2"s.
         +Xs s1)n      //   Append all but the first digit of X, and cast to a number.
                       // If U = 3, we now have the list [222, 222, ..., 2220, 2221, ..., 222999].
                  æ    // Take the first item that returns a truthy value when:
                   j   //   it is checked for primality.
                       // This returns the first prime in the forementioned list.
                       // Implicit: output result of last expression

최신 버전의 Japt에서 이것은 12 바이트 일 수 있습니다.

_n j}b!+'2pU   // Implicit: U = input integer
_   }b         // Return the first non-negative bijective base-10 integer that returns
               // a truthy value when run through this function, but first,
      !+       //   prepend to each integer
        '2pU   //   a string of U '2's.
               // Now back to the filter function:
 n j           //   Cast to a number and check for primality.
               // Implicit: output result of last expression

온라인으로 테스트하십시오! 내 컴퓨터에서 최대 14 초 이내에 모든 입력에 대해 완료됩니다.


훌륭한 솔루션!
Oliver

테스트 결코 때문에 이것은 입력 5에 실패 2222203만, 222223곧 그 이후 2222210. 또한 2입력 15와 같이 s 문자열 다음에 3 개 이상의 추가 숫자가 필요한 입력에서도 실패합니다 .
Greg Martin

@GregMartin Darn, 그렇습니다. 5 바이트의 비용으로 고정되었습니다.
ETHproductions

이것은 테스트 사례를 수정하지만 알고리즘은 여전히 ​​소수를 찾기 위해 세 자리 이상을 추가 할 필요가 없다고 가정합니다. 더 큰 입력의 경우 거짓 일 수 있습니다.
Greg Martin

@GregMartin 이것은 최대 14 개까지의 모든 테스트 사례에서 작동하며 JS는 사례 15에서 정수 정밀도 문제를 겪습니다. 알고리즘이 이론적으로 2 ^ 53 이후에는 정확해야한다고 생각하지 않지만 아마도 틀렸을 것입니다.
ETHproductions

2

PHP, 76 바이트

for($h=str_pad(2,$i=$argv[1],2);$i>1;)for($i=$p=$h.++$n;$p%--$i;);echo$p?:2;

명령 행 인수에서 입력을받습니다. 로 실행하십시오 -r.

고장

for($h=str_pad(2,$i=$argv[1],2) # init $h to required head
    ;$i>1;                      # start loop if $p>2; continue while $p is not prime
)
    for($i=$p=$h.++$n               # 1. $p = next number starting with $h
                                    #    (first iteration: $p is even and >2 => no prime)
    ;$p%--$i;);                     # 2. loop until $i<$p and $p%$i==0 ($i=1 for primes)
echo$p?:2;                      # print result; `2` if $p is unset (= loop not started)

1

배쉬 (+ coreutils), 53 바이트

최대 2 ^ 63-1 (9223372036854775807) 까지 작동 하며 N> 8을 완료하는 데 상당한 시간이 걸립니다.

골프

seq $[2**63-1]|factor|grep -Pom1 "^2{$1}.*(?=: \S*$)"

테스트

>seq 0 7|xargs -L1 ./twist

2
2
223
2221
22229
2222203
22222223
22222223

1

파이썬 3, 406 바이트

w=2,3,5,7,11,13,17,19,23,29,31,37,41
def p(n):
 for q in w:
  if n%q<1:return n==q
  if q*q>n:return 1
 m=n-1;s,d=-1,m
 while d%2==0:s,d=s+1,d//2
 for a in w:
  x=pow(a,d,n)
  if x in(1,m):continue
  for _ in range(s):
   x=x*x%n
   if x==1:return 0
   if x==m:break
  else:return 0
 return 1
def f(i):
 if i<2:return 2
 k=1
 while k:
  k*=10;l=int('2'*i)*k
  for n in range(l+1,l+k,2):
   if p(n):return n

테스트 코드

for i in range(31):
    print('{:2} = {}'.format(i, f(i)))

테스트 출력

 0 = 2
 1 = 2
 2 = 223
 3 = 2221
 4 = 22229
 5 = 2222203
 6 = 22222223
 7 = 22222223
 8 = 222222227
 9 = 22222222223
10 = 22222222223
11 = 2222222222243
12 = 22222222222201
13 = 22222222222229
14 = 222222222222227
15 = 222222222222222043
16 = 222222222222222221
17 = 222222222222222221
18 = 22222222222222222253
19 = 222222222222222222277
20 = 2222222222222222222239
21 = 22222222222222222222201
22 = 222222222222222222222283
23 = 2222222222222222222222237
24 = 22222222222222222222222219
25 = 222222222222222222222222239
26 = 2222222222222222222222222209
27 = 2222222222222222222222222227
28 = 222222222222222222222222222269
29 = 2222222222222222222222222222201
30 = 222222222222222222222222222222053

바이트 크기가 아닌 상당히 넓은 범위에서 속도를 결정했습니다. :) 저는이 목격자들과 함께 결정론적인 Miller-Rabin 원시성 테스트를 사용하여 최대 3317044064679887385961981을 보장합니다. 큰 소수는 항상 성공적으로 테스트를 통과하지만 확률이 극히 낮 더라도 일부 합성물도 통과 할 수 있습니다 . 그러나 pyecm Elliptic Curve 인수 분해 프로그램을 사용하여 i> 22의 출력 번호를 테스트했으며 그 결과 가 소수입니다.


1
첫째, 제출물에는 올바른 결과가 나올 확률이 1이어야합니다. 둘째, 이것은 codegolf이므로 실제로 바이트 크기로 이동해야합니다. 그 외에
Destructible Lemon

1
@DestructibleWatermelon 감사합니다! 바이트 크기로 이동하는 것에 대한 적절한 요점. 전화를 인라인 할 수있을 것 같아요 p()... OTOH, 1 초 이내에 i> 20의 정확한 출력을 줄 수있는 상당히 작은 프로그램을 작성하는 것은 어렵습니다 우선 순위 검사기). :)
PM 2Ring

많은 프로그램이 33 자리 숫자를 처리 할 수 ​​없습니다 (n : = 30). OP의 황금 표준은 18 자리까지만 올라가고 그에 의해 달리 설정되는 제한이 없다고 가정하면 n : = 30이 충분한 IMO라고 가정하는 것이 합리적입니다.
user3819867

@ PM2Ring "1 초 미만"일 필요는 없습니다. 코드를 최대한 짧게 만들고 속도를 완전히 무시하십시오. 이것이 [code-golf]의 정신입니다. 다운 보트가 골프화되면 업 보트로 변경합니다.
mbomb007

실제로, 그것이 한계까지 올바른 출력을 생성하면 대답은 확률 1로 작동합니다.
Destructible Lemon

1

파이썬 3, 132 바이트

def f(x):
 k=10;p=2*(k**x//9)
 while x>1:
  for n in range(p*k,p*k+k):
   if all(n%q for q in range(2,n)):return n
  k*=10
 return 2

적은 바이트 수로 성능에 대한 희망이 사라졌습니다.


-1

자바, 163 바이트

BigInteger f(int a){for(int x=1;x>0;x+=2){BigInteger b=new BigInteger(new String(new char[a]).replace("\0","2")+x);if(b.isProbablePrime(99))return b;}return null;}

테스트 코드

    public static void main(String[] args) {
    for(int i = 2; i < 65; i++)
        System.out.println(i + " " + new Test20170105().f(i));
    }

산출:

2 223
3 2221
4 22229
5 2222219
6 22222223
7 22222223
8 222222227
9 22222222223
10 22222222223
11 2222222222243
12 22222222222229
13 22222222222229
14 222222222222227
15 222222222222222143
16 222222222222222221
17 222222222222222221
18 22222222222222222253
19 222222222222222222277
20 2222222222222222222239
21 22222222222222222222261
22 222222222222222222222283
23 2222222222222222222222237
24 22222222222222222222222219
25 222222222222222222222222239
26 2222222222222222222222222213
27 2222222222222222222222222227
28 222222222222222222222222222269
29 22222222222222222222222222222133
30 222222222222222222222222222222113
31 222222222222222222222222222222257
32 2222222222222222222222222222222243
33 22222222222222222222222222222222261
34 222222222222222222222222222222222223
35 222222222222222222222222222222222223
36 22222222222222222222222222222222222273
37 222222222222222222222222222222222222241
38 2222222222222222222222222222222222222287
39 22222222222222222222222222222222222222271
40 2222222222222222222222222222222222222222357
41 22222222222222222222222222222222222222222339
42 222222222222222222222222222222222222222222109
43 222222222222222222222222222222222222222222281
44 2222222222222222222222222222222222222222222297
45 22222222222222222222222222222222222222222222273
46 222222222222222222222222222222222222222222222253
47 2222222222222222222222222222222222222222222222219
48 22222222222222222222222222222222222222222222222219
49 2222222222222222222222222222222222222222222222222113
50 2222222222222222222222222222222222222222222222222279
51 22222222222222222222222222222222222222222222222222289
52 2222222222222222222222222222222222222222222222222222449
53 22222222222222222222222222222222222222222222222222222169
54 222222222222222222222222222222222222222222222222222222251
55 222222222222222222222222222222222222222222222222222222251
56 2222222222222222222222222222222222222222222222222222222213
57 222222222222222222222222222222222222222222222222222222222449
58 2222222222222222222222222222222222222222222222222222222222137
59 22222222222222222222222222222222222222222222222222222222222373
60 222222222222222222222222222222222222222222222222222222222222563
61 2222222222222222222222222222222222222222222222222222222222222129
62 2222222222222222222222222222222222222222222222222222222222222227
63 2222222222222222222222222222222222222222222222222222222222222227
64 2222222222222222222222222222222222222222222222222222222222222222203

582.5858 밀리 초

설명 : 정수를 반복하여 주어진 "2 's 문자열 인 루트 문자열에 문자열로 추가하고 소수인지 여부를 확인합니다.


3
isProbablePrime때때로 잘못된 긍정이 있습니다. 잘못된 값을 반환하는 환경이 있기 때문에 대답이 무효화됩니다.

실수 확률은 2 ^ -99 미만입니다 ( 문서 참조 ).
SamCle88

@ SamCle88 작은 확률, 그렇지 않다, 이것은 기술적으로 잘못되었습니다. isProbablePrime은 주요 검증에 허용되지 않으며 다른 문제에 대해서는 거부되었습니다.
Magic Octopus Urn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.