स्क्वायर-रैंडम-सममित


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 स्तंभों में कड़ाई से एक एकल-अंक संख्या होनी चाहिए (यह स्थिति यादृच्छिक रूप में अच्छी तरह होनी चाहिए)। बाकी पंक्तियों / कॉलों में केवल अक्षर होंगे। अक्षरों को [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θ

इनपुट n

E⊘θ⭆⊘θ‽β

एक एन बनाएँ द्वाराएनn2यादृच्छिक निचले अक्षरों के 2 सरणी। यह प्रिंट एक वर्ग के रूप में निहित है।n2

J‽⊘θ‽⊘θ

वर्ग में एक यादृच्छिक स्थिति में कूदो।

I‽χ

एक यादृच्छिक अंक मुद्रित करें।

‖C¬

मैट्रिक्स को पूरा करने के लिए क्षैतिज और लंबवत रूप से प्रतिबिंबित करें।


14

आर , 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

इसे ऑनलाइन आज़माएं!

आर में, जो चीजें ऑपरेटर की तरह दिखती हैं, वे केवल कार्य हैं जो पार्सर से विशेष उपचार प्राप्त करते हैं।

यदि आप -किसी अन्य फ़ंक्शन को एक ऑपरेटर (जैसे ) को फिर से परिभाषित करते हैं, तो यह पार्सर से विशेष उपचार रखता है। चूंकि -उपसर्ग और शिशु दोनों हैं, और मुझे sampleफ़ंक्शन को एक और दो तर्क के साथ कॉल करने की आवश्यकता है , मैं उपयोग कर सकता हूं

`-`=sample

जो मैं चाहता हूं उसे पाने के लिए।

इसलिए कोड -lettersका अनुवाद किया जाता है sample(letters), जो lettersअंतर्निहित रूप से यादृच्छिक रूप से फेरबदल करता है। लेकिन j-1इसका अनुवाद किया गया है sample(j,1), जो 1वेक्टर से आइटम का बेतरतीब ढंग से नमूना लेता है 1:j

( sampleमापदंडों की संख्या और पहले पैरामीटर क्या है के आधार पर फ़ंक्शन का यह व्यवहार , उत्पादन कोड में बट में एक बहुत बड़ा दर्द है, इसलिए मैं यहां इसके विकृत प्रकृति का एक महान उपयोग पाकर खुश हूं!)

अन्यथा कोड सिर्फ आवश्यक परिणाम के शीर्ष छोड़ दिया वृत्त का चतुर्थ भाग, एक यादृच्छिक तत्व (बदल देता है बनाता है j-1, j-1एक यादृच्छिक अंकों (साथ बिट) 0:9-1बिट), और आवश्यक समरूपता के लिए इसे बाहर परतों। iऔर jयहां तक कि और अजीब मामलों से निपटने के लिए आवश्यक हैं।


मेरी इच्छा है कि मैं महान स्पष्टीकरण के लिए +2 और संबंधित आर गोल्फिंग टिप उत्तर को संपादित कर सकूं। आप कुछ और बाइट्स
JayCe

क्या शानदार समाधान और स्पष्टीकरण है!
जे। डूडे

6

पायथन 3, 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प्रति रन कम से कम विभिन्न वर्णों की गारंटी दे ।

पायथन 3, 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], और आप इसके बजाय आयात कर सकते हैं , और आप लूप को इनलाइन अभिव्यक्ति में स्थानांतरित कर सकते हैं । यह ऑनलाइन की कोशिश करो! randomrrnfor
हाइपरन्यूट्रिनो 1

