Square-Random-Đối xứng


18

Thử thách

Viết chương trình hoặc hàm trả về hoặc in ma trận đối xứng vuông ngẫu nhiên.


Đầu vào

N : Kích thước của ma trận tức là6 x 6


Đầu ra

Ma trận. Bạn có thể in nó, trả về dưới dạng chuỗi (với dòng mới) hoặc dưới dạng danh sách / mảng danh sách / mảng.


Quy tắc

  1. Bạn cần sử dụng ít nhất Ncác ký tự khác nhau, Nkích thước của ma trận vuông (đầu vào) là bao nhiêu. Kể từ khi chúng tôi 'tái sử dụng chỉ thư [a, z] [A, Z] và chữ số [0, 9] (và chỉ có 1 chữ số vào thời điểm đó), bạn có thể giả định rằng N < 27N > 2, đó là bởi vì tại N <= 2bạn không thể có cả chữ và chữ số. Cuối cùng nhưng không kém phần quan trọng, mỗi chữ cái / chữ số phải có xác suất xảy ra khác không (phân phối đồng đều không phải là một điều cần thiết). Tuy nhiên, kết quả phải có ít nhất Ncác chữ cái / chữ số khác nhau.

  2. Ma trận phải đối xứng cả theo chiều ngang và chiều dọc.

  3. Chính xác là 2 hàng và 2 cột phải chứa đúng một số có một chữ số (vị trí của nó cũng phải ngẫu nhiên). Phần còn lại của hàng / cols sẽ chỉ chứa các chữ cái. Hãy xem xét các chữ cái là [a, z] và [A, Z] và tất nhiên là các số có một chữ số là [0, 9].

  4. Để dễ dàng hơn, bạn có thể giả sử rằng trường hợp của các chữ cái không thành vấn đề, miễn là các trường hợp đối xứng có nghĩa là : a=A, b=B, etc.

  5. Mỗi đầu ra có thể phải có xác suất xảy ra khác không. Phân phối ngẫu nhiên không cần phải thống nhất.


Thí dụ

Đầu vào : 8

Đầu ra :

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

Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Mego

Câu trả lời:


4

Than , 30 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Nếu nluôn luôn là chẵn thì với 23 byte:

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

Nθ

Đầu vào .n

E⊘θ⭆⊘θ‽β

Tạo một bởinn2 mảng chữ cái viết thường ngẫu nhiên. Điều này in ngầm như một hình vuông.n2

J‽⊘θ‽⊘θ

Nhảy đến một vị trí ngẫu nhiên trong hình vuông.

I‽χ

In một chữ số ngẫu nhiên.

‖C¬

Phản ánh theo chiều ngang và chiều dọc để hoàn thành ma trận.


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

Hãy thử trực tuyến!

Trong R, những thứ trông giống như toán tử chỉ là các hàm được xử lý đặc biệt từ trình phân tích cú pháp.

Nếu bạn xác định lại một toán tử (như -) là một số chức năng khác, thì nó sẽ xử lý đặc biệt từ trình phân tích cú pháp. Vì -là cả tiền tố và tiền tố, và tôi cần gọi samplehàm bằng cả hai và hai đối số, tôi có thể sử dụng

`-`=sample

để có được những gì tôi muốn.

Vì vậy, mã -lettersđược dịch sang sample(letters), ngẫu nhiên xáo trộn tích lettershợp. Nhưng j-1được dịch sang sample(j,1), lấy mẫu ngẫu nhiên 1từ vector 1:j.

(Hành vi này của samplehàm tùy thuộc vào số lượng tham số và tham số đầu tiên là gì, là một nỗi đau rất lớn ở mã sản xuất, vì vậy tôi rất vui khi tìm thấy một cách sử dụng tuyệt vời bản chất đồi trụy của nó ở đây!)

Mặt khác, mã chỉ tạo góc phần tư phía trên bên trái của kết quả được yêu cầu, thay thế một phần tử ngẫu nhiên ( bit j-1, j-1bit) bằng một chữ số ngẫu nhiên ( 0:9-1bit) và gấp nó lại cho đối xứng cần thiết. Các ijcần thiết để giải quyết các trường hợp chẵn và lẻ.


