ตารางสุ่มสมมาตร


18

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่ส่งคืนหรือพิมพ์เมทริกซ์จตุรัสสมมาตรแบบสุ่ม


อินพุต

N : ขนาดของเมทริกซ์คือ6 x 6


เอาท์พุต

เมทริกซ์ คุณสามารถพิมพ์กลับเป็นสตริง (ด้วยการขึ้นบรรทัดใหม่) หรือเป็นรายการ / อาร์เรย์ของรายการ / อาร์เรย์


กฎระเบียบ

  1. คุณต้องใช้อย่างน้อยNอักขระที่แตกต่างกันซึ่งNขนาดของเมทริกซ์จตุรัส (อินพุต) อยู่ที่ใด เนื่องจากเราใช้ตัวอักษร [a, z] [A, Z] และตัวเลข [0, 9] (และมีเพียง 1 หลักเท่านั้นในเวลานั้น) คุณสามารถสันนิษฐานได้N < 27และN > 2นั่นเป็นเพราะN <= 2คุณไม่สามารถมีตัวอักษรทั้งสองได้ และตัวเลข ท้ายสุด แต่ไม่ท้ายสุดตัวอักษร / ตัวเลขทุกตัวต้องมีความน่าจะเป็นที่ไม่เป็นศูนย์ที่เกิดขึ้น (การแจกเครื่องแบบไม่จำเป็น) อย่างไรก็ตามผลลัพธ์ต้องมีNตัวอักษร / ตัวเลขต่างกันอย่างน้อย

  2. เมทริกซ์จะต้องมีทั้งแนวนอนและแนวตั้งสมมาตร

  3. 2 แถวและ 2 คอลัมน์จะต้องมีตัวเลขหลักเดียวอย่างเคร่งครัด (ตำแหน่งควรเป็นแบบสุ่ม) ส่วนที่เหลือของแถว / cols จะมีเพียงตัวอักษร พิจารณาตัวอักษรเป็น [a, z] และ [A, Z] และแน่นอนว่าตัวเลขหลักเดียวคือ [0, 9]

  4. a=A, b=B, etcเพียงเพื่อจะได้ง่ายขึ้นคุณสามารถสรุปได้ว่ากรณีของตัวอักษรไม่สำคัญตราบใดที่กรณีที่มีสมมาตรซึ่งหมายถึง:

  5. ทุกผลลัพธ์ที่เป็นไปได้ต้องมีความน่าจะเป็นที่ไม่เป็นศูนย์ที่เกิดขึ้น การกระจายแบบสุ่มไม่จำเป็นต้องเหมือนกัน


ตัวอย่าง

อินพุต : 8

ผลผลิต :

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

ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Mego

คำตอบ:


4

ถ่าน 30 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด ถ้าnเป็นเลขคู่เสมอ 23 ไบต์:

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

Nθ

อินพุตnn

E⊘θ⭆⊘θ‽β

สร้างโดยnn2ตัวอักษรตัวพิมพ์เล็ก 2แถว สิ่งนี้พิมพ์โดยนัยเป็นรูปสี่เหลี่ยมจัตุรัสn2

J‽⊘θ‽⊘θ

ข้ามไปยังตำแหน่งสุ่มในตาราง

I‽χ

พิมพ์ตัวเลขสุ่ม

‖C¬

สะท้อนแนวนอนและแนวตั้งเพื่อทำให้เมทริกซ์สมบูรณ์


14

R , 124 118 ไบต์

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

ลองออนไลน์!

ใน R สิ่งที่ดูเหมือนตัวดำเนินการเป็นเพียงฟังก์ชั่นที่ได้รับการดูแลเป็นพิเศษจากตัวแยกวิเคราะห์

หากคุณกำหนดผู้ปฏิบัติงาน (เหมือน-) ให้เป็นฟังก์ชั่นอื่นมันจะคงการดูแลเป็นพิเศษจากโปรแกรมแยกวิเคราะห์ เนื่องจาก-เป็นทั้งคำนำหน้าและมัดและฉันจำเป็นต้องเรียกใช้sampleฟังก์ชั่นที่มีทั้งหนึ่งและสองข้อโต้แย้งฉันสามารถใช้