2
आप इसके बजाय mathआयात का उपयोग कर सकते हैं -(-a // 2), math.ceil(a / 2)जो मूल रूप से नकारात्मक (प्रभावी रूप से छत) के नकारात्मक फर्श-डिव है। tio.run/##XY7LagMxDEX3/…
HyperNutrino

1
आप इसे 236 पर प्राप्त कर सकते हैं: इसे ऑनलाइन आज़माएं!
Ο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 बाइट्स

धन्यवाद -1 बाइट के लिए Adám

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

इसे ऑनलाइन आज़माएं!

का उपयोग करता है मैट्रिक्स के (अधिकतम) अपने प्रतिबिंबों के साथ इसे सममित बनाने के लिए, इसलिए यह वर्णमाला के उत्तरार्द्ध के पक्षपाती है।

अंक को 0 ... 25 mod 10 से समान रूप से चुना जाता है, इसलिए इसमें छोटे मान कम होते हैं


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

@ चतुर समझो!
ngn 30'18

हाँ, मुझे एहसास हुआ।
9

अगर मैं गलत नहीं हूँ, आप बदल सकते हैं ⌊⍺⍵÷2⍺⍵
एड्म

@ Adám I ​​can - if N विषम है, अंक केंद्र में समाप्त हो सकता है और इसमें केवल 1 पंक्ति / कॉलम होगा
ngn

3

Japt , 31 बाइट्स (निश्चित अंक स्थिति)

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

इसे ऑनलाइन आज़माएं!


Japt , 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 के कारण विषम इनपुट के लिए मध्य पंक्ति और / या स्तंभ में नहीं हो सकती है)।
केविन क्रूज़सेन

@ केविनक्रूजसेन मैं नहीं देखता कि चुनौती कहे कि नंबर पोजीशन बेतरतीब है या नहीं, मैं ओपी से स्पष्टीकरण पूछूंगा, हालांकि
लुइस फेलिप डी जेउस मुनोज

1
आह, तुम वास्तव में सही हो। मैंने देखा कि यह अन्य सभी जवाबों में यादृच्छिक है, इसलिए मैंने झूठा होना अनिवार्य माना है। हम देखेंगे कि ओपी क्या कहता है। मुझे वास्तव में उम्मीद है कि इसे अनुमति दी गई है, यह मेरे तैयार जवाब के लिए उस समस्या को ठीक करना बहुत आसान बना देगा ..;)
केविन क्रूज़सेन

2

पायथन 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]

इसे ऑनलाइन आज़माएं!


क्या सीधे उपयोग की अनुमति है? जिस तरह से ~ पर शांत विचार। मैं भी यही सोच रहा था, लेकिन मैं वास्तव में अभी तक इसका अभ्यस्त नहीं हूं।
टेक-फ्रीक

2

05AB1E , 29 40 38 बाइट्स

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

+11 बाइट्स अंकों एक यादृच्छिक स्थिति में किया जा रहा है, जबकि अभी भी अजीब आदानों के लिए मन में नियम 3 रखते हुए ठीक करने के लिए ..
-2 के लिए धन्यवाद बाइट्स @MagicOctopusUrn , बदल रहा है îïकरने के लिए òऔर स्थिति बदलती »

यह ऑनलाइन की कोशिश करो कीकुछ और परीक्षण मामलों सत्यापित करने लिए

ओल्ड ( 29 27 बाइट्स ) का जवाब है कि अंक जहां हमेशा कोनों में रहते हैं:

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 ओपी के साथ सत्यापित है, और स्थिति वास्तव में यादृच्छिक होना चाहिए। विषम इनपुट के साथ नियम 3 के कारण +11 बाइट्स के लिए फिक्स्ड ..>।> और 3 बाइट्स को विरासत में बचाया जा सकता ïथा क्योंकि यह भी अंतर्निहित रूप से किया गया था। दुर्भाग्य से यह 40-बाइट संस्करण पर लागू नहीं होता है क्योंकि प्रतिस्थापित करने के बजाय सम्मिलित किया जाएगा।
केविन क्रूज़सेन

@MagicOctopusUrn आपने जो TIO लिंक किया है उसमें अभी भी 28 के बजाय मेरे 29 बाइट्स उत्तर हैं, क्या आपके पास सही लिंक है? के रूप में विफल करने के लिए 2, इनपुट होने की गारंटी है 3 <= N <= 26
केविन क्रूज़सेन

1
@KevinCruijssen तुम सही हो, मैं एक मूर्ख हूँ, यहाँ एक मैं बाहर काम कर रहा था: यह ऑनलाइन कोशिश करो!
मैजिक ऑक्टोपस Urn