Tôi ước tôi có thể +2 cho lời giải thích tuyệt vời và cũng chỉnh sửa câu trả lời mẹo chơi gôn R có liên quan. Bạn có thể lưu thêm một vài byte
JayCe

Thật là một giải pháp tuyệt vời và lời giải thích!
J.Doe

6

Python3, 287 byte

Lần thử đầu tiên của tôi khi chơi golf ở đây; Tôi chắc rằng ai đó có thể làm tốt hơn nhiều:

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)

Hãy thử trực tuyến!

Nhờ HyperNeurtrino, Ourous và Heiteria đã giảm xuống còn 193 byte (xem bình luận). Tuy nhiên, TFeld đã chỉ ra một cách chính xác rằng nhiều cuộc gọi samplekhông đảm bảo ít nhất Ncác ký tự khác nhau.

Điều đó trong tâm trí, hãy thử phiên bản mới này sẽ đảm bảo ít nhất Ncác ký tự khác nhau trên mỗi lần chạy.

Python3, 265 260 byte, ít nhất là Ncác ký tự riêng biệt

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)

Hãy thử trực tuyến!


1
Chào mừng đến với PPCG! Bạn có thể chơi golf một vài trong số các khoảng trắng; không cần đặt khoảng cách giữa các ký hiệu và ký hiệu và chữ cái. a[:-1][::-1]về cơ bản là tương đương với a[:-2::-1], và bạn có thể nhập randomnhư rthay vì rn, và bạn có thể di chuyển forvòng lặp thành một biểu thức inline. Dùng thử trực tuyến!
HyperNeutrino

2
Bạn có thể loại bỏ việc mathnhập bằng cách sử dụng -(-a // 2)thay vì math.ceil(a / 2)cơ bản là âm sàn-div của âm (trần hiệu quả). tio.run/##XY7LagMxDEX3/ Kẻ
HyperNeutrino

1
Bạn có thể giảm xuống còn 236: Hãy thử trực tuyến!
Οurous

1
Hơn nữa, tại 196: Hãy thử trực tuyến!
Οurous

1
Nhiều sample()s không đảm bảo rằng bạn nhận được ít nhất Ncác ký tự khác nhau. Tôi quản lý để có được [['g', 'x', 'x', 'g'], [7, 'x', 'x', 7], [7, 'x', 'x', 7], ['g', 'x', 'x', 'g']]cho N=4, mà chỉ có 3 ký tự riêng biệt
TFeld

3

APL (Dyalog Classic) , 45 44 43 40 byte

cảm ơn @ Adám cho -1 byte

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

Hãy thử trực tuyến!

sử dụng (tối đa) ma trận với các phản xạ của nó để làm cho nó đối xứng, do đó, nó thiên về phần sau của bảng chữ cái

chữ số được chọn thống nhất từ ​​0 ... 25 mod 10, do đó, nó có độ lệch nhỏ so với các giá trị thấp hơn


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

@ Adám thông minh!
ngn

Vâng, tôi mới nhận ra.
Adám

Nếu tôi không nhầm, bạn có thể thay đổi ⌊⍺⍵÷2⍺⍵.
Adám

@ Adám Tôi không thể - nếu N là số lẻ, chữ số có thể nằm ở giữa và chỉ có 1 hàng / cột chứa nó
ngn

3

Japt , 31 byte (Vị trí chữ số cố định)

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

Hãy thử trực tuyến!


Japt , 41 byte (Vị trí chữ số ngẫu nhiên)

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

Hãy thử trực tuyến!


Giải trình

;                               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

Các chữ số của bạn hiện luôn được chèn tại cùng một vị trí. Dựa trên thử thách, vị trí của các chữ số cũng phải ngẫu nhiên (và có thể không nằm ở hàng giữa và / hoặc cột cho các đầu vào lẻ ​​do quy tắc 4).
Kevin Cruijssen

@KevinCruijssen Tôi không thấy thách thức nói vị trí số phải là ngẫu nhiên, tôi sẽ yêu cầu OP làm rõ mặc dù
Luis felipe De jesus Munoz

1
Ah, bạn thực sự đúng. Tôi thấy nó ngẫu nhiên trong tất cả các câu trả lời khác, vì vậy tôi có thể đã giả định rằng nó là bắt buộc. Chúng ta sẽ thấy những gì OP nói. Tôi thực sự hy vọng sửa nó cho phép, nó sẽ giúp khắc phục vấn đề đó dễ dàng hơn rất nhiều cho câu trả lời đã chuẩn bị của tôi ..;)
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]

