Square-Random-simmetrico


18

Sfida

Scrivi un programma o una funzione che restituisce o stampa una matrice quadrata casuale-simmetrica.


Ingresso

N : la dimensione della matrice, ad es6 x 6


Produzione

La matrice. È possibile stamparlo, restituirlo come stringa (con le nuove righe) o come elenco / matrice di elenchi / matrici.


Regole

  1. È necessario utilizzare almeno Ncaratteri diversi, dove si Ntrova la dimensione della matrice quadrata (input). Dal momento che stiamo usando solo la lettera [a, z] [A, Z] e le cifre [0, 9] (e solo 1 cifra alla volta) puoi supporre che , N < 27e N > 2questo perché N <= 2non puoi avere entrambe le lettere e cifre. Ultimo ma non meno importante, ogni lettera / cifra deve avere una probabilità diversa da zero (la distribuzione uniforme non è una necessità). Tuttavia, il risultato deve contenere almeno Nlettere / cifre diverse.

  2. La matrice deve essere simmetrica sia in orizzontale che in verticale.

  3. Esattamente 2 righe e 2 colonne devono contenere rigorosamente un numero di una sola cifra (anche la sua posizione deve essere casuale). Il resto delle righe / colonne contiene solo lettere. Considera le lettere come [a, z] e [A, Z] e ovviamente i numeri a una cifra come [0, 9].

  4. Tanto per essere più facile, si può supporre che il caso delle lettere non importa, fintanto che i casi sono simmetrici che vuol dire: a=A, b=B, etc.

  5. Ogni possibile output deve avere una probabilità diversa da zero. La distribuzione casuale non deve essere uniforme.


Esempio

Ingresso : 8

Uscita :

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

I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Mego

Risposte:


4

Carbone , 30 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Se nè sempre pari, quindi per 23 byte:

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

Nθ

Ingresso .n

E⊘θ⭆⊘θ‽β

Crea un dinn2 array di lettere minuscole casuali. Questo viene stampato implicitamente come un quadrato.n2

J‽⊘θ‽⊘θ

Salta in una posizione casuale nella piazza.

I‽χ

Stampa una cifra casuale.

‖C¬

Rifletti in orizzontale e in verticale per completare la matrice.


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

Provalo online!

In R, le cose che sembrano operatori sono solo funzioni che ricevono un trattamento speciale dal parser.

Se si ridefinisce un operatore (come -) per essere un'altra funzione, mantiene il trattamento speciale dal parser. Poiché -è sia prefisso che infisso, e ho bisogno di chiamare la samplefunzione con uno e due argomenti, posso usare

`-`=sample

per ottenere quello che voglio.

Quindi il codice -lettersviene tradotto in sample(letters), che mescola casualmente il lettersbuilt-in. Ma j-1viene tradotto in sample(j,1), che campiona casualmente l' 1elemento dal vettore 1:j.

(Questo comportamento della samplefunzione dipende dal numero di parametri e da quale sia il primo parametro, è un enorme dolore nel calcio nel codice di produzione, quindi sono felice di trovare un grande uso della sua natura perversa qui!)

Altrimenti il codice rende solo la parte superiore sinistra quadrante del risultato richiesto, sostituisce un elemento casuale (la j-1, j-1bit) con una cifra casuale (il 0:9-1bit), e pieghe fuori per la simmetria richiesto. Il ie il jsono necessari per affrontare i casi pari e dispari.


Vorrei poter fare +2 per la grande spiegazione e anche per modificare la relativa risposta del suggerimento R golf. Puoi salvare qualche altro byte
JayCe

Che soluzione e spiegazione fantastiche!
J.Doe,

6

Python3, 287 byte

Il mio primo tentativo di giocare a golf qui; Sono sicuro che qualcuno può fare molto meglio:

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)

Provalo online!

Grazie a HyperNeurtrino, Ourous ed Heiteria questo si è ridotto a 193 byte (vedi commenti). Tuttavia, TFeld ha correttamente sottolineato che più chiamate a samplenon garantiscono almeno Ncaratteri diversi.

Quella roba in mente, prova questa nuova versione che dovrebbe garantire almeno Ndiversi personaggi per corsa.

Python3, 265 260 byte, almeno Ncaratteri distinti

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)

Provalo online!


