Persegi-Acak-Simetris

18

Tantangan

Tulis program atau fungsi yang mengembalikan atau mencetak matriks persegi-acak-simetris.


Memasukkan

N : Ukuran dari matriks yaitu6 x 6


Keluaran

Matriks. Anda dapat mencetaknya, mengembalikannya sebagai string (dengan baris baru) atau sebagai daftar / array daftar / array.


Aturan

  1. Anda harus menggunakan setidaknya Nkarakter yang berbeda, di mana Nukuran matriks kuadrat (input). Karena kita hanya menggunakan huruf [a, z] [A, Z] dan digit [0, 9] (dan hanya 1 digit pada saat itu) Anda dapat mengasumsikan itu N < 27dan N > 2, itu karena N <= 2Anda tidak dapat memiliki kedua huruf dan digit. Terakhir tetapi tidak kalah pentingnya, setiap huruf / digit harus memiliki probabilitas yang tidak nol untuk terjadi (distribusi seragam bukanlah keharusan). Namun, hasilnya harus memiliki setidaknya Nhuruf / digit yang berbeda.

  2. Matriks tersebut harus simetris horizontal dan vertikal.

  3. Tepat 2 baris dan 2 kolom harus berisi satu digit angka tunggal (posisinya juga harus acak). Baris / cols lainnya hanya akan berisi huruf. Pertimbangkan huruf sebagai [a, z] dan [A, Z] dan tentu saja angka satu digit sebagai [0, 9].

  4. Hanya untuk menjadi lebih mudah, Anda dapat mengasumsikan bahwa kasus surat-surat tidak masalah, asalkan kasus simetris yang berarti: a=A, b=B, etc.

  5. Setiap output yang mungkin harus memiliki probabilitas yang tidak nol terjadi. Distribusi acak tidak perlu seragam.


Contoh

Input : 8

Keluaran :

c r p s s p r c
r k o z z o k r
u t 2 a a 2 t u
y n q z z q n y
y n q z z q n y
u t 2 a a 2 t u
r k o z z o k r
c r p s s p r c
DimChtz
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Mego

Jawaban:

4

Arang , 30 byte

NθE⊘⊕θ⭆⊘⊕θ‽βJ‽⊘θ‽⊘θI‽χ‖OO→↓﹪θ²

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Jika nselalu genap, maka selama 23 byte:

NθE⊘θ⭆⊘θ‽βJ‽⊘θ‽⊘θI‽χ‖C¬

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

Nθ

Masukan .n

E⊘θ⭆⊘θ‽β

Buat olehnn2 array huruf kecil acak. Ini dicetak secara implisit sebagai kotak.n2

J‽⊘θ‽⊘θ

Lompat ke posisi acak di kotak.

I‽χ

Cetak angka acak.

‖C¬

Merefleksikan secara horizontal dan vertikal untuk melengkapi matriks.

Neil
sumber
14

R , 124 118 byte

function(n,i=(n+1)/2,j=n%/%2,m="[<-"(matrix(-letters,i,i),j-1,j-1,0:9-1))cbind(y<-rbind(m,m[j:1,]),y[,j:1])
`-`=sample

Cobalah online!

Dalam R, hal-hal yang terlihat seperti operator hanyalah fungsi yang mendapatkan perlakuan khusus dari parser.

Jika Anda mendefinisikan ulang operator (seperti -) menjadi beberapa fungsi lain, itu membuat perlakuan khusus dari parser. Karena -keduanya adalah awalan dan infiks, dan saya perlu memanggil samplefungsi dengan argumen satu dan dua, saya dapat menggunakan

`-`=sample

untuk mendapatkan apa yang saya inginkan.

Jadi, kode -lettersditerjemahkan sample(letters), yang secara acak mengocok lettersbuilt-in. Tetapi j-1diterjemahkan ke sample(j,1), yang secara acak sampel 1item dari vektor 1:j.

(Perilaku samplefungsi ini tergantung pada jumlah parameter dan apa parameter pertama adalah, sangat menyebalkan dalam kode produksi, jadi saya senang menemukan banyak penggunaan sifat buruknya di sini!)