Hãy thử trực tuyến!


Được sử dụng ints trực tiếp cho phép? Nhân tiện, ý tưởng tuyệt vời trên ~ Tôi cũng đã nghĩ về điều đó, nhưng tôi chưa thực sự quen với nó.
Teck-freak

2

05AB1E , 29 40 38 byte

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

11 byte để sửa chữa các chữ số là ở một vị trí ngẫu nhiên trong khi vẫn giữ nguyên tắc 3 trong tâm trí cho các đầu vào lẻ ..
-2 byte nhờ @MagicOctopusUrn , thay đổi îïđể òvà thay đổi vị trí của các ».

Hãy thử trực tuyến để xác minh một số trường hợp thử nghiệm .

Câu trả lời cũ ( 29 27 byte ) trong đó các vị trí chữ số luôn nằm trong các góc:

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

Hãy thử trực tuyến hoặc xác minh một số trường hợp thử nghiệm .

Giải trình:

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

Bạn cũng có thể lưu 2 byte với phiên bản cũ vì nó không yêu cầu»
Emigna

@Emigna Đã xác minh với OP và vị trí thực sự cũng phải ngẫu nhiên. Đã sửa lỗi +11 byte do quy tắc 3 với đầu vào lẻ ​​..>.> Và 3 byte có thể đã được lưu trong di sản vì điều ïnày cũng được thực hiện hoàn toàn. Thật không may, điều này không áp dụng cho phiên bản 40 byte vì sẽ chèn thay vì thay thế.
Kevin Cruijssen

@MagicOctopusUrn TIO bạn liên kết vẫn chứa câu trả lời 29 byte của tôi thay vì 28, bạn có liên kết chính xác không? Đối với các thất bại cho 2, đầu vào được đảm bảo 3 <= N <= 26.
Kevin Cruijssen

1
@KevinCruijssen bạn nói đúng, tôi là một kẻ ngốc, đây là người tôi đang làm việc: Hãy thử trực tuyến!
Bạch tuộc ma thuật Urn

@MagicOctopusUrn Ồ, không biết về việc làm tròn ngân hàng. Điều đó cũng tiết kiệm một byte trong câu trả lời hiện tại của tôi! : D Và đầu tiên nối thêm một chữ số ngẫu nhiên và chỉ sau đó xáo trộn là một cách tiếp cận khá thông minh. Không chắc chắn nếu nó hợp lệ 100%, vì bạn sẽ luôn có các nchữ cái đầu tiên của bảng chữ cái, thay vì các nchữ cái ngẫu nhiên của bảng chữ cái. Và đầu tiên tham gia bởi các dòng mới và chỉ sau đó thực hiện các gương cũng tiết kiệm được một byte. Cảm ơn -2 byte! :) PS: Một byte có thể được lưu trong 28-byter của bạn bằng cách xóa dấu vết }. :)
Kevin Cruijssen

2

C (gcc) , 198 197 196 byte

Lưu được 2 byte nhờ trần.

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

Hãy thử trực tuyến!

Giải trình:

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

Hãy thử trực tuyến!

Đã bình luận

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

Dọn dẹp , 346 312 byte

sẽ chơi golf nhiều hơn vào ngày mai

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

Hãy thử trực tuyến!


1

Con trăn 3 , 197 byte