1
Benvenuti in PPCG! Puoi giocare a golf in alcuni spazi bianchi; non è necessario inserire spazi tra simboli e simboli e lettere. a[:-1][::-1]è fondamentalmente equivalente a a[:-2::-1], e puoi importarlo randomcome rinvece di rn, e puoi spostare il forciclo in un'espressione incorporata. Provalo online!
HyperNeutrino,

2
Puoi rimuovere l' mathimportazione usando -(-a // 2)invece di quello math.ceil(a / 2)che è sostanzialmente negativo div-floor del negativo (effettivamente soffitto). tio.run/##XY7LagMxDEX3/…
HyperNeutrino

1
Puoi farlo fino a 236: provalo online!
Auguroso

1
Ancora di più, a 196: provalo online!
Auguroso

1
I multipli sample()non ti garantiscono di avere almeno Npersonaggi diversi. Sono riuscito a ottenere [['g', 'x', 'x', 'g'], [7, 'x', 'x', 7], [7, 'x', 'x', 7], ['g', 'x', 'x', 'g']]per il N=4, che ha solo 3 distinti caratteri
TFeld

3

APL (Dyalog Classic) , 45 44 43 40 byte

grazie @ Adám per -1 byte

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

Provalo online!

usa (max) la matrice con i suoi riflessi per renderla simmetrica, quindi è distorta verso l'ultima parte dell'alfabeto

la cifra viene scelta uniformemente da 0 a 25 mod 10, quindi ha una leggera propensione per abbassare i valori


1
⌊2⍴⍵÷2)?⍵ ⍵⍴26]}⌊⍺⍵÷2)?⍺⍵⍴26]}⍨
Adám,

@ Adám intelligente!
ngn,

Sì, ho appena realizzato.
Adám,

Se non sbaglio, puoi cambiare ⌊⍺⍵÷2⍺⍵.
Adám,

@Adám non posso - se N è dispari, la cifra potrebbe finire al centro e ci sarebbe solo 1 riga / colonna che la contiene
ngn

3

Japt , 31 byte (Posizione a cifre fisse)

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

Provalo online!


Japt , 41 byte (Posizione casuale delle cifre)

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

Provalo online!


Spiegazione

;                               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

Le tue cifre sono attualmente sempre inserite nello stesso posto. In base alla sfida, anche la posizione delle cifre dovrebbe essere casuale (e potrebbe non essere nella riga centrale e / o nella colonna per input dispari a causa della regola 4).
Kevin Cruijssen,

@KevinCruijssen Non vedo dove la sfida affermi che anche la posizione dei numeri deve essere casuale, chiederò comunque chiarimenti all'OP
Luis felipe De jesus Munoz,

1
Ah, hai davvero ragione. Ho visto che è casuale in tutte le altre risposte, quindi avrei potuto erroneamente presumere che fosse obbligatorio. Vedremo cosa dice OP. Spero davvero che sia stato risolto il problema, renderebbe molto più semplice risolvere quel problema per la mia risposta preparata ..;)
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]

Provalo online!


L'uso di ints è consentito direttamente? Bella idea sul ~ a proposito. Ci stavo pensando anch'io, ma non ci sono ancora abituato.
Teck-maniaco

2

05AB1E , 29 40 38 byte

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

+11 byte per fissare la cifra essendo in una posizione casuale pur mantenendo regola 3 in memoria per ingressi dispari ..
-2 byte grazie @MagicOctopusUrn , cambiando îïper òe cambiando la posizione della ».

Provalo online per verificare altri casi di test .

Vecchia ( 29 27 byte ) risponde dove la cifra si posiziona sempre negli angoli:

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

Provalo online o verifica alcuni altri casi di test .

Spiegazione:

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

Puoi anche salvare 2 byte con la versione legacy poiché non richiede»
Emigna il

@Emigna Verificato con OP e anche la posizione dovrebbe essere casuale. Risolto il problema con +11 byte a causa della regola 3 con input dispari ï. Sfortunatamente questo non si applica alla versione a 40 byte perché inserirebbe invece di sostituire.
Kevin Cruijssen,

@MagicOctopusUrn Il TIO che hai collegato conteneva ancora la mia risposta di 29 byte invece di 28, hai il link corretto? Per quanto riguarda il fallimento 2, l'input è garantito 3 <= N <= 26.
Kevin Cruijssen,