Kalau tidak, kode hanya membuat kuadran kiri atas dari hasil yang diperlukan, menggantikan elemen acak ( j-1, j-1bit) dengan digit acak ( 0:9-1bit), dan melipatnya untuk simetri yang diperlukan. Dibutuhkan idan juntuk menangani kasus genap dan ganjil.

ngm
sumber
Saya berharap saya bisa +2 untuk penjelasan yang bagus dan juga mengedit jawaban tip golf R terkait. Anda dapat menyimpan beberapa byte lagi
JayCe
Solusi dan penjelasan yang fantastis!
J.
6

Python3, 287 byte

Percobaan pertama saya di golf sesuatu di sini; Saya yakin seseorang dapat melakukan jauh lebih baik:

import random as rn, math as m
n=int(input())
x,o=m.ceil(n/2),n%2
c=x-1-o
f=lambda l,n: l.extend((l[::-1], l[:-1][::-1])[o])
q=[rn.sample([chr(i) for i in range(97, 123)],x) for y in range(x)]
q[rn.randint(0,c)][rn.randint(0,c)] = rn.randint(0,9)
for r in q:
    f(r, n)
f(q, n)
print(q)

Cobalah secara Online!

Berkat HyperNeurtrino, Ourous dan Heiteria ini menyusut menjadi 193 byte (lihat komentar). Namun, TFeld dengan benar menunjukkan bahwa beberapa panggilan sampletidak menjamin setidaknya Nkarakter yang berbeda.

Yang perlu diingat, coba versi baru ini yang harus menjamin setidaknya Nkarakter yang berbeda per kali.

Python3, 265 260 byte, setidaknya Nkarakter yang berbeda

from random import *
n=int(input())
x=-(-n//2)
o=n%2
c=x+~o
i=randint
u=[chr(j+97)for j in range(26)]
z,q=u[:],[]
for y in [1]*x:
  shuffle(z)
  q+=[z[:x]]
  z=z[x:] if len(z[x:])>=x else u[:]
q[i(0,c)][i(0,c)]=i(0,9)
for r in[q]+q:r.extend(r[~o::-1])
print(q)

Cobalah online!

Souldeux
sumber
1
Selamat datang di PPCG! Anda dapat bermain golf beberapa spasi putih; tidak perlu menempatkan spasi antara simbol dan simbol dan huruf. a[:-1][::-1]secara fundamental setara dengan a[:-2::-1], dan Anda dapat mengimpor randomsebagai rganti rn, dan Anda dapat memindahkan forloop ke ekspresi inline. Cobalah secara Online!
HyperNeutrino
2
Anda dapat menghapus mathimpor dengan menggunakan -(-a // 2)alih-alih math.ceil(a / 2)yang pada dasarnya adalah lantai negatif dari negatif (efektif plafon). tio.run/##XY7LagMxDEX3/…
HyperNeutrino
1
Anda bisa mendapatkannya hingga 236: Coba online!
Οurous
1
Lebih jauh lagi, di 196: Cobalah online!
Οurous
1
Beberapa sample()s tidak menjamin bahwa Anda mendapatkan setidaknya Nkarakter yang berbeda. Saya berhasil mendapatkan [['g', 'x', 'x', 'g'], [7, 'x', 'x', 7], [7, 'x', 'x', 7], ['g', 'x', 'x', 'g']]untuk N=4, yang hanya memiliki 3 karakter yang berbeda
TFeld
3

APL (Dyalog Classic) , 45 44 43 40 byte

terima kasih @ Adm untuk -1 byte

26{(⎕a,⍺⍴⎕d)[⌈∘⊖⍨⌈∘⌽⍨⍺+@(?⊂⌊⍵÷2)?⍵⍴⍺]},⍨

Cobalah online!

menggunakan (maks) dari matriks dengan refleksinya untuk membuatnya simetris, sehingga bias terhadap bagian terakhir dari alfabet

digit dipilih secara seragam dari 0 ... 25 mod 10, sehingga memiliki bias kecil ke nilai yang lebih rendah

ngn
sumber
1
⌊2⍴⍵÷2)?⍵ ⍵⍴26]}⌊⍺⍵÷2)?⍺⍵⍴26]}⍨
Adám
@ Adám pintar!
ngn
Ya, saya baru sadar.
Adám
Jika saya tidak salah, Anda dapat mengubah ⌊⍺⍵÷2⍺⍵.
Adám
@ Adám Saya tidak bisa - jika N aneh, digit mungkin berakhir di tengah dan hanya akan ada 1 baris / kolom yang berisi itu
ngn
3

