Buat beberapa Kuadrat Utama!

17

Apa itu Prime Square?

Kuadrat Utama adalah kuadrat di mana keempat ujungnya adalah bilangan prima yang berbeda.
Tapi yang mana?
Dan bagaimana kita membangunnya?

Berikut adalah contoh dari Prime Square 4x4

1009  
0  0     
3  0   
1021    

Pertama kita mulai dari sudut kiri atas. Kami bekerja searah jarum jam .
Kami memilih bilangan prima terkecil yang memiliki 4angka 1009 .

Maka kita membutuhkan bilangan prima terkecil yang memiliki 4digit, yang dimulai dengan a 9. Ini adalah 9001

Bilangan prima ketiga (4 digit) harus memiliki 1digit terakhir (karena 9001 diakhiri dengan 1)
dan juga menjadi prime 4 digit terkecil dengan properti ini yang belum pernah digunakan sebelumnya sebagai edge .
Bilangan prima ini adalah 1021

Bilangan prima keempat harus memiliki 4digit, mulai dengan 1(karena 1009 dimulai dengan a 1) dan diakhiri dengan 1(karena 1021 dimulai dengan a 1)
Bilangan prima 4 digit terkecil dengan properti ini yang belum pernah digunakan sebelumnya sebagai edge adalah 1031

Tugas Anda

Anda akan diberi bilangan bulat ndari 3 to 100
Angka ini akan menjadi dimensi n x nkotak.
Maka Anda harus menampilkan kotak ini persis dalam bentuk kasus uji berikut

Uji Kasus

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
  • Input dan output dapat diberikan dengan metode apa pun yang mudah .
  • Anda dapat mencetaknya ke STDOUT atau mengembalikannya sebagai hasil fungsi.
  • Program lengkap atau fungsi dapat diterima.
  • Berapapun jumlah ruang kosong asing dapat diterima, asalkan angkanya sesuai
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.

EDIT
Ini mungkin untuk semua n
Berikut adalah bilangan prima untukn=100

1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000289        
9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091            
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000711             
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002191     



Dan bagi Anda yang Anda tidak berpikir ini mungkin di sini SEMUA kasus uji

J42161217
sumber
Jika n dapat mencapai 100, mungkin lebih baik untuk memiliki beberapa test case yang lebih besar daripada n = 10.
gastropner
4
Apakah bisa dibuktikan bahwa ini mungkin untuk semua n: P? Bukan masalah dengan tantangan, hanya penasaran.
Magic Gurita Guci
2
@MagicOctopusUrn Sudah pasti tidak mungkin untuk semua n: untuk n= 1, kami tidak dapat memenuhi batasan bahwa keempat tepi adalah bilangan prima yang berbeda, sedangkan untuk n= 2, kami dipaksa untuk memilih 11,13,23, di mana titik tepi akhir adalah 12 yang merupakan komposit. Saya tidak punya bukti bahwa itu mungkin untuk semua n> 2, tetapi akan terkejut untuk mengetahui sebaliknya: secara informal, semakin banyak angka, semakin banyak "ruang gerak" ada untuk memenuhi kendala.
Daniel Wagner
halk+1halkk463n4
2
@MagicOctopusUrn Teorema bilangan prima untuk perkembangan aritmatika mengatakan sesuatu yang cukup kuat tentang kepadatan bilangan prima yang diakhiri dengan 1, 3, 7, dan 9 (dalam notasi di sana, ambil n = 10, a = 1/3/7/9); untuk cukup besar nsetidaknya ada dua bilangan prima panjang ndimulai dengan 1 dan berakhir dengan masing-masing digit (maka kita dapat memilih tepi bawah) dan setidaknya ada tiga bilangan prima dimulai dengan 1 dan berakhir dengan 1 (maka kita dapat memilih tepi kiri).
Daniel Wagner

Jawaban:

4

05AB1E , 64 63 56 53 48 46 byte

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

-1 byte terima kasih kepada @ Mr.Xcoder
-5 byte terima kasih kepada @Grimy .

n>4n>7

Penjelasan:

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

Lihat ini 05AB1E ujung tambang (bagian Cara kompres bilangan bulat besar? ) Untuk memahami mengapa Ž9¦adalah 2460. Dan lihat tip 05AB1E milik saya ini untuk memahami bagaimana kuadrat di-output dengan Λkanvas bawaan.

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