`-`=sample

เพื่อให้ได้สิ่งที่ฉันต้องการ

ดังนั้นรหัส-lettersจึงถูกแปลsample(letters)ซึ่งสุ่ม shuffles ในlettersตัว แต่j-1จะแปลให้sample(j,1)ซึ่งสุ่มกลุ่มตัวอย่างรายการจากเวกเตอร์11:j

(พฤติกรรมของsampleฟังก์ชั่นนี้ขึ้นอยู่กับจำนวนของพารามิเตอร์และสิ่งที่พารามิเตอร์แรกคือความเจ็บปวดขนาดใหญ่ในก้นในรหัสการผลิตดังนั้นฉันดีใจที่ได้พบกับการใช้งานที่ผิดปกติของธรรมชาติที่นี่!)

มิฉะนั้นรหัสเพียงแค่ทำให้ด้านบนซ้ายของผลที่ต้องการแทนที่องค์ประกอบแบบสุ่ม (คนj-1, j-1บิต) กับหลักสุ่ม (คน0:9-1บิต) และพับออกสำหรับสมมาตรที่จำเป็น iและjมีความจำเป็นที่จะจัดการกับกรณีแม้และคี่


ฉันหวังว่าฉันจะสามารถ +2 สำหรับคำอธิบายที่ดีและยังแก้ไขคำตอบเคล็ดลับการเล่นกอล์ฟ R ที่เกี่ยวข้อง คุณสามารถบันทึกเพิ่มอีกไม่กี่ไบต์
JayCe

ช่างเป็นคำตอบและคำอธิบายที่ยอดเยี่ยมมาก!
J.Doe

6

Python3, 287 ไบต์

ครั้งแรกที่ฉันลองเล่นกอล์ฟที่นี่ ฉันแน่ใจว่าบางคนสามารถทำได้ดีกว่า:

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)

ลองออนไลน์!

ขอบคุณ HyperNeurtrino, Ourous และ Heiteria นี้หดตัวลงถึง 193 ไบต์ (ดูความคิดเห็น) อย่างไรก็ตาม TFeld ชี้ให้เห็นอย่างถูกต้องว่าการโทรหลายครั้งเพื่อsampleไม่รับประกันNตัวละครอย่างน้อยที่สุด

สิ่งนั้นอยู่ในใจลองรุ่นใหม่นี้ที่ควรรับประกันอย่างน้อยNตัวละครที่แตกต่างกันต่อการทำงาน

Python3, 265 260 ไบต์, อย่างน้อยNอักขระที่แตกต่างกัน

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)

ลองออนไลน์!


1
ยินดีต้อนรับสู่ PPCG! คุณสามารถตีกอล์ฟออกจากช่องว่างบางส่วนได้ ไม่จำเป็นต้องใส่ช่องว่างระหว่างสัญลักษณ์และสัญลักษณ์และตัวอักษร a[:-1][::-1]เป็นพื้นฐานที่เทียบเท่ากับa[:-2::-1]และคุณสามารถนำเข้าrandomเป็นrแทนrnและคุณสามารถย้ายforห่วงเป็นนิพจน์แบบอินไลน์ ลองออนไลน์!
HyperNeutrino