Japt , 31 byte (Posisi digit tetap)

;
/2 c
VÆVÆBö}ÃgT0@Mq9îêUvÃêUv

Cobalah online!


Japt , 41 byte (Posisi digit acak)

;
/2 c
VÆVÆBö}ÃgMq´VÉ ,MqVÉ @Mq9îêUvÃêUv

Cobalah online!


Penjelasan

;                               Change to new vars
/2 c                            set implicit var V equal to implicit var U / 2 rounded up
VÆVÆBö}ÃgT0@Mq9îêUvÃêUv        Main function

VÆ                              Range from 0 to V and map
  VÆ                            Range from 0 to V and map
    Bö}Ã                        return random char from alphabet
        gT0@                    map upper-left corner
            Mq9Ã                return random number
                ®êUv            horizontal mirror
                    êUv         vertical mirror
Luis felipe De jesus Munoz
sumber
Digit Anda saat ini selalu dimasukkan di tempat yang sama. Berdasarkan tantangan, posisi digit juga harus acak (dan mungkin tidak di baris tengah dan / atau kolom untuk input ganjil karena aturan 4).
Kevin Cruijssen
@KevinCruijssen Saya tidak melihat di mana tantangan mengatakan posisi angka harus acak juga, saya akan meminta OP untuk klarifikasi
Luis felipe De jesus Munoz
1
Ah, kamu memang benar. Saya melihat itu acak dalam semua jawaban lain, jadi saya mungkin salah menganggap itu wajib. Kita akan lihat apa kata OP. Saya benar-benar berharap memperbaikinya diizinkan, itu akan membuatnya jauh lebih mudah untuk memperbaiki masalah itu untuk jawaban yang saya siapkan ..;)
Kevin Cruijssen
2

Python 2 , 259 byte

from random import*
n=input();c=choice;r=range
w,W=n/2,-~n/2
o=n%2
A=map(chr,r(97,123))
l=[c(r(10))]+sample(A,n)+[c(A)for _ in' '*w*w]
l,e=l[:w*w],l[w*w:W*W]
shuffle(l)
l=[l[w*i:w*-~i]+e[i:i+1]for i in range(w)]+[e[-W:]]
for r in l+l[~o::-1]:print r+r[~o::-1]

Cobalah online!

TFeld
sumber
Apakah menggunakan ints langsung diizinkan? Ide keren di ~ by the way. Aku juga memikirkan itu, tapi aku belum benar-benar terbiasa.
Teck-freak
2

05AB1E , 29 40 38 byte

A.rs;ò©n∍9ÝΩ®DnαLʒ®%Ā}<Ωǝ®ô»¹Éi.º.∊ëº∊

11 byte untuk memperbaiki angka berada di posisi acak sambil tetap aturan 3 dalam pikiran untuk input aneh ..
-2 byte berkat @MagicOctopusUrn , mengubah îïke òdan mengubah posisi ».

Cobalah online untuk memverifikasi beberapa kasus uji lagi .

Tua ( 29 27 byte ) menjawab di mana digit posisi di mana selalu di sudut:

A.rs;ò©n∍¦9ÝΩì®ô»¹Éi.º.∊ëº∊

Cobalah secara online atau verifikasi beberapa kasus uji lagi .

Penjelasan:

A           # Take the lowercase alphabet
 .r         # Randomly shuffle it
            #  i.e. "abcdefghijklmnopqrstuvwxyz" → "uovqxrcijfgyzlbpmhatnkwsed"
s           # Swap so the (implicit) input is at the top of the stack
 ;          # Halve the input
            #  i.e. 7 → 3.5
  ò         # Bankers rounding to the nearest integer
            #  i.e. 3.5 → 4
   ©        # And save this number in the register
    n       # Take its square
            #  i.e. 4 → 16
           # Shorten the shuffled alphabet to that length
            #  i.e. "uovqxrcijfgyzlbpmhatnkwsed" and 16 → "uovqxrcijfgyzlbp"