Kevin Cruijssen
sumber
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
@ Terima kasih kotor! Golf yang sangat bagus. Saya dapat menyimpan 2 byte lebih banyak berdasarkan versi 48-byte Anda dengan mengubah ÐθsXÅ?‚sXÅ¿ªke θyXÅ?yXÅ¿). Tidak begitu yakin mengapa )bekerja dalam lingkup loop, karena saya akan berharap untuk membungkus daftar utama juga ke dalam daftar di iterasi pertama. Tetapi bahkan tanpa itu, penggunaan yybukannya Ðssmasih menghemat 1 byte. :)
Kevin Cruijssen
4

05AB1E , 35 33 32 31 byte

-1 byte terima kasih kepada Kevin Cruijssen

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

Cobalah online!

Penjelasan:

°                 # 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
sumber
Ini sebagian didasarkan pada jawaban Kevin , tetapi pada titik ini cukup berbeda sehingga saya merasa pantas menerima jawabannya sendiri daripada komentar.
Grimmy
1
Saya baru sekarang melihat jawaban ini. Sangat bagus! Terlepas dari metode umum (dan karena itu bagian pertama dan terakhir), menentukan empat bilangan prima dan membangun string dilakukan secara berbeda sehingga saya dapat memahami jawaban yang terpisah. +1 dari saya. Btw, Anda dapat menyimpan byte menghapus Θat . Hanya 1kebenaran di 05AB1E, jadi if Ndan if N == 1sama.
Kevin Cruijssen
1
@KevinCruijssen Terima kasih! Tentu saja saya tahu itu, tetapi saya lupa menggunakannya. Dalam retrospeksi, Θiadalah setara 05AB1E dari if (cond == true)...
Grimmy
Ya itu benar. :) Θmasih dapat berguna jika Anda ingin mengkonversi segala sesuatu kecuali 1untuk 0. Tetapi untuk if-statement i, itu tidak benar-benar diperlukan seperti kodesemu Anda == true.
Kevin Cruijssen
2

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

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

Cobalah online!

Bagaimana?

Langkah # 1: menghitung 4 bilangan prima

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

Langkah # 2: memformat output

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

Jelly , 89 82 byte

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

Cobalah online!

Jelas bisa menjadi pemain golf, tetapi bekerja secara efisien untuk jumlah besar.

Nick Kennedy
sumber
2

Jelly , 59 byte

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

Cobalah online!

Jawaban Jelly lebih pendek tapi jauh lebih efisien.

Nick Kennedy
sumber
1

JavaScript, 484 byte

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

Fungsi tanpa nama terakhir mengembalikan seni ASCII.

Kode asli

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

Kompleksitas waktu terbaik dan rata-rata: Ω (100 n n) dalam notasi omega besar Knuth (n langkah untuk mengurangkan angka n digit, 10 n substraksi per pemeriksaan pembagian, 10 n pemeriksaan keterbagian untuk cek utama, dan Ω (1) pemeriksaan perdana selesai ).

Kompleksitas waktu terburuk: Ω (1000 n n) dalam notasi omega besar Knuth (n langkah untuk mengurangkan angka n digit, 10 n substraksi per pemeriksaan pembagian, 10 n pemeriksaan keterbagian untuk cek prima, dan 10 n pemeriksaan perdana selesai).

Saya kira n=100membutuhkan sekitar 10 203 perhitungan.

Sidenote: Saya memvalidasi sintaks menggunakan UglifyJS 3, dan itu bermain golf dengan cara yang lebih baik daripada saya, menghemat 47,13% lebih banyak dan menghasilkan 282 byte. Namun, saya memutuskan untuk tidak membuat skor saya karena saya merasa itu curang.

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

Itu hanya menghapus fungsi terakhir karena tidak pernah digunakan. Ini benar-benar menjadi lebih buruk jika ditugaskan dan tidak dihapus, termasuk kode tambahan yang saya tambahkan.

Naruyoko
sumber
3
Ini sepertinya tidak lengkap? Dan tidak main golf?
connectyourcharger
Iya. Lengkap / golf.
Naruyoko