프라임 스퀘어를 만드십시오!


17

프라임 스퀘어 란?

프라임 스퀘어는 네 모서리가 모두 다른 프라임 숫자 인 정사각형입니다.
그러나 어느 것입니까?
그리고 우리는 그것들을 어떻게 구성합니까?

다음은 4x4 프라임 스퀘어의 예입니다.

1009  
0  0     
3  0   
1021    

먼저 왼쪽 상단에서 시작합니다. 우리는 시계 방향으로 일하고 있습니다. 1009 인 숫자를
가진 가장 작은 소수를 선택합니다 . 4

그런 다음 4숫자로 시작 하는 가장 작은 소수가 필요합니다 9. 이것은 9001입니다

세 번째 (4 자리) 소수 1는 마지막 숫자 ( 9001로 끝나기 때문에 1)
여야하며, 이전에 엣지로 사용되지 않은 이 속성에서 가장 작은 4 자리 소수입니다 .
이 소수는 1021입니다

네 번째 소수 있어야 4, 숫자 시작 로모그래퍼 1(인해 1009 로 시작 1)와 단부1(인해 1021 로 시작 1)
이 속성 최소 4 자리 소수 에지가 이전과 사용되지 않은 것이다 1,031

당신의 임무

당신은 정수 주어집니다 n에서 3 to 100
의 치수가 될 것입니다이 숫자를 n x n제곱
그런 다음해야 정확히 다음 테스트 케이스의 형태로 출력이 광장

테스트 사례

n=3  
Output    

101
3 0
113     

n=5    
Output     

10007
0   0
0   0    
9   0    
10061     

n=7     
Output    

1000003    
0     0     
0     0     
0     0     
0     0     
8     1     
1000037      

n=10      
Output     

1000000007      
0        0      
0        0     
0        0      
0        0       
0        0       
0        0      
1        0      
8        0       
1000000021      

n=20       
Output     

10000000000000000051     
0                  0          
0                  0           
0                  0           
0                  0          
0                  0           
0                  0          
0                  0           
0                  0           
0                  0          
0                  0          
0                  0          
0                  0           
0                  0           
0                  0          
0                  0            
0                  0          
0                  0              
9                  8      
10000000000000000097
  • 입력 및 출력은 편리한 방법 으로 제공 할 수 있습니다 .
  • STDOUT에 인쇄하거나 함수 결과로 리턴 할 수 있습니다.
  • 전체 프로그램 또는 기능이 허용됩니다.
  • 숫자가 적절하게 정렬되는 한 외부의 공백은 허용됩니다.
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

편집
이것은 모두 가능합니다 n
여기에 대한 소수는 다음과 같습니다n=100

1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000289        
9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091            
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000711             
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002191     



그리고 이것이 가능하지 않다고 생각하는 사람들을 위해 여기 모든 테스트 사례가 있습니다.


n은 100까지 갈 수 있다면, 그것은 좋은 N = 10보다 약간 더 큰 테스트 케이스를 가질 수 있습니다
gastropner

4
이것이 모든 n: P에 가능하다는 것이 입증 될 수 있습니까? 도전과 관련된 문제가 아니라 호기심이 많습니다.
매직 문어 Urn

2
@MagicOctopusUrn 그것은 모두 가능하지는 않습니다 n: n= 1의 경우, 4 개의 모서리가 서로 다른 소수라는 제약 조건을 만족시킬 수 없지만 n= 2의 경우 11,13,23을 선택해야합니다. 합성 인 12. 나는 모든 n> 2 가 가능하다는 증거는 없지만 비공식적으로 숫자가 많을수록 제약 조건을 충족시킬 수있는 "더블 룸"이 더 많다는 사실에 충격을받습니다.
Daniel Wagner

케이+1케이케이4634

2
@MagicOctopusUrn 산술 진행에 대한 소수 정리 는 1, 3, 7, 9로 끝나는 소수의 밀도에 대해 상당히 강한 것을 말합니다 (표기법에서 n = 10, a = 1 / 3 / 7 / 9를 취함). 충분히 큰 n경우 n1부터 시작하여 각 숫자로 끝나는 최소 2 개의 소수 가 있으며 (따라서 아래쪽 가장자리를 선택할 수 있음) 1부터 시작하여 1로 끝나는 최소 3 개의 소수가 있습니다 (따라서 왼쪽 가장자리).
Daniel Wagner 19 :

답변:


4

05AB1E , 64 63 56 53 48 46 바이트

°ÅPIùćÐ4FˆθUKD.ΔθyXÅ?yXÅ¿)¯gè}ÐNĀiR}¦}I¯JŽ9¦SΛ

