Bilden Sie einige Hauptquadrate!

17

Was ist ein Prime Square?

Ein Prime Square ist ein Quadrat, bei dem alle vier Kanten unterschiedliche Primzahlen sind.
Aber welche?
Und wie bauen wir sie?

Hier ist ein Beispiel eines 4x4 Prime Square

1009  
0  0     
3  0   
1021    

Zuerst starten wir von der oberen linken Ecke. Wir arbeiten im Uhrzeigersinn .
Wir wählen die kleinste Primzahl mit 4Ziffern, die 1009 ist .

Dann brauchen wir die kleinste Primzahl mit 4Ziffern, die mit a beginnt 9. Das ist 9001

Die dritte (4- 1stellige ) Primzahl muss die letzte Ziffer sein (weil 9001 mit endet 1)
und auch die kleinste 4-stellige Primzahl mit dieser Eigenschaft, die zuvor noch nicht als Kante verwendet wurde .
Diese Primzahl ist 1021

Die vierte Primzahl muss 4Ziffern haben, die mit a beginnen 1(da 1009 mit a beginnt 1) und mit a enden1 (weil 1021 mit a beginnt 1).
Die kleinste vierstellige Primzahl mit dieser Eigenschaft, die zuvor nicht als Kante verwendet wurde, ist 1031

Deine Aufgabe

Sie erhalten eine Ganzzahl nvon 3 to 100
Diese Zahl entspricht den Abmessungen des n x nQuadrats.
Dann müssen Sie dieses Quadrat genau in Form der folgenden Testfälle ausgeben

Testfälle

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
  • Die Ein- und Ausgabe kann auf jede bequeme Weise erfolgen .
  • Sie können es an STDOUT drucken oder als Funktionsergebnis zurückgeben.
  • Es ist entweder ein vollständiges Programm oder eine Funktion zulässig.
  • Beliebig viel fremdes Leerzeichen ist zulässig, sofern die Zahlen richtig ausgerichtet sind
  • Standardlücken sind verboten.
  • Dies ist daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.

BEARBEITEN
Dies ist für alle möglich n
Hier sind die Primzahlen fürn=100

1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000289        
9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091            
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000711             
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002191     



Und für diejenigen unter Ihnen, die dies nicht für möglich halten , sind ALLE Testfälle aufgeführt

J42161217
quelle
Wenn n bis 100 gehen kann, könnte es gut sein , einige größere Testfälle zu haben , als n = 10
gastropner
4
Ist es nachweisbar, dass dies für alle möglich ist n: P? Kein Problem mit der Herausforderung, nur neugierig.
Magic Octopus Urn
2
@MagicOctopusUrn Es ist definitiv nicht für alle möglich n: Für n= 1 können wir die Bedingung nicht erfüllen, dass die vier Kanten unterschiedliche Primzahlen sind, während nwir für = 2 gezwungen sind, 11,13,23 zu wählen, an welchem ​​Punkt sich die letzte Kante befindet 12, die zusammengesetzt ist. Ich habe keinen Beweis, dass es für alle n> 2 möglich ist, wäre aber schockiert, wenn ich etwas anderes erfahren würde: Informell gilt: Je mehr Ziffern es gibt, desto mehr Spielraum gibt es, um die Einschränkungen zu erfüllen.
Daniel Wagner
pk+1pkk463n4
2
@MagicOctopusUrn Der Primzahlsatz für arithmetische Progressionen sagt etwas ziemlich Starkes über die Dichte der Primzahlen aus, die mit 1, 3, 7 und 9 enden (in der dortigen Notation n = 10, a = 1/3/7/9 ); für ausreichend große ngibt es mindestens zwei Primzahlen, ndie mit 1 beginnen und mit jeder dieser Ziffern enden (daher können wir eine Unterkante auswählen), und es gibt mindestens drei Primzahlen, die mit 1 beginnen und mit 1 enden (daher können wir a auswählen) linke Ecke).
Daniel Wagner

Antworten:

4

05AB1E , 64 63 56 53 48 46 Bytes

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

-1 Byte dank @ Mr.Xcoder
-5 Byte dank @Grimy .

n>4n>7 statt.)

Erläuterung:

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

Sehen Sie sich meinen Tipp 05AB1E (Abschnitt Wie komprimiere ich große ganze Zahlen? ) An, um zu verstehen, warum dies so Ž9¦ist2460 . Und sehen Sie diese 05AB1E Spitze von mir zu verstehen , wie das Quadrat ausgegeben mit dem Λeingebauten Leinwand.

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