2
คุณสามารถลบmathการนำเข้าโดยใช้-(-a // 2)แทนการmath.ceil(a / 2)ลบพื้น - div ของเชิงลบ (ฝ้าเพดานอย่างมีประสิทธิภาพ) tio.run/##XY7LagMxDEX3/ …
HyperNeutrino

1
คุณสามารถทำได้ถึง 236: ลองออนไลน์!
Οurous

1
ยิ่งไปกว่านั้นที่ 196: ลองออนไลน์!
Οurous

1
ตัวละครหลายตัวsample()ไม่รับประกันว่าคุณจะได้รับNตัวละครอย่างน้อยที่สุด ฉันจัดการที่จะได้รับ[['g', 'x', 'x', 'g'], [7, 'x', 'x', 7], [7, 'x', 'x', 7], ['g', 'x', 'x', 'g']]สำหรับการN=4ซึ่งมีเพียง 3 ตัวอักษรที่แตกต่างกัน
TFeld

3

APL (Dyalog Classic) , 45 44 43 40 ไบต์

ขอบคุณ @ Adámสำหรับ -1 ไบต์

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

ลองออนไลน์!

ใช้(สูงสุด) ของเมทริกซ์พร้อมการสะท้อนเพื่อให้สมมาตรดังนั้นมันจึงเอนเอียงไปทางส่วนหลังของตัวอักษร

ตัวเลขจะถูกเลือกอย่างสม่ำเสมอจาก 0 ... 25 mod 10 ดังนั้นมันจึงมีอคติเล็ก ๆ สำหรับค่าที่ต่ำกว่า


1
⌊2⍴⍵÷2)?⍵ ⍵⍴26]}⌊⍺⍵÷2)?⍺⍵⍴26]}⍨
อดัม

@ Adámฉลาด!
ngn

ใช่ฉันเพิ่งรู้
อดัม

ถ้าฉันไม่ผิดคุณสามารถเปลี่ยน→⌊⍺⍵÷2 ⍺⍵
อดัม

@ Adámฉันทำไม่ได้ - ถ้า N เป็นเลขคี่, หลักอาจอยู่ตรงกลางและจะมีเพียง 1 แถว / คอลัมน์ที่บรรจุอยู่
ngn

3

Japtap , 31 ไบต์ (ตำแหน่งหลักคงที่)

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

ลองออนไลน์!


Japtap 41 ไบต์ (ตำแหน่งตัวเลขสุ่ม)

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

ลองออนไลน์!


คำอธิบาย

;                               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

ขณะนี้ตัวเลขของคุณถูกแทรกไว้ที่เดียวกันเสมอ ขึ้นอยู่กับความท้าทายตำแหน่งของตัวเลขควรเป็นแบบสุ่มเช่นกัน (และอาจไม่อยู่ในแถวกลางและ / หรือคอลัมน์สำหรับอินพุตคี่เนื่องจากกฎ 4)
Kevin Cruijssen

@KevinCruijssen ฉันไม่เห็นว่าสิ่งที่ท้าทายบอกว่าหมายเลขตำแหน่งจะต้องสุ่มเช่นกันฉันจะขอ OP เพื่อขอความกระจ่างถึงแม้ว่า
Luis felipe De jesus Munoz

1
อาคุณพูดถูก ฉันเห็นว่ามันสุ่มในคำตอบอื่น ๆ ทั้งหมดดังนั้นฉันอาจสันนิษฐานได้ว่ามันเป็นข้อบังคับ เราจะเห็นสิ่งที่ OP พูด ฉันหวังว่าคงได้รับอนุญาตมันจะทำให้ง่ายขึ้นมากในการแก้ไขปัญหาสำหรับคำตอบที่เตรียมไว้ของฉัน .. ;)
Kevin Cruijssen

2

Python 2 , 259 ไบต์

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]

ลองออนไลน์!


ใช้ ints อนุญาตโดยตรงหรือไม่ ไอเดียสุดเท่เกี่ยวกับ ~ โดยวิธีการ ฉันก็คิดแบบนั้นเหมือนกัน แต่ฉันก็ยังไม่ชิน
Teck-freak

2

05AB1E , 29 40 38 ไบต์

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

11 ไบต์ในการแก้ไขปัญหาหลักอยู่ในตำแหน่งที่สุ่มในขณะที่ยังคงรักษากฎ 3 ในใจสำหรับปัจจัยการผลิตที่แปลก ..
-2 ไบต์ขอบคุณที่@MagicOctopusUrnเปลี่ยนîïไปและการเปลี่ยนตำแหน่งของò»

ลองมันออนไลน์ของการตรวจสอบกรณีทดสอบบางมากขึ้น