1
@KevinCruijssen hai ragione, sono un idiota, ecco quello a cui stavo lavorando: provalo online!
Magic Octopus Urn,

@MagicOctopusUrn Oh, non sapevo dell'arrotondamento dei banchieri. Ciò salva anche un byte nella mia risposta attuale! : D E prima aggiungere una cifra casuale e solo allora mescolare è anche un approccio piuttosto intelligente. Non sono sicuro che sia valido al 100%, poiché avrai sempre le prime nlettere dell'alfabeto, anziché nle lettere casuali dell'alfabeto. E prima unirmi da newline e solo allora fare i mirror salva un byte anche nel mio. Grazie per -2 byte! :) PS: un byte può essere salvato nel tuo 28-byte rimuovendo il trailing }. :)
Kevin Cruijssen,

2

C (gcc) , 198 197 196 byte

Salvato 2 byte grazie a 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]);}

Provalo online!

Spiegazione:

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

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

Provalo online!

Commentate

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

1

Pulito , 346 312 byte

domani giocherò a golf di più

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

Provalo online!


1

Python 3 , 197 byte

Come accennato da @Emigna, non funziona con valori dispari di N(non ho capito bene la domanda)

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

Provalo online!

Penso che le chiamate a randint()+ sample()+ shuffle()siano troppo, e sbarazzarsi del mescolamento sul posto sarebbe fantastico :)

Sono abbastanza sicuro che questa parte (che seleziona le lettere e le cifre) possa essere giocata un po 'di più.


Non sembra corretto per dispari N.
Emigna,

Dannazione, avevo appena pensato che Nsarebbe stato anche dal momento che non capisco come la matrice potrebbe essere simmetrica se fosse strana!
etene,

1
Questi sono alcuni esempi di matrici simmetriche dispari.
Emigna,

Ok, grazie, non l'avevo visto in quel modo! Beh, immagino che la mia risposta sia inutile come lo è allora.
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]

Provalo online!

Restituisce l'array come un elenco di elenchi di caratteri. Per soddisfare la Regola 1, abbiamo creato un pool di personaggi:

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

Il prossimo bit difficile è la regola 3: ci devono essere esattamente 2 colonne e righe con una cifra; questo significa per ndispari che la cifra scelta potrebbe non apparire nella colonna centrale o nella riga centrale. Dal momento che costruiamo l'array utilizzando un array secondario quadrato a doppio riflesso s, ciò viene realizzato utilizzando:

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

cioè, mescolare almeno una volta; e quindi, se nè dispari, continua a ripetere il ciclo se la cifra si trova nell'ultima colonna o nell'ultima riga di s.


1

Pyth , 48 byte

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

Provalo online qui .

Il programma è suddiviso in 3 parti: definizione della funzione di palindromizzazione, scelta della posizione numerica e funzione principale.

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

L'uso di diversi alfabeti mescolati dovrebbe garantire che il numero di caratteri univoci sia sempre maggiore del numero di input.


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 un po ':

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

Versioni precedenti , quasi corrette, di seguito:

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)

Sembra che N elementi diversi sia solo quasi garantito.

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

Sembra che ho dimenticato la regola 3. Anche in qualche modo il [: n * n] è entrato.


La tua risposta è molto intelligente nel modo in cui costruisce la matrice simmetrica, ma non hai soddisfatto la regola 3 (in quanto non hai cifre nel risultato), né la regola 5 (ad esempio, se n = 3non avrai mai un output contenente a 'z', quindi non tutte le uscite sono possibili).
Chas Brown,

Bene, picchiami e ... hai ragione @ChasBrown! Bene, il [: n * n] è un resto di un approccio diverso e francamente non dovrebbe essere lì. Ma hai ragione sulla regola tre. Dovrò correggerlo. Dammi un po '.
Teck-maniaco

Ho provato la tua soluzione qui , ma si è verificato un errore di indice ... A proposito, TryItOnline è molto utile qui su PPCG! (Inoltre, questo problema è molto più complicato di quanto pensassi all'inizio ...)
Chas Brown

L'ho eseguito letteralmente oltre 10000 volte senza errori.
Teck-maniaco

trovato. mancava un ':'. L'ho copiato direttamente dalla mia sceneggiatura, ma deve essersi perso. dovrebbe essere "...: -1] [N% 2:] per i ..." invece di "...: -1] [N% 2] per i ...".
Teck-maniaco
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.