@MagicOctopusUrn ओह, उस बैंकर गोलाई के बारे में नहीं जानते थे। यह मेरे वर्तमान उत्तर में भी एक बाइट बचाता है! : डी और सबसे पहले एक यादृच्छिक अंक जोड़ना और उसके बाद ही फेरबदल एक सुंदर स्मार्ट दृष्टिकोण है। यह सुनिश्चित नहीं है कि यह 100% मान्य है, क्योंकि आपके पास nवर्णमाला के nयादृच्छिक अक्षरों के बजाय हमेशा वर्णमाला के पहले अक्षर होंगे। और पहले न्यूलाइन्स से जुड़ना और उसके बाद ही आईना करने से बाइट के साथ-साथ खान में भी बचत होती है। -2 बाइट्स के लिए धन्यवाद! :) PS: ट्रेलिंग को हटाकर आपके बाइट में एक बाइट को बचाया जा सकता है }। :)
केविन क्रूज़सेन

2

सी (जीसीसी) , 198 197 196 बाइट्स

सेविंग के लिए 2 बाइट्स धन्यवाद।

#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

जावास्क्रिप्ट (ईएस 6), 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

पायथन 3 , 197 बाइट्स

जैसा कि @Eignign द्वारा उल्लेख किया गया है, के विषम मूल्यों के लिए काम नहीं करता है 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
एमिगा

धिक्कार है, मैंने तब ही मान लिया था, Nजब मैं विषम नहीं हूँ तो मैट्रिक्स हमेशा सममित कैसे हो सकता है!
एटेने

1
ये विषम सममित मैट्रिक्स के कुछ उदाहरण हैं।
एमिगा

ठीक है, धन्यवाद, मैंने इसे इस तरह नहीं देखा था! खैर मुझे लगता है कि मेरा उत्तर तब तक बेकार है।
13

1

पायथन 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

कम से कम एक बार फेरबदल; और फिर, यदि nविषम है, तो अंकन अंतिम कॉलम या अंतिम पंक्ति में होने पर लूपिंग रखें s


1

पायथ , 48 बाइट्स

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

इसे यहाँ ऑनलाइन देखें

कार्यक्रम 3 भागों में है - पैलिंड्रोमाइजेशन फ़ंक्शन की परिभाषा, संख्यात्मक का स्थान और मुख्य फ़ंक्शन चुनना।

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

पायथन 2 / पायथन 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:]

थोडा असहनीय:

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

पुराने, नीचे दिए गए लगभग संस्करण :

पायथन 2, पायथन 3, 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 भिन्न तत्व केवल है लगभग guarranteed।

पायथन 2 / पायथन 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, आपके पास कभी आउटपुट नहीं होगा ए 'z', इसलिए हर आउटपुट संभव नहीं है)।
चास ब्राउन

अच्छी तरह से मुझे अचार और ... आप सही हैं @ChasBrown! खैर, [: n * n] एक अलग दृष्टिकोण से शेष है और स्पष्ट रूप से यह नहीं होना चाहिए। लेकिन आप नियम तीन के बारे में सही हैं। मुझे इसे सुधारना होगा। मुझे थोड़ा दे दो।
टेक-फ्रीक

यहां आपके समाधान की कोशिश की गई , लेकिन एक इंडेक्स एरर था ... पीपीसीजी में बीटीडब्लू, ट्राईऑटलाइन यहां सुपर सुपर है! (इसके अलावा, यह समस्या मेरे विचार से पहले की तरह पेचीदा है ...)
चास ब्राउन

मैंने बिना किसी त्रुटि के इसे 10000 बार से अधिक समय तक चलाया।
टेक-फ्रीक

मिल गया। एक ':' गायब था। मैंने इसे अपनी स्क्रिप्ट से सीधे कॉपी किया, लेकिन यह खो गया होगा। यह होना चाहिए "...: -1] [एन% 2:] के लिए मैं ..." के बजाय "...: -1] [एन% 2] के लिए मैं ..."।
टेक-फ्रीक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.