Old ( 29 27 bytes ) ตอบคำถามเมื่อตำแหน่งหลักอยู่ที่มุมเสมอ:

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

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบบางมากขึ้น

คำอธิบาย:

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

คุณสามารถบันทึก 2 ไบต์ด้วยเวอร์ชันดั้งเดิมเนื่องจากไม่จำเป็นต้องใช้»
Emigna

@Emigna ได้รับการยืนยันด้วย OP และตำแหน่งควรเป็นแบบสุ่มเช่นกัน แก้ไขให้กับ +11 ไบต์เนื่องจากกฎ 3 ที่มีอินพุตคี่ .. >.> และสามารถบันทึก 3 ไบต์ในมรดกได้เนื่องจากมีการïกระทำโดยปริยายเช่นกัน น่าเสียดายที่นี่ใช้ไม่ได้กับรุ่น 40 ไบต์เพราะจะแทรกแทนการแทนที่
Kevin Cruijssen

@MagicOctopusUrn TIO ที่คุณลิงก์ยังมีคำตอบ 29 ไบต์แทน 28 คุณมีลิงค์ที่ถูกต้องหรือไม่ สำหรับความล้มเหลวสำหรับใส่รับประกันได้ว่าจะ2 3 <= N <= 26
Kevin Cruijssen

1
@KevinCruijssen คุณพูดถูกฉันเป็นคนปัญญาอ่อนนี่คือสิ่งที่ฉันออกกำลังกาย: ลองออนไลน์!
Magic Octopus Urn

@MagicOctopusUrn โอ้ไม่รู้เกี่ยวกับการปัดเศษนายธนาคาร นั่นช่วยประหยัดไบต์ในคำตอบปัจจุบันของฉันเช่นกัน! : D และการต่อท้ายการสุ่มตัวเลขแล้วการสับเป็นวิธีที่ชาญฉลาดเช่นกัน ไม่แน่ใจว่าใช้งานได้ 100% หรือไม่เพราะคุณจะมีnตัวอักษรตัวแรกของตัวอักษรเสมอแทนที่จะเป็นnตัวอักษรแบบสุ่ม และการเข้าร่วมครั้งแรกโดยการขึ้นบรรทัดใหม่และจากนั้นการทำมิเรอร์จะช่วยประหยัดไบต์เช่นเดียวกับฉัน ขอบคุณสำหรับ -2 ไบต์! :) PS: หนึ่งไบต์สามารถบันทึกใน 28 byter }คุณโดยการลบต่อท้าย :)
Kevin Cruijssen

2

C (gcc) , 198 197 196 ไบต์

บันทึก 2 ไบต์ขอบคุณไปที่ catcat

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

ลองออนไลน์!

คำอธิบาย:

// 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 ไบต์

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

ลองออนไลน์!

แสดงความคิดเห็น

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

ทำความสะอาด , 346 312 ไบต์

จะเล่นกอล์ฟในวันพรุ่งนี้มากกว่านี้

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

ลองออนไลน์!


1

Python 3 , 197 ไบต์

ดังที่ @Emigna ไม่ทำงานสำหรับค่าแปลก ๆ ของN(ฉันไม่เข้าใจคำถามอย่างถูกต้อง)

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

ลองออนไลน์!

ฉันคิดว่าการโทรไปยังrandint()+ sample()+shuffle()นั้นมากเกินไปและการกำจัดการสับแบบแทนที่จะดีมาก :)

ฉันค่อนข้างแน่ใจว่าส่วนนี้ (ที่เลือกตัวอักษร & ตัวเลข) สามารถเล่นกอล์ฟได้มากกว่านี้


Nดูเหมือนจะไม่ถูกต้องสำหรับคี่
Emigna

ประณามฉันเพิ่งสันนิษฐานว่าNจะเป็นเสมอเพราะฉันไม่เข้าใจว่าเมทริกซ์นั้นสมมาตรได้อย่างไรถ้ามันแปลก!
etene

1
นี่คือตัวอย่างของเมทริกซ์สมมาตรแปลก
Emigna