Như được đề cập bởi @Emigna, không hoạt động cho các giá trị kỳ lạ của N(Tôi không hiểu đúng câu hỏi)

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

Hãy thử trực tuyến!

Tôi nghĩ rằng các cuộc gọi đến randint()+ sample()+ shuffle()là quá nhiều và việc loại bỏ xáo trộn tại chỗ sẽ rất tuyệt :)

Tôi khá chắc chắn rằng phần này (chọn các chữ cái & chữ số) có thể được đánh gôn thêm một chút.


Có vẻ không đúng cho lẻ N.
Emigna

Chết tiệt, tôi đã giả định Nsẽ luôn luôn ngay cả khi tôi không hiểu làm thế nào ma trận có thể đối xứng nếu nó kỳ lạ!
etene

1
Đây là một số ví dụ về ma trận đối xứng lẻ.
Emigna

Được rồi, cảm ơn, tôi đã không nhìn thấy nó theo cách đó! Vâng, tôi đoán câu trả lời của tôi là vô giá trị như sau đó.
eten

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]

Hãy thử trực tuyến!

Trả về mảng dưới dạng danh sách các danh sách các ký tự. Để đáp ứng Quy tắc 1, chúng tôi thiết lập một nhóm các ký tự:

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 khó khăn tiếp theo là quy tắc 3: phải có chính xác 2 cột và hàng có một chữ số; điều này có nghĩa là nlẻ, chữ số được chọn có thể không xuất hiện ở cột giữa hoặc hàng giữa. Vì chúng ta xây dựng mảng bằng cách sử dụng một mảng con vuông được phản ánh hai lần s, điều đó được thực hiện ở đây bằng cách sử dụng:

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

tức là xáo trộn ít nhất một lần; và sau đó, nếu nlà số lẻ, hãy tiếp tục lặp nếu chữ số nằm trong cột cuối cùng hoặc hàng cuối cùng củas .


1

Bình thường , 48 byte

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

Dùng thử trực tuyến tại đây .

Chương trình gồm 3 phần - định nghĩa hàm palindromisation, chọn vị trí của số và hàm chính.

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

Sử dụng một số bảng chữ cái được xáo trộn sẽ đảm bảo rằng số lượng ký tự duy nhất luôn nhiều hơn số đầu vào.


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

vô ý một chút:

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

Cũ hơn, gần như phiên bản đúng dưới đây:

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)

Dường như N yếu tố khác nhau chỉ là gần như đảm bảo.

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

Có vẻ như tôi đã quên quy tắc 3. Ngoài ra, bằng cách nào đó, [: n * n] trượt vào.


Câu trả lời của bạn rất thông minh trong cách xây dựng ma trận đối xứng, nhưng bạn không hài lòng quy tắc 3 (vì bạn không có bất kỳ chữ số nào trong kết quả của mình), cũng như quy tắc 5 (ví dụ: nếu n = 3, bạn sẽ không bao giờ có đầu ra chứa a 'z', vì vậy không phải mọi đầu ra đều có thể).
Chas Brown

Hãy chọn tôi và ... bạn đúng @ChasBrown! Chà, [: n * n] là phần còn lại từ một cách tiếp cận khác và thật lòng mà nói nó không nên ở đó. Nhưng bạn đã đúng về quy tắc ba. Tôi sẽ phải sửa nó. Cho tôi một chút.
Teck-freak

Đã thử giải pháp của bạn ở đây , nhưng đã xảy ra lỗi chỉ mục ... BTW, TryItOnline siêu tiện dụng tại PPCG! (Ngoài ra, vấn đề này phức tạp hơn tôi nghĩ lúc đầu ...)
Chas Brown

Tôi đã chạy nó hơn 10000 lần mà không có lỗi.
Teck-freak

Tìm thấy rồi. a ':' đã mất tích. Tôi đã sao chép nó trực tiếp từ kịch bản của mình, nhưng nó đã bị mất. nó phải là "...: -1] [N% 2:] cho i ..." thay vì "...: -1] [N% 2] cho i ...".
Teck-freak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.