Kevin Cruijssen
quelle
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 Dank! Sehr schöne Golfplätze. Ich habe in der Lage 2 weitere Bytes , indem basierend auf dem 48-Bit - Version speichern ÐθsXÅ?‚sXÅ¿ªzu θyXÅ?yXÅ¿). )Ich bin mir nicht ganz sicher, warum das im Rahmen der Schleife funktioniert, da ich erwartet hätte, dass es die Primliste auch in der ersten Iteration in ihre Liste einwickelt. Aber auch ohne dass der Einsatz yystatt Ðssspart noch 1 Byte. :)
Kevin Cruijssen
4

05AB1E , 35 33 32 31 Bytes

-1 Byte dank Kevin Cruijssen

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

Probieren Sie es online!

Erläuterung:

°                 # 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
Grimmig
quelle
Dies basiert zum Teil auf Kevins Antwort , aber zu diesem Zeitpunkt ist es anders genug, dass ich der Meinung war, dass es eine eigene Antwort statt eines Kommentars verdient.
Grimmy
1
Ich sehe erst jetzt diese Antwort. Sehr schön! Abgesehen von der allgemeinen Methode (und damit dem ersten und dem letzten Teil) werden die vier Primzahlen bestimmt und die Zeichenfolge so unterschiedlich aufgebaut, dass ich die getrennte Antwort verstehen kann. +1 von mir. Übrigens können Sie ein Byte speichern, indem Sie das Θat entfernen . Nur 1ist in 05AB1E wahr, so if Nund if N == 1sind die gleichen.
Kevin Cruijssen
1
@ KevinCruijssen Danke! Natürlich wusste ich das, aber ich vergaß es zu benutzen. Rückblickend Θiist das 05AB1E-Äquivalent von if (cond == true)...
Grimmy
Ja, das stimmt. :) Θkann immer noch nützlich sein, wenn Sie alles außer 1in konvertieren möchten 0. Aber für die if-Anweisung iist es nicht unbedingt notwendig, genau wie für Ihren Pseudocode mit == true.
Kevin Cruijssen
2

JavaScript (ES8),  205 ... 185 177  173 Bytes

Timeout bei TIO für n>8 wegen des sehr ineffizienten Primalitätstests.

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

Probieren Sie es online!

Wie?

Schritt 1: Berechnen der 4 Primzahlen

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

Schritt 2: Formatieren der Ausgabe

[...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
quelle
2

Jelly , 89 82 Bytes

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

Probieren Sie es online!

Könnte definitiv Golfspieler sein, arbeitet aber effizient für große Zahlen.

Nick Kennedy
quelle
2

Jelly , 59 Bytes

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

Probieren Sie es online!

Kürzere, aber weniger effiziente Gelee-Antwort.

Nick Kennedy
quelle
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]}

Die letzte unbenannte Funktion gibt die ASCII-Grafik zurück.

Originalcode

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

Beste und durchschnittliche Zeitkomplexität: Ω (100 n n) in Knuths Big-Omega-Notation (n Schritte zum Subtrahieren von n Ziffern, 10 n Subtraktionen pro Teilbarkeitsprüfung, 10 n Teilbarkeitsprüfung für die und Ω (1) Primitätsprüfungen durchgeführt ).

Schlechteste Zeitkomplexität: Ω (1000 n n) in Knuths Big-Omega-Notation (n Schritte zum Subtrahieren von n Ziffern, 10) n Subtraktionen pro Teilbarkeitsüberprüfung, 10 n Teilbarkeitsüberprüfung für Primzahlüberprüfung und 10 n prime Kontrollen getan).

Ich vermute n=100 nimmt rund 10 203 Berechnungen.

Nebenbei bemerkt: Ich habe die Syntax mit UglifyJS 3 validiert, und sie hat sich deutlich besser bewährt als ich. Das spart 47,13% mehr und bringt 282 Bytes ein. Ich habe mich jedoch entschieden, dieses Ergebnis nicht zu erzielen, da ich das Gefühl habe, dass es betrügt.

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

Es wurde nur die letzte Funktion gelöscht, da sie nie verwendet werden. Es wurde tatsächlich schlimmer, wenn es zugewiesen und nicht gelöscht wurde, einschließlich des zusätzlichen Codes, den ich hinzugefügt habe.

Naruyoko
quelle
3
Das scheint unvollständig? Und nicht golfen?
connectyourcharger
Ja. Abgeschlossen / Golf gespielt.
Naruyoko