โอเคขอบคุณฉันไม่เคยเห็นแบบนั้นมาก่อน! ฉันเดาว่าคำตอบของฉันก็ไร้ค่าเหมือนเดิม
etene

1

Python 2 , 275 266 ไบต์

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]

ลองออนไลน์!

ส่งคืนอาร์เรย์เป็นรายการของอักขระ เพื่อให้เป็นไปตามกฎข้อที่ 1 เราได้ตั้งกลุ่มของตัวละคร:

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

บิตที่ยุ่งยากต่อไปคือกฎที่ 3: จะต้องมี2คอลัมน์และแถวที่มีตัวเลข นี่หมายความว่าnแปลกที่ตัวเลขที่เลือกอาจไม่ปรากฏในคอลัมน์กลางหรือแถวกลาง เนื่องจากเราสร้างอาเรย์โดยใช้อาเรย์ย่อยสแควร์สะท้อนสองครั้งsซึ่งทำได้ที่นี่โดยใช้:

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

เช่นสับเปลี่ยนอย่างน้อยหนึ่งครั้ง แล้วถ้าเป็นเลขคี่ให้บ่วงถ้าหลักที่อยู่ในคอลัมน์สุดท้ายหรือแถวสุดท้ายของns


1

Pyth , 48 ไบต์

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

ลองออนไลน์ที่นี่

โปรแกรมนี้แบ่งออกเป็น 3 ส่วนคือนิยามของฟังก์ชั่น palindromisation การเลือกตำแหน่งของตัวเลขและฟังก์ชั่นหลัก

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

การใช้ตัวอักษรแบบสับหลายตัวควรตรวจสอบให้แน่ใจว่าจำนวนอักขระที่ไม่ซ้ำนั้นมากกว่าจำนวนที่ป้อน


1

Python 2 / Python 3, 227 ไบต์

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 เล็กน้อย:

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

เก่ากว่ารุ่นที่ถูกต้องเกือบด้านล่าง:

Python2, Python3, 161 ไบต์

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)

ดูเหมือนว่าองค์ประกอบที่แตกต่างกัน N เกือบจะรับประกันเท่านั้น

Python 2 / Python 3, 170 ไบต์

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

ดูเหมือนว่าฉันลืมกฎ 3 นอกจากนี้ยังมี [: n * n] ลื่นไหล


คำตอบของคุณนั้นฉลาดมากในการสร้างเมทริกซ์สมมาตร แต่คุณไม่พอใจกฎ 3 (เนื่องจากคุณไม่มีตัวเลขใด ๆ ในผลลัพธ์ของคุณ) หรือกฎ 5 (เช่นถ้าn = 3คุณจะไม่มีผลลัพธ์ที่มี a 'z', ไม่ใช่ทุกเอาต์พุตที่เป็นไปได้)
Chas Brown

เอาเลยฉันและ ... คุณถูกต้อง @ChasBrown! ดี [: n * n] เป็นส่วนที่เหลือจากวิธีการที่แตกต่างกันและตรงไปตรงมามันไม่ควรจะมี แต่คุณถูกต้องเกี่ยวกับกฎข้อที่สาม ฉันจะต้องแก้ไขให้ถูกต้อง ให้ฉันหน่อย
Teck-freak

ลองวิธีแก้ปัญหาของคุณที่นี่แต่มีข้อผิดพลาดของดัชนี ... BTW, TryItOnline มีประโยชน์อย่างมากที่ PPCG! (นอกจากนี้ปัญหาที่เกิดขึ้นนี้เป็นวิธีพลิกแพลงกว่าที่ผมคิดในตอนแรก ... )
Chas สีน้ำตาล

ฉันใช้งานมากกว่า 10,000 ครั้งโดยไม่มีข้อผิดพลาด
Teck-freak

พบมัน a ':' หายไป ฉันคัดลอกมาจากสคริปต์ของฉันโดยตรง แต่จะต้องหายไป ควรเป็น "... : -1] [N% 2:] สำหรับฉัน ... " แทนที่จะเป็น "... : -1] [N% 2] สำหรับฉัน ... "
Teck-freak
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.