Faça alguns quadrados principais!

17

O que é uma praça principal?

Um quadrado principal é um quadrado em que todas as quatro arestas são números primos diferentes.
Mas quais?
E como os construímos?

Aqui está um exemplo de uma praça quadrada 4x4

1009  
0  0     
3  0   
1021    

Primeiro, partimos do canto superior esquerdo. Estamos trabalhando no sentido horário .
Escolhemos o menor número primo com 4dígitos que é 1009 .

Então precisamos do menor número primo com 4dígitos, que começa com a 9. Isso é 9001

O terceiro número principal (de 4 dígitos) deve ter 1como último dígito (porque 9001 termina com 1)
e também o menor número primo de 4 dígitos com essa propriedade que nunca foi usada antes como aresta .
Este número primo é 1021

O quarto número primo deve ter 4dígitos, comece com a 1(porque 1009 começa com a 1) e termine com a 1(porque 1021 começa com a 1)
O menor número primo de 4 dígitos com essa propriedade que nunca foi usado antes como aresta é 1031

Sua tarefa

Você receberá um número inteiro nde 3 to 100
Este número será as dimensões do n x nquadrado.
Em seguida, você deve enviar esse quadrado exatamente na forma dos seguintes casos de teste

Casos de teste

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
  • A entrada e a saída podem ser fornecidas por qualquer método conveniente .
  • Você pode imprimi-lo em STDOUT ou retorná-lo como resultado de uma função.
  • Um programa completo ou uma função são aceitáveis.
  • Qualquer quantidade de espaço em branco estranho é aceitável, desde que os números sejam alinhados adequadamente
  • As brechas padrão são proibidas.
  • Isso é portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.

EDIT
Isso é possível para todos n
Aqui estão os números primos paran=100

1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000289        
9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091            
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000711             
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002191     



E para aqueles que não acham que isso é possível, aqui estão TODOS os casos de teste

J42161217
fonte
Se n puder subir até 100, pode ser bom ter alguns casos de teste maiores que n = 10.
gastropner
4
É provável que isso seja possível para todos n: P? Não é um problema com o desafio, apenas curioso.
Magic Octopus Urn
2
@MagicOctopusUrn Definitivamente não é possível para todos n: para n= 1, não podemos satisfazer a restrição de que as quatro arestas são primos diferentes, enquanto para n= 2, somos forçados a escolher 11,13,23, momento em que a aresta final é 12 que é composto. Não tenho provas de que seja possível para todos n> 2, mas ficaria chocado ao saber o contrário: informalmente, quanto mais dígitos houver, mais espaço de manobra haverá para satisfazer as restrições.
Daniel Wagner
pk+1pkk463n4
2
@MagicOctopusUrn O teorema do número primo para progressões aritméticas diz algo bastante forte sobre a densidade de números primos terminando em 1, 3, 7 e 9 (na notação ali, pegue n = 10, a = 1/3 / 7/9 ); para suficientemente grande, nexistem pelo menos dois primos de comprimento ncomeçando com 1 e terminando com cada um desses dígitos (portanto, podemos escolher uma aresta inferior) e há pelo menos três primos começando com 1 e terminando com 1 (portanto, podemos escolher um borda esquerda).
Daniel Wagner

Respostas:

4

05AB1E , 64 63 56 53 48 46 bytes

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

-1 byte graças a @ Mr.Xcoder
-5 bytes graças a @Grimy .

n>4n>7

Explicação:

°                 # 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)

Veja este 05AB1E ponta do meu (seção Como comprimir grandes inteiros? ) Para entender por que Ž9¦é 2460. E veja esta minha dica 05AB1E para entender como o quadrado é gerado com o ΛCanvas embutido.

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

Kevin Cruijssen
fonte
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Λ
Grimmy
@ Grimy Thanks! Golf muito bons. Consegui salvar mais 2 bytes com base na sua versão de 48 bytes, alterando ÐθsXÅ?‚sXÅ¿ªpara θyXÅ?yXÅ¿). No )entanto, não sei exatamente por que funciona no escopo do loop, já que eu esperava que ele envolvesse a lista principal também em sua lista na primeira iteração. Mas mesmo sem isso, o uso de em yyvez de Ðssainda economiza 1 byte. :)
Kevin Cruijssen
4

05AB1E , 35 33 32 31 bytes

-1 byte graças a Kevin Cruijssen

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

Experimente online!

Explicação:

°                 # 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
Grimmy
fonte
Isso é parcialmente baseado na resposta de Kevin , mas, neste momento, é diferente o suficiente para eu achar que merecia sua própria resposta, em vez de um comentário.
Grimmy
1
Agora só vejo essa resposta. Muito agradável! Além do método geral (e, portanto, da primeira e da última parte), a determinação dos quatro números primos e a construção da string são feitas de maneira tão diferente que eu posso entender a resposta separada. +1 de mim. Aliás, você pode salvar um byte removendo o Θat . Somente 1é verdade em 05AB1E, portanto, if Ne if N == 1são os mesmos.
Kevin Cruijssen
1
@KevinCruijssen Thanks! Claro que sabia disso, mas esqueci de usá-lo. Em retrospecto, Θié o equivalente 05AB1E de if (cond == true)...
Grimmy
Sim, está certo. :) Θainda pode ser útil se você deseja converter tudo, exceto 1para 0. Mas para a declaração if i, não é realmente necessário, assim como o seu pseudocódigo == true.
Kevin Cruijssen
2

JavaScript (ES8),  205 ...  18517717 bytes

n>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`
`)

Experimente online!

Quão?

Etapa 1: computando os 4 números primos

[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()

Etapa 2: formatar a saída

[...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
Arnauld
fonte
2

Geléia , 89 82 bytes

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

Experimente online!

Definitivamente poderia ser mais golfista, mas funciona de maneira eficiente para grandes números.

Nick Kennedy
fonte
2

Gelatina , 59 bytes

DṪṪ=DZḢṪṪ3ƭƊ}Tịḟ@Ḣ
’;⁸⁵*æR/µḢ;ç¥⁺⁺µŒœṪDZUḊṖj€⁶x³¤ḊḊ¤;@Ḣ;2ị$

Experimente online!

Resposta Jelly mais curta, mas muito menos eficiente.

Nick Kennedy
fonte
1

JavaScript, 484 bytes

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]}

A última função sem nome retorna a arte ASCII.

Código original

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];
}

Melhor e média complexidade de tempo: Ω (100 n n) na notação omega grande de Knuth (n etapas para subtrair n números de dígitos, 10 n subtrações por verificação de divisibilidade, 10 n verificação de divisibilidade para verificação principal e Ω (1) verificações principais realizadas )

Pior complexidade do tempo: Ω (1000 n n) na notação omega grande de Knuth (n etapas para subtrair n números de dígitos, 10 n subtrações por verificação de divisibilidade, 10 n verificação de divisibilidade para verificação principal e 10 n verificações principais realizadas).

Eu suspeito que n=100leva cerca de 10 203 cálculos.

Nota: Validei a sintaxe usando o UglifyJS 3, e foi muito melhor do que eu, economizando 47,13% a mais e ganhando 282 bytes. No entanto, decidi não fazer dessa a minha pontuação, pois sinto que está trapaceando.

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))));

Ele apenas excluiu a última função, pois eles nunca são usados. Na verdade, ficou pior se foi atribuído e não excluído, incluindo o código adicional que adicionei.

Naruyoko
fonte
3
Isso parece incompleto? E não jogou golfe?
connectyourcharger
Sim. Concluído / golfe.
Naruyoko