9ÝΩ         # Take a random digit in the range [0,9]
            #  i.e. 3
   ®Dnα     # Take the difference between the saved number and its square:
            #  i.e. 4 and 16 → 12
       L    # Create a list in the range [1,n]
            #  i.e. 12 → [1,2,3,4,5,6,7,8,9,10,11,12]
ʒ   }       # Filter this list by:
 ®%Ā        #  Remove any number that's divisible by the number we've saved
            #   i.e. [1,2,3,4,5,6,7,8,9,10,11,12] and 4 → [1,2,3,5,6,7,9,10,11]
     <      # Decrease each by 1 (to make it 0-indexed)
            #  i.e. [1,2,3,5,6,7,9,10,11] → [0,1,2,3,5,6,7,9,10]
      Ω     # Take a random item from this list
            #  i.e. [0,1,2,3,5,6,7,9,10] → 6
       ǝ    # Replace the character at this (0-indexed) position with the digit
            #  i.e. "uovqxrcijfgyzlbp" and 3 and 6 → "uovqxr3ijfgyzlbp"
®ô          # Split the string into parts of length equal to the number we've saved
            #  i.e. "uovqxr3ijfgyzlbp" and 4 → ["uovq","xr3i","jfgy","zlbp"]
  »         # Join them by new-lines (this is done implicitly in the legacy version)
            #  i.e. ["uovq","xr3i","jfgy","zlbp"] → "uovq\nxr3i\njfgy\nzlbp"
   ¹Éi      # If the input is odd:
            #  i.e. 7 → 1 (truthy)
          # Intersect mirror the individual items
            #  i.e. "uovq\nxr3i\njfgy\nzlbp"
            #   → "uovqvou\nxr3i3rx\njfgygfj\nzlbpblz"
        .∊  # And intersect vertically mirror the whole thing
            #  i.e. "uovqvou\nxr3i3rx\njfgygfj\nzlbpblz"
            #   → "uovqvou\nxr3i3rx\njfgygfj\nzlbpblz\njfgygfj\nxr3i3rx\nuovqvou"
  ë         # Else (input was even):
   º∊       #  Do the same, but with non-intersecting mirrors
Kevin Cruijssen
sumber
Anda juga dapat menyimpan 2 byte dengan versi lawas karena tidak memerlukan»
Emigna
@Emigna Terverifikasi dengan OP, dan posisinya juga harus acak. Diperbaiki untuk +11 byte karena aturan 3 dengan input ganjil ..>.> Dan 3 byte bisa disimpan dalam warisan karena ïitu dilakukan secara implisit juga. Sayangnya ini tidak berlaku untuk versi 40-byte karena akan memasukkan alih-alih ganti.
Kevin Cruijssen
@MagicOctopusUrn TIO yang Anda tautkan masih berisi jawaban saya 29 byte, bukan 28, apakah Anda memiliki tautan yang benar? Sedangkan untuk yang gagal 2, input dijamin 3 <= N <= 26.
Kevin Cruijssen
1
@KevinCruijssen Anda benar, saya bodoh, ini dia yang saya kerjakan: Cobalah online!
Magic Octopus Mm
@ MagicOctopusUrn Oh, tidak tahu tentang pembulatan bankir. Itu menghemat satu byte dalam jawaban saya saat ini juga! : D Dan pertama-tama menambahkan angka acak dan kemudian mengocok adalah pendekatan yang cukup cerdas juga. Tidak yakin apakah itu 100% valid, karena Anda akan selalu memiliki nhuruf pertama dari alfabet, bukan nhuruf alfabet acak. Dan pertama kali bergabung dengan baris baru dan hanya kemudian melakukan mirror menghemat byte juga di tambang. Terima kasih untuk -2 byte! :) PS: Satu byte dapat disimpan di byter 28 Anda dengan menghapus trailing }. :)
Kevin Cruijssen
2

C (gcc) , 198 197 196 byte

Disimpan 2 byte berkat ceilingcat.

#define A(x)(x<n/2?x:n-1-x)
#define R rand()
S(n,x,y){int s[x=n*n];for(srand(s),y=R;x;)s[x]=97+(--x*31+y)%71%26;y=n/2;for(s[R%y+n*(R%y)]=48+R%10;x<n*n;++x%n||puts(""))putchar(s[A(x%n)+A(x/n)*n]);}