-1 바이트 덕분 @ Mr.Xcoder
-5 덕분 바이트 @Grimy .

온라인으로 사용해보십시오.>4>7

설명:

°                 # Raise the (implicit) input to the power 10
 ÅP               # Get a list of primes within the range [2, n^10]
   Iù             # Only keep those of a length equal to the input
ć                 # Extract the head; push the remainder-list and first prime separately
 Ð                # Triplicate this first prime
4F                # Loop 4 times:
  ˆ               #  Add the (modified) prime at the top of the stack to the global array
  θU              #  Pop and store the last digit of the prime in variable `X`
  K               #  Remove this prime from the prime-list
  D               #  Duplicate the prime-list
                #  Find the first prime `y` in the prime list which is truthy for:
     θ            #   Get the last digit of prime `y`
     yXÅ?         #   Check if prime `y` starts with variable `X`
     yXÅ¿         #   Check if prime `y` ends with variable `X`
     )            #   Wrap the three results above into a list
      ¯g          #   Get the amount of items in the global array
        è         #   And use it to index into these three checks
                  #   (Note that only 1 is truthy for 05AB1E, so the `θ` basically checks
                  #    if the last digit of prime `y` is 1)
                #  Triplicate the found prime
      NĀi }       #  If the loop index is 1, 2, or 3:
         R        #   Reverse the found prime
      ¦           #  And then remove the first digit of the (potentially reversed) prime
}                 # After the loop:
 I                # Push the input as length
 ¯J               # Push the global array joined together to a single string
 Ž9¦S             # Push compressed integer 2460 converted to a list of digits: [2,4,6,0]
 Λ                # Draw the joined string in the directions [2,4,6,0] (aka [→,↓,←,↑])
                  # of a length equal to the input
                  # (which is output immediately and implicitly as result)

내이 05AB1E 팁을 참조하십시오 (섹션 얼마나 큰 정수를 압축하는 방법을? ) 이유를 이해하는 Ž9¦것입니다 2460. 그리고 나의이 05AB1E 팁을 참조 광장이와 출력 방법을 이해하기 위해 Λ캔버스 내장을.

NĀiR}¦I¯JŽ9¦SΛn=4[1009,9001,1021,1031][1009,"001","201","301"]Λ
I
¯J"1009001201301"n=4
Ž9¦S[2,4,6,0][→,↓,←,↑]


1
50 : 4F°ÅP¯KIù.Δ1sЮθÅ¿Š®θÅ?Šθ)¯gè}©ˆ}ð¯2ô`€R«€¦J«Ž9¦SΛ 49 : °ÅPIùć4FÐN1›iR}¦ˆθUKD.ΔÐθsXÅ?‚sXÅ¿ª¯gè]Ið¯J«Ž9¦SΛ 48 :°ÅPIùćÐ4FˆθUKD.ΔÐθsXÅ?‚sXÅ¿ª¯gè}ÐNĀiR}¦}I¯JŽ9¦SΛ
그리미

트윗 담아 가기 아주 좋은 골프. 나는 변경하여 48 바이트 버전을 기반으로 2 바이트 이상을 절약 할 수있었습니다 ÐθsXÅ?‚sXÅ¿ªθyXÅ?yXÅ¿). )그래도 왜 루프 범위 내에서 작동 하는지 확실하지 않습니다 . 왜냐하면 첫 번째 반복에서 프라임 목록을 목록으로 묶을 것으로 기대했기 때문입니다. 그러나 그것 없이도 yy대신 대신 사용 Ðss하면 1 바이트가 절약됩니다. :)
Kevin Cruijssen

4

05AB1E , 35 33 32 31 바이트

Kevin Cruijssen 덕분에 -1 바이트

°ÅPIùΔÐXθÅ?Ïн©KX®¦«UNií]IXŽ9¦SΛ

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

설명:

°                 # 10 to the power of the input
 ÅP               # list of primes up to that
   Iù             # keep only those with the same length as the input

Δ                 # repeat until the list doesn't change
# This ends up doing a ton of unneeded work. 4F (to loop 4 times) would be
# enough, but Δ is shorter and the extra iterations don’t cause issues.
# At the start of each iteration, the stack only contains the list of primes,
# and the variable X contains the current list of digits we’ll want to print.
# Conveniently, X defaults to 1, which is our first digit.

 Ð    Ï           # push a filtered copy of the list, keeping only…
    Å?            # numbers that start with…
  Xθ              # the last character of X
       н          # get the first element: this is our next prime

 ©                # save this number to the register
  K               # remove it from the list of candidate primes
   X              # push X
    ®             # restore the number from the register
     ¦            # remove its first character
      «           # concatenate it to X
       U          # save the result to X

 Ni               # if N == 1 (second time through the loop)
   í              # reverse all elements in the list of candidate primes
    ]             # closes both this if and the main loop

      Λ           # Draw on a canvas…
I                 # using the input as length…
 X                # using X as the string to draw…
  Ž9¦S            # using [2,4,6,0] (aka [→,↓,←,↑]) as the directions to draw in

이것은 부분적으로 Kevin의 답변을 기반으로 하지만이 시점에서는 의견이 아닌 자체 답변이 필요하다고 느꼈습니다.
Grimmy

1
나는 이제이 대답 만 봅니다. 아주 좋아요! 일반적인 방법 (및 첫 번째 부분과 마지막 부분) 외에도 4 개의 소수를 결정하고 문자열을 만드는 것은 다르게 수행되어 분리 된 답변을 이해할 수 있습니다. 나에게서 +1 Btw Θ에서 at을 제거하여 바이트를 저장할 수 있습니다 . 만 105AB1E에서 truthy은, 그래서 if Nif N == 1동일합니다.
Kevin Cruijssen '

1
@KevinCruijssen 감사합니다! 물론 나는 그것을 알고 있었지만 그것을 사용하는 것을 잊었습니다. 돌이켜 보면 Θi05AB1E는 다음과 같습니다 if (cond == true).
Grimmy

그렇습니다. :)는 Θ당신이를 제외한 모든 변환 할 경우 여전히 유용 할 수 있습니다 10. 그러나 if 문 i에 대해서는 의사 코드와 같이 실제로 필요한 것은 아닙니다 == true.
Kevin Cruijssen '

2

자바 스크립트 (ES8)  205 ...  바이트

TIO에서 시간 초과>8매우 비효율적 인 원시성 테스트로 인해 .

n=>([a,b,c]=[0,-1,--n,0].map(p=o=i=>o[(g=n=>{for(k=n++;n%k--;);k|o[n]|p[i]-n%10?g(n):p=n+''})((~i?1:p%10)*10**n)|p]=p),[...p].map((d,i)=>i?i<n?d.padEnd(n)+b[i]:c:a).join`
`)

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

어떻게?

1 단계 : 4 가지 소수 계산

[a, b, c] =               // save the 3 first primes into a, b and c
                          // (the 4th prime will be saved in p)
  [ 0, -1, --n, 0 ]       // decrement n and iterate over [ 0, -1, n, 0 ]
  .map(p =                // initialize p (previous prime) to a non-numeric value
       o =                // use o as a lookup table
  i =>                    // for each value i in the list defined above:
    o[                    //   update o:
      (g = n => {         //     g = recursive function taking n
        for(k = n++;      //       set k = n and increment n
            n % k--;);    //       decrement k until it's a divisor of n
                          //       (notice that k is decremented *after* the test)
        k |               //       if k is not equal to 0 (i.e. n is not prime)
        o[n] |            //       or n was already used
        p[i] - n % 10 ?   //       or the last digit of n does not match the connected
                          //       digit (if any) with the previous prime:
          g(n)            //         do a recursive call
        :                 //       else:
          p = n + ''      //         stop recursion and save n coerced to a string into p
      })(                 //     initial call to g with:
        (~i ? 1 : p % 10) //       either 10 ** n if i is not equal to -1
        * 10 ** n         //       or (p % 10) * 10 ** n if i = -1
      ) | p               //     yield p
    ] = p                 //   set o[p] = p
  )                       // end of map()

2 단계 : 출력 형식

[...p].map((d, i) =>      // for each digit d at position i in the last prime:
  i ?                     //   if this is not the first digit:
    i < n ?               //     if this is not the last digit:
      d.padEnd(n)         //       append d, followed by n - 1 spaces
      + b[i]              //       append the corresponding digit in the 2nd prime
    :                     //     else (last digit):
      c                   //       append the 3rd prime
  :                       //   else (first digit):
    a                     //     append the first prime
).join`\n`                // end of map(); join with carriage returns

2

젤리 , 89 82 바이트

1ịÆn⁺f®$¿
’⁵*;Æn$©µDṪṪ×ḢÇ©;@©µ;Ç⁺;0ị®¤%⁵n/Ɗ¿$$©;Ç⁺%⁵’$¿$$µŒœṪDZUḊṖj€⁶x³¤ḊḊ¤;@Ḣ;2ị$

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

확실히 골퍼 일 수는 있지만 많은 수의 경우 효율적으로 작동합니다.



1

자바 스크립트, 484 바이트

i=a=>a?(l=a=>a[(L=a=>a.length-1)(a)])(a)==9?i(r(a))+0:(r=a=>a.substr(0,L(a)))(a)+(+l(a)+1)%10:"1";s=(a,b)=>b?a==b?"":s(l(a)<l(b)?s(r(a),1):r(a),r(b))+Math.abs(l(a)-l(b)):a;m=(a,b)=>!a||!((c=L(a)-L(b))<0||!c&&a<b)&&m(s(a,b),b);p=(a,b="2")=>a/2<b||!(m(a,b)||!p(a,i(b)));a=>{for(M=1+(R=a=>"0".repeat(b))(z=a-1);!p(M=i(M)););for(N=M[z]+R(z);!p(N=i(N)););for(O=1+R(x=a-2);!p(O+n[z]);O=i(O));for(P=R(x);!p(m[0]+P+O[0]);P=i(P));for(S="\n",j=0;j<x;)S+=P[i]+R(x)+N[++i]+"\n";return M+S+O+N[z]}

이름이없는 마지막 함수는 ASCII 아트를 반환합니다.

원본 코드

function inc(a){
  if (!a) return "1";
  if (a[a.length-1]=="9") return inc(a.substr(0,a.length-1))+"0";
  return a.substr(0,a.length-1)+(+a[a.length-1]+1)%10;
}
function sub(a,b){
  if (!b) return a;
  if (a==b) return "";
  var v=a.substr(0,a.length-1);
  if (a[a.length-1]<b[b.length-1]) v=sub(v,1);
  return sub(v,b.substr(0,b.length-1))+Math.abs(a[a.length-1]-b[b.length-1])
}
function multof(a,b){
  if (!a) return true;
  if (a.length<b.length||a.length==b.length&&a<b) return false;
  return multof(sub(a,b),b);
}
function isprime(a){
  for (var i="2";a/2>i;i=inc(i)){
    if (multof(a,i)) return false;
  }
  return true;
}
function square(a){
  for (var m="1"+"0".repeat(a-1);!isprime(m);m=inc(m)){}
  for (var n=m[a-1]+"0".repeat(a-1);!isprime(n);n=inc(n)){}
  for (var o="1"+"0".repeat(a-2);!isprime(o+n[a-1]);o=inc(o)){}
  for (var p="0".repeat(a-2);!isprime(m[0]+p+o[0]);p=inc(p)){}
  var s="";
  for (var i=0;i<a-2;i++) s+=p[i]+"0".repeat(a-2)+n[i+1]+"\n";
  return m+"\n"+s+o+n[a-1];
}

최저 및 평균 시간 복잡도 : Ω (100 N N) 크 누스의 큰 오메가 표기법 (N N의 자리 숫자, 10 빼는 단계 N 가분성 체크 당 뺄셈을, 10 N 수행 주요 검사에 대한 가분성 확인하고, Ω (1) 주요 점검 ).

최악의 시간 복잡도 : Ω (1000 N N) 크 누스의 큰 오메가 표기법 (N N의 자리 숫자, 10 빼는 단계 N 가분성 검사, 10 당 뺄셈을 n 개의 주요 검사, 10의 가분성 확인 N 수행 프라임 확인).

나는 n=10010203 계산을 생각합니다.

사이드 노트 : UglifyJS 3을 사용하여 구문의 유효성을 검사했으며, 47.13 % 더 많은 비용을 절약하고 282 바이트를 얻었습니다. 그러나, 속이는 느낌이 들기 때문에 점수를 내지 않기로 결정했습니다.

i=(s=>s?9==(l=(l=>l[(L=(l=>l.length-1))(l)]))(s)?i(r(s))+0:(r=(l=>l.substr(0,L(l))))(s)+(+l(s)+1)%10:"1"),s=((L,i)=>i?L==i?"":s(l(L)<l(i)?s(r(L),1):r(L),r(i))+Math.abs(l(L)-l(i)):L),m=((l,r)=>!l||!((c=L(l)-L(r))<0||!c&&l<r)&&m(s(l,r),r)),p=((l,s="2")=>l/2<s||!(m(l,s)||!p(l,i(s))));

마지막 기능은 사용되지 않았기 때문에 방금 삭제했습니다. 할당되고 삭제되지 않으면 실제로 추가 된 추가 코드를 포함하여 악화되었습니다.


3
불완전 해 보입니까? 그리고 골프하지?
connectyourcharger가

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