Crazy Librarian의 흥미로운 소수 순열 인덱스 번호 생성기


13

당신은 주요 시퀀스 코드로 하루를 저장 했고 수학 교사는 그것을 좋아했습니다. 그래서 사서 (a / k / a, 상사)에게 새로운 도전이 제기되었습니다. 축하합니다. 사서가 수학 교사에게 다시 감동을 줄 수 있도록 솔루션을 코딩해야합니다.

밑이 10 인 자연수 시퀀스부터 시작합니다. N

0, 1, 2, 3, 4, 5, 6 ...

제외 0하고 1, 하나이 순서의 모든 숫자가 소수, P

2, 3, 5, 7, 11, 13 ...

또는 복합물, C

4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20 ...

사서 생각에서 숫자의 소수 확대로 정수 자리를 삽입하는 방법에 반영 P , 수학 교사 대신 함수 생성 G (x, y)의 개수 얻어 x에서 N 으로 1 <= x <= 9하고 번호 y로부터 C 와 삽입물 x로를 y왼쪽에서 오른쪽으로 모든 위치에서 10 진수 확장 하여 고유 한 숫자 만 선택합니다.

예를 들어, G (3,14)314, 134, 143입니다. 그러나, G (1,14)가 아니라 114, 141당신이 앞에 추가 또는 삽입 여부로, 114, 같은 번호가 114생성됩니다.

수학 교사 는 순서가 증가 하면 P 의 숫자를 얻기 전에 이러한 순열을 몇 번이나 수행해야하는지 궁금했습니다 x. 수학 교사는 이것을 숫자 의 복합 프라임 인덱스 라고하며 CPI (y) 로 썼습니다 .

예를 들어, 4두 번만 수행해야합니다 : 14, 41이후 41소수, 그래서 CPI (4) 이다 2. 그러나 소수로 도달하기 전에 86 번 수행해야 하므로 CPI (8) 은 입니다.18, 81, 28, 82, 38, 83836

귀하의 작업은 입력 번호가 주어지면 이 Composite-Prime Index를 출력하는 코드를 작성하는 것 입니다.

입력

  • 단일 정수 y같은 yC 함수 인수 STDIN 또는 등가 통해 입력.
  • 계산을 위해 y일반적인 정수 범위에 맞는 것으로 가정 할 수 있습니다 (예 : 상한을 2 31 -1로 가정 ).
  • Cy없는 행동 은 정의되지 않았습니다.

산출

위에서 설명한대로 계산 된 결과 Composite-Prime Index 는 두 가지 예외를 제외하고 STDOUT 또는 이와 동등한 결과로 출력됩니다.

  • 경우 맨 마지막 순열 (즉, 추가 9로하는 y) 사람이 그 주요 결과 출력 -1. 아래에서 확장 된 예는 y=14입니다.
  • 순열이없는 경우 (즉, G (x, y) 는 모두에 대한 C 의 하위 집합 임 1 <= x <= 9) output 0. 아래에서 확장 된 예는 y=20입니다.

 y -> operations             : output
 4 -> 14, 41                 : 2
 6 -> 16, 61                 : 2
 8 -> 18, 81, 28, 82, 38, 83 : 6
 9 -> 19                     : 1
10 -> 110, 101               : 2
12 -> 112, 121, 212, 122, 312, 132, 123, 412, 142, 124, 512, 152, 125, 612, 162, 126, 712, 172, 127 : 19
14 -> 114, 141, 214, 124, 142, 314, 134, 143, 414, 144, 514, 154, 145, 614, 164, 146, 714, 174, 147, 814, 184, 148, 914, 194, 149 : -1
15 -> 115, 151               : 2
16 -> 116, 161, 216, 126, 162, 316, 136, 163 : 8
18 -> 118, 181               : 2
20 -> 120, 210, 201, 220, 202, 320, 230, 203, 420, 240, 204, 520, 250, 205, 620, 260, 206, 720, 270, 207, 820, 280, 208, 920, 290, 209 : 0

제한 사항

  • 이것은 사서가 수학 교사와 손 경련을 쉽게 보여줄 수 있도록 이것을 색인 카드에 전사해야하기 때문에 코드 골프입니다.
  • 표준 허점 제한이 적용됩니다. 사서는 사기꾼을 용납하지 않습니다.

리더 보드


9의 경우 19소수이므로 출력이 1이 아니어야합니까?
isaacg

와우, 멋진 답변 차트!
계단식 스타일

1
@ cascading-style 당신이 리더 보드를 의미한다면, 그것은 주로 Martin의 세공 입니다.
AdmBorkBork

답변:



2

하스켈, 166161 바이트