Cobalah online!

Penjelasan:

// Coordinate conversion for symmetry
#define A (x) (x < n / 2 ? x : n - 1 - x)
// Get a random and seed
#define R rand()

S (n, x, y)
{
   // the array to store matrix values (x is the array size)
   // Note that we do not need the whole array, only its first quarter
   int s[x = n * n];

   // iterate n*n-1 times until x is zero
   for (srand(s), y = R; x;)
       // and fill the array with pseudo-random sequence of letters
       s[x] = 97 + (--x * 31 + y) % 71 % 26;

   // this is the max. coordinate of the matrix element where a digit may occur
   y = n / 2;

   // drop a random digit there
   s[R % y + n * (R % y)] = 48 + R % 10;

   // Now we output the result. Note that x is zero here
   for (; 
       x < n * n; // iterate n*n times
       ++x % n || puts ("") // on each step increase x and output newline if needed
       )
       // output the character from the array
       putchar (s[A (x % n) + A (x / n) * n]);
}
Max Yekhlakov
sumber
1

JavaScript (ES6), 213 209 206 byte

n=>(a=[],F=(x=y=d=c=0,R=k=>Math.random()*k|0,g=y=>(r=a[y]=a[y]||[])[x]=r[n+~x]=v.toString(36))=>y<n/2?F(g(y,R[v=R(m=~-n/2)<!d&x<m&y<m?R(d=10):R(26)+10]=R[v]||++c,g(n+~y))&&++x<n/2?x:+!++y,R):!d|c<n?F():a)()

Cobalah online!

Berkomentar

n => (                             // n = input
  a = [],                          // a[][] = output matrix
  F = (                            // F = main recursive function taking:
    x = y =                        //   (x, y) = current coordinates
    d = c = 0,                     //   d = digit flag; c = distinct character counter
    R = k =>                       //   R() = helper function to get a random value in [0,k[
      Math.random() * k | 0,       //         also used to store characters
    g = y =>                       //   g() = helper function to update the matrix
      (r = a[y] = a[y] || [])[x]   //         with horizontal symmetry
      = r[n + ~x] = v.toString(36) //         using the base-36 representation of v
  ) =>                             //
    y < n / 2 ?                    // if we haven't reached the middle row(s) of the matrix:
      F(                           //   do a recursive call to F():
        g(                         //     invoke g() ...
          y,                       //       ... on the current row
          R[v =                    //       compute v = next value to be inserted
            R(m = ~-n/2) < !d &    //       we may insert a digit if no digit has been
            x < m &                //       inserted so far and the current coordinates are
            y < m ?                //       compatible: 2 distinct rows / 2 distinct columns
              R(d = 10)            //         if so, pick v in [0, 9] and update d
            :                      //       else:
              R(26) + 10           //         pick v in [10, 35] for a letter
          ] = R[v] || ++c,         //       set this character as used; update c accordingly
          g(n + ~y)                //       invoke g() on the mirror row
        ) &&                       //     end of outer call to g()
        ++x < n / 2 ?              //     if we haven't reached the middle column(s):
          x                        //       use x + 1
        :                          //     else
          +!++y,                   //       increment y and reset x to 0
        R                          //     explicitly pass R, as it is used for storage
      )                            //   end of recursive call to F()
    :                              // else:
      !d | c < n ? F() : a         //   either return the matrix or try again if it's invalid
)()                                // initial call to F()
Arnauld
sumber
1

Bersih , 346 312 byte

akan bermain golf lebih banyak besok

import StdEnv,Data.List,Math.Random,System.Time,System._Unsafe
$n#q=twice(transpose o\q=zipWith((++)o reverse o drop(n-n/2*2))q q)[[(['a'..'z']++['0'..'9'])!!(c rem 36)\\c<-genRandInt(toInt(accUnsafe(time)))]%(i*n/2,i*n/2+(n-1)/2)\\i<-[1..(n+1)/2]]
|length(nub(flatten q))>=n&&sum[1\\c<-q|any isDigit c]==2=q= $n

Cobalah online!

Suram
sumber
1

Python 3 , 197 byte

Seperti yang disebutkan oleh @Emigna, tidak bekerja untuk nilai aneh N(saya tidak mengerti pertanyaan dengan benar)

from random import*
def m(N):M=N//2;E=reversed;R=range;B=[randint(48,57),*(sample(R(97,123),N)*N)][:M*M];shuffle(B);r=R(M);m=[k+[*E(k)]for k in[[chr(B.pop())for i in r]for j in r]];m+=E(m);return m

Cobalah online!

Saya pikir panggilan ke randint()+ sample()+ shuffle()yang terlalu banyak, dan menyingkirkan menyeret di tempat akan menjadi besar :)

Saya cukup yakin bagian ini (yang memilih huruf & angka) dapat di-golf sedikit lebih.

etene
sumber
Sepertinya tidak benar untuk aneh N.
Emigna
Sial, saya baru saja berasumsi Nakan selalu menjadi sejak saya tidak mengerti bagaimana matriks bisa simetris jika itu aneh!
etene
1
Ini adalah beberapa contoh dari matriks simetris yang aneh.
Emigna
Oke, terima kasih, saya belum melihatnya seperti itu! Yah saya kira jawaban saya tidak ada artinya seperti itu.
etene
1

Python 2 , 275 266 byte

from random import*
def f(n):
 R=range;C=choice;A=map(chr,R(97,123));b=N=n-n/2;c=`C(R(10))`;s=[c]+sample(A,n-1)+[C(A)for i in R(N*N-n)]
 while b:shuffle(s);i=s.index(c);b=n%2>(i<N*N-N>N-1>i%N)
 a=[r+r[~(n%2)::-1]for r in[s[i::N]for i in R(N)]];return a+a[~(n%2)::-1]

Cobalah online!

Mengembalikan array sebagai daftar daftar karakter. Untuk memenuhi Aturan 1, kami menyiapkan kumpulan karakter:

s = [c]                        # the unique digit...
     + sample(A,n-1)           # then sample without replacement `n-1` chars in a-z, 
                               # so we have `n` distinct chars
     + [C(A)for i in R(N*N-n)] # and fill out the rest with any in a-z

Bit rumit berikutnya adalah aturan 3: harus ada tepat 2 kolom dan baris memiliki angka; ini berarti naneh, bahwa digit yang dipilih mungkin tidak muncul di kolom tengah atau baris tengah. Karena kita membangun array menggunakan sub array persegi dua kali s, yang dilakukan di sini dengan menggunakan:

while b:            # to save a couple bytes, `b` is initialized 
                    # to `N`, which is greater than 0.
    shuffle(s)      # shuffle at least once...
    i = s.index(c)  # c is the unique digit used
    b = n%2 
             >      # if n is even, 0>(any boolean) will be false,
                    # so exit the loop; otherwise n odd, and we are
                    # evaluating '1 > some boolean', which is equivalent 
                    # to 'not (some boolean)'
         (i<N*N-N   # i is not the last column of s...
             >      # shortcut for ' and ', since N*N-N is always > N-1
          N-1>i%N)  # is not the last row of s

yaitu, kocok setidaknya satu kali; dan kemudian, jika nganjil, teruskan perulangan jika digitnya ada di kolom terakhir atau baris terakhir s.

Chas Brown
sumber
1

Pyth , 48 byte

L+b_<b/Q2JmO/Q2 2jy.eyXWqhJkbeJOT<csm.SGQK.EcQ2K

Cobalah online di sini .

Program ini dalam 3 bagian - definisi fungsi palindromisation, memilih lokasi numerik, dan fungsi utama.

Implicit: Q=eval(input()), T=10, G=lower case alphabet

L+b_<b/Q2   Palindromisation function
L           Define a function, y(b)
      /Q2   Half input number, rounding down
    <b      Take that many elements from the start of the sequence
   _        Reverse them
 +b         Prepend the unaltered sequence

JmO/Q2 2   Choose numeric location
  O/Q2     Choose a random number between 0 and half input number
 m     2   Do the above twice, wrap in array
J          Assign to variable J