p n=mod(product[1..n-1]^2)n>0
q=p.read
n#c=[h++c:t|i<-[0..length n],(h,t)<-[splitAt i n]]
[y]%i|q y= -1|1<2=0
(y:z)%i|q y=i|1<2=z%(i+1)
f n=((n#)=<<['1'..'9'])%1 

사용 예 : f "8"-> 6, f "14"-> -1, f "20"-> 0.

작동 방식 : p우선 성 테스트입니다 ( 다른 도전 에서 @Mauris의 답변 에서 도난 ). 타입을 문자열에서 정수로 변환 q하기위한 래퍼 p. n # cc모든 위치에 삽입합니다 n. %숫자 목록과 색인을 가져옵니다 i. 목록의 첫 번째 요소가 소수이면을 반환 i하고 그렇지 않으면 목록의 꼬리와으로 다시 치료하십시오 i+1. 하나의 요소가 남았을 때 멈추고 -1소수이고 0그렇지 않으면 돌아옵니다 .


1

Minkolang 0.11 , 85 바이트

n1(l*$d`)d9[i3G(0c2c$%$r2c*l*2c3c1+*++2gl:d2G)2gx1c2G3gx]r3XS(2M4&I)N.ikI1-4&1~N.1+N.

여기에서 시도하십시오.

설명 (출시 예정)

n            Take integer from input (say, n)
1(           Calculate smallest power of 10 greater than n (say, a)
  l*         Multiply by 10
    $d`      Duplicate stack and push n>a
       )     Close while loop (ends when n<=a)
        d    Duplicates a (let's call it b)

9[                                                 For loop that runs 9 times 
  i1+                                              Loop counter + 1 (say, i)
     3G                                            Puts the loop counter in position 3
       (                                           Opens while loop
        0c2c$%                                     Copies n and b and pushes n//b, n%b
              $r                                   Swaps top two elements of stack
                2c*l*                              Copies b and multiplies by 10
                     2c3c*                         Copies b and i and multiplies them
                          ++                       Adds it all together (inserts i)
                            2gl:                   Gets b and divides by 10
                                d2G                Duplicates and puts one copy back
                                   )               Closes while loop (breaks when b=0)
                                    2gx            Gets and dumps b
                                       1c2G        Copies a and puts it in b's place
                                           3gx     Get and dumps i
                                              ]    Close for loop

r       Reverses stack
 3X     Dumps the top three elements (namely, n, a, and b)
   S    Removes duplicates

(                           Opens while loop
 2M                         Pushes 1 if top of stack is prime, 0 otherwise
   4&                       Jump four spaces if prime
     I)N.                   If the loop actually finishes, then all were composite,
                             so output 0 and stop.
         ik                 Pushes loop counter and breaks
           I1-              Pushes length of stack minus 1 (0 if last one was prime)
              4&1~N.        If this is 0, pushes -1, outputs as integer, and stops.
                    1+N.    Adds 1, outputs as integer, and stops.

1

자바 스크립트, 324 바이트

y=>(p=(n,c)=>n%c!=0?c>=n-1?1:p(n,++c):0,u=a=>a.filter((c,i)=>a.indexOf(c)==i),g=(x,y)=>u(((x,y,z)=>z.map((c,i)=>z.slice(0,i).join("")+x+z.slice(i).join("")).concat(y+x))(x,y,y.split(''))),h=(x,y)=>g(x,y).concat(x==9?[]:h(++x,y)),i=h(1,y).reduce((r,c,i)=>r?r:p(c,2)?i+1:0,0),console.log(p(y,2)||y<2?'':i==h(1,y).length?-1:i))

y가 C가 아닌 경우 STDOUT 출력은 비어 있습니다.

설명

y=>(
    //Prime Test function
    p=(n,c)=>n%c!=0?c>=n-1?1:p(n,++c):0,

    //Unique function
    u=a=>a.filter((c,i)=>a.indexOf(c)==i),

    //Generates numbers from a couple x and y
    g=(x,y)=>u(((x,y,z)=>z.map((c,i)=>z.slice(0,i).join("")+x+z.slice(i).join("")).concat(y+x))(x,y,y.split(''))),

    //Generates all possible numbers from y using recusion
    h=(x,y)=>g(x,y).concat(x==9?[]:h(++x,y)),

    //Check if any prime in the generated numbers
    i=h(1,y).reduce((r,c,i)=>r?r:p(c,2)?i+1:0,0),

    console.log(
        //Is Y in C ?
        p(y,2)||y<2?
            ''
            :
            // Check if the answer is not the last one
            i==h(1,y).length?-1:i)
    )

매우 늦게이 주석에있을 수 있습니다,하지만 당신은 대체하여 몇 바이트를 저장할 수 없습니다 n%c!=0n%c; c>=n-1c>n-2; 과 x==9x-9?
Zacharý
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.