jy.eyXWqhJkbeJOT<csm.SGQK.EcQ2K   Main function
                           cQ2    Divide input number by 2
                         .E       Round up
                        K         Assign the above to K
                    .SG           Shuffle the alphabet
                  sm   Q          Do the above Q times, concatenate
                 c      K         Chop the above into segments of length K
                <             K   Take the first K of the above
  .e                              Map (element, index) as (b,k) using:
       qhJk                         Does k equal first element of J?
      W                             If so...
     X     b                          Replace in b...
            eJ                        ...at position <last element of J>...
              OT                      ...a random int less than 10
                                    Otherwise, b without replacement
    y                               Apply palindromisation to the result of the above
 y                                Palindromise the set of lines
j                                 Join on newlines, implicit print

Menggunakan beberapa huruf acak akan memastikan bahwa jumlah karakter unik selalu lebih dari jumlah input.

Sok
sumber
1

Python 2 / Python 3, 227 byte

from random import*
def m(N):n=N-N//2;r=range;C=choice;c=n*[chr(i+97)for i in r(26)];shuffle(c);c[C([i for i in r(n*(N-n))if(i+1)%n+1-N%2])]=`C(r(10))`;R=[c[i*n:i*n+n]+c[i*n:i*n+n-N%2][::-1]for i in r(n)];return R+R[::-1][N%2:]

ungolfing sedikit:

from random import * # get 'choice' and 'shuffle'
def matrix(N):
    n = ceil(N/2) # get the size of the base block
    # get a shuffleable lowercase alphabet
    c = [chr(i+97)for i in range(26)]
    c = n*c # make it large enough to fill the base-block
    shuffle(c) # randomize it
    digit = choice('1234567890') # get random digit string
    ## this is only needed as to prevent uneven side-length matrices
    #  from having centerline digits.
    allowed_indices = [i for i in range( # get all allowed indices
        n*(N-n)) # skip those, that are in an unmirrored center-line
        if(i+1)%n  # only use those that are not in the center column
                 +1-N%2] # exept if there is no center column
    index = choice(allowed_indices) # get random index
    c[index]=digit # replace one field at random with a random digit
    ## 
    R=[]
    for i in range(n):
        r = c[i*n:i*n+n] # chop to chunks sized fit for the base block
        R.append(r+r[::-1][N%2:]) # mirror skipping the center line
    return R+R[::-1][N%2:] # mirror skipping the center line and return

Lebih tua, hampirVersi yang benar di bawah:

Python2, Python3, 161 byte

from random import *
N=26
n=N-N//2
c=[chr(i+97)for i in range(26)]
R=[ r+r[::-1][N%2:]for r in[(shuffle(c),c[:n])[1]for i in range(n)]]
R+=R[::-1][N%2:]
print(R)

Sepertinya N elemen yang berbeda hanya hampir dijamin.

Python 2 / Python 3, 170 byte

from random import*
def m(N):n=N-N//2;r=range;c=n*[chr(i+97)for i in r(26)][:n*n];shuffle(c);R=[_+_[::-1][N%2:]for _ in[c[i*n:i*n+n]for i in r(n)]];return R+R[::-1][N%2:]

Sepertinya saya lupa aturan 3. Juga entah bagaimana [: n * n] menyelinap masuk

Teck-freak
sumber
Jawaban Anda sangat pintar dalam membangun matriks simetris, tetapi Anda belum memenuhi aturan 3 (karena Anda tidak memiliki angka apa pun dalam hasil Anda), atau aturan 5 (misalnya, jika n = 3, Anda tidak akan pernah memiliki output yang mengandung a 'z', jadi tidak setiap output mungkin).
Chas Brown
Yah, acar aku dan ... kamu benar, ChasBrown! Nah, [: n * n] adalah sisa dari pendekatan yang berbeda dan terus terang itu seharusnya tidak ada. Tetapi Anda benar tentang aturan tiga. Saya harus memperbaikinya. Beri aku sedikit.
Teck-freak
Sudah mencoba solusi Anda di sini , tetapi ada kesalahan indeks ... BTW, TryItOnline sangat berguna di sini di PPCG! (Juga, masalah ini jauh lebih rumit daripada yang saya kira pada awalnya ...)
Chas Brown
Saya menjalankannya lebih dari 10.000 kali tanpa kesalahan.
Teck-freak
menemukannya. a ':' hilang. Saya menyalinnya langsung dari skrip saya, tetapi pasti hilang. seharusnya "...: -1] [N% 2:] untuk saya ..." bukannya "...: -1] [N% 2] untuk saya ...".
Teck-freak