Z_n के लिए समूह तालिका बनाएं


9

समूह गणित में एक व्यापक रूप से उपयोग की जाने वाली संरचना है, और कंप्यूटर विज्ञान में अनुप्रयोग हैं। यह कोड चुनौती Additive समूह Z n के लिए समूह तालिका बनाने के लिए सबसे कम # वर्णों के बारे में है ।

तालिका का निर्माण कैसे किया जाता है: Z n के लिए , तत्व {0, 1, 2, ..., n-1} हैं। तालिका में n पंक्तियाँ और n स्तंभ होंगे। तालिका के ij-th प्रविष्टि के लिए, मान i + j mod n है। उदाहरण के लिए, जेड 3 में , 1-2 वीं प्रविष्टि (2 पंक्ति, 3 कॉलम यदि आप शुरुआती पंक्ति / स्तंभ को 1 के रूप में गिनते हैं) (1 + 2)% 3 = 0 (नमूना आउटपुट देखें) है।

इनपुट: एक सकारात्मक पूर्णांक, एन

आउटपुट: एक तालिका जो Z n की एक शाब्दिक प्रस्तुति है , जैसा कि ऊपर वर्णित है, और नमूना आउटपुट में नीचे दिखाया गया है। रिक्त स्थान वैकल्पिक हैं

नमूना इनपुट: 3

नमूना उत्पादन:

0 1 2
1 2 0
2 0 1

नमूना इनपुट: 5

नमूना उत्पादन:

0 1 2 3 4
1 2 3 4 0
2 3 4 0 1
3 4 0 1 2
4 0 1 2 3

3
चूंकि विभाजक वैकल्पिक है, क्या 10 से ऊपर एक इनपुट होगा?
जो राजा

@JoKing कोडगॉल्फ.स्टैकएक्सचेंज. com / questions / 35038 / पर आधारित है मुझे लगता है हां
qwr

जवाबों:


10

एपीएल (10)

(मान लिया जाए ⎕IO=0। यह ngn / apl पर डिफ़ॉल्ट रूप से काम करता है , अन्य APL को ⎕IO←0पहले की आवश्यकता होती है ।)

{⍵|∘.+⍨⍳⍵}

स्पष्टीकरण:

  • ⍳⍵: संख्या [0..⍵)
  • ∘.+⍨: एक योग तालिका बनाएँ
  • ⍵|: तालिका में संख्या mod

1
क्या आप ⊢|⍳∘.+⍳जुलाई 2014 के ngn के वर्जन में गाड़ियों को काम नहीं कर सकते थे या नहीं कर सकते थे?
lirtosiast

3

गोल्फस्क्रिप्ट (13 वर्ण)

मैं क्लाउडिया के जवाब पर आपकी टिप्पणी से समझता हूं कि पंक्ति के तत्वों के बीच व्हाट्सएप आवश्यक नहीं है। उस समझ पर:

~.,{.n\(+}@(*

ऑनलाइन डेमो

विच्छेदन:

~        Parse the input into an integer
.,       Duplicate it, turn the second into an array [0,...,n-1]
{        Loop: top of stack is the previous row
  .n\    Push a newline and a copy of the previous row
  (+     Rotate the first element to the end to get the new row
}@(*     Perform loop n-1 times

यदि व्हाट्सएप आवश्यक है, तो 20 वर्णों के लिए:

~.,{.(+}@(*]{' '*n}/

इन पर बहुत अच्छा काम!
रयान

3

पायथन 2, 66 बाइट्स

def f(n):R=range(n);exec"print''.join(map(str,R));R+=R.pop(0),;"*n

पॉपिंग और री-अपीडिंग द्वारा सूची को घुमाता है।

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

def f(n):*R,=range(n);[print(*R[i:]+R[:i])for i in R]

@ Mbomb007 के रूप में एक ही विधि का उपयोग करता है, लेकिन printएक समारोह के रूप में दुरुपयोग ।


यह *R,=एक अजीब निर्माण है ... क्या यह केवल rangeएक आउटपुट को टपल में बदलने के लिए काम करता है ?
जोनाथन फ्रीच

क्या आप पाइथन 3 कोड को समझा सकते हैं? मैंने *R
१३'१ use

@taritgoswami यह पतित unpacking है; rangeएक पुनरावृत्ति योग्य वस्तु है, जिसे कोई भी खोल सकता है और पुन: पैक कर सकता है R। यह समान होना चाहिए R=list(range(n)), पूर्व अधिक संक्षिप्त हो रहा है।
जोनाथन फ्रीच

3

05AB1E , 10 8 बाइट्स

ݨDδ+I%»

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

व्याख्या

         # Implicit input n = 3                  [3]
Ý        # Push range(0,3)                       [[0,1,2,3]]
 ¨       # Pop last element                      [[0,1,2]]
  D      # Duplicate                             [[0,1,2],[0,1,2]]
   δ     # Apply next operation double vectorized
    +    # Vectorized addition                   [[[0,1,2],[1,2,3],[2,3,4]]]
     I   # Push input                            [[[0,1,2],[1,2,3],[2,3,4]],3]
      %  # Elementwise modulo 3                  [[[0,1,2],[1,2,0],[2,0,1]]]
       » # " ".join(x) followed by newline       ["0 1 2\n1 2 0\n2 0 1\n"]
           for every x in list       

पिछला उत्तर: 10 बाइट्स

ݨDvDðý,À}

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

मेरा पहला प्रयास 05AB1E में गोल्फिंग।

पिछले उत्तर की व्याख्या

           # Implicit input n = 3                   [3]
Ý          # Push range(0,3)                        [[0,1,2,3]]
 ¨         # Pop last element.                      [[0,1,2]]
  D        # Duplicate                              [[0,1,2],[0,1,2]]
   v     } # Pop list and loop through elements     [[0,1,2]]
    D      # Duplicate                              [[0,1,2],[0,1,2]]
     ð     # Push space char                        [[0,1,2],[0,1,2], " "]
      ý    # Pop list a and push string a.join(" ") [[0,1,2],"0 1 2"]
       ,   # Print string with trailing newline     [[0,1,2]] Print: "0 1 2"
        À  # Rotate list                            [[1,2,0]]  

1
अच्छा पहला जवाब, और स्वागत है! मुझे लग रहा है कि यह छोटा हो सकता है, लेकिन यहां दो 9-बाइट विकल्प हैं:FݨN._ðý, और 05AB1E चैटݨsGDÀ})» में किसी भी प्रश्न को पूछने के लिए स्वतंत्र महसूस करें , और यदि आपने अभी तक नहीं किया है तो 05AB1E टिप पेज पर एक नज़र डालें । :)
केविन क्रूज़सेन

@ केविनक्रूजसेन धन्यवाद! ऐसा लगता है कि मैं निहित इनपुट का लाभ लेने के लिए एक रास्ता खोजना भूल गया।
विस्लोव


1

अजगर , १६

JVQXQjdJ=J+tJ]hJ

उचित व्हाट्सएप के साथ तालिका प्रिंट करता है।

./pyth.py -c "JVQXQjdJ=J+tJ]hJ" <<< 5
0 1 2 3 4
1 2 3 4 0
2 3 4 0 1
3 4 0 1 2
4 0 1 2 3

स्पष्टीकरण:

                   Automatic: Q=eval(input())
JVQ                J = range(Q)
XQ                 repeat Q times
  jdJ              print J, joined on " "
  =J               J =
    +tJ]hJ             tail(J) + [head(J)] (J[1:] + [J[-1]]])

1

जे, २०

स्टडिन से पढ़ना और एक 2 डी सरणी का उत्पादन करना (जो प्रश्न में नमूने के समान है)।

(|+/~@i.)@".}:1!:1]3

यदि एक स्ट्रिंग लेने वाला फ़ंक्शन पर्याप्त होता है, तो (|+/~@i.)@".। यदि एक पूर्णांक ले रहा है, तो एक फ़ंक्शन|+/~@i. पर्याप्त होना चाहिए।

स्पष्टीकरण: f g जे (फ़ंक्शंस एफ के लिए, जी) एक "हुक" को दर्शाता है, जो एक संयुक्त फ़ंक्शन है जो इनपुट को जी (एक यूनीरी फ़ंक्शन) और फिर इनपुट और जी के माध्यम से परिणाम के रूप में चलाता है। उत्तर घटकों |(मापांक) और के साथ एक कांटा है +/~@i.। बाद का हिस्सा "सूची-के-सूचकांकों के साथ रचित रकमों का सारणी है" ( पाइथन में i.थोड़ा सा है range)।


आपको अपना उत्तर अपडेट करना चाहिए |+/~@i., जो यहां के मानक नियमों से स्वीकार्य होना चाहिए।
जोनाह


1

अजगर 2, 67

उन दोनों को यहाँ आज़माएँ

मैं सूची बंटवारे का उपयोग सूची समय को "घुमाने" के लिए करता हूं n, इसे हर बार प्रिंट करता हूं । (68 वर्ण)

def f(n):
 l=range(n)
 for i in l:print''.join(map(str,l[i:]+l[:i]))

मैं इसे एक अजीब चाल के साथ ऊपर से कम एक वर्ण प्राप्त करने में कामयाब रहा। (67 वर्ण)

def f(n):
 l=range(n)
 for i in l:print''.join(`l[i:]+l[:i]`)[1::3]

इस विधि की तरह लगता है कि पायथन 3 में अभी भी कम है def f(n):*R,=range(n);[print(*R[i:]+R[:i])for i in R]:। मुझे नहीं लगता था कि वास्तव में फाटक बिना परनों के काम करेगा।
Sp3000


1

x86-64 मशीन कोड (लिनक्स), 80 64 बाइट्स

0000000000000000 <zn_asm>:
   0:   6a 0a                   pushq  $0xa
   2:   89 f9                   mov    %edi,%ecx
   4:   ff c9                   dec    %ecx

0000000000000006 <zn_asm.l1>:
   6:   c6 06 0a                movb   $0xa,(%rsi)
   9:   48 ff ce                dec    %rsi
   c:   89 fb                   mov    %edi,%ebx
   e:   ff cb                   dec    %ebx

0000000000000010 <zn_asm.l2>:
  10:   89 c8                   mov    %ecx,%eax
  12:   01 d8                   add    %ebx,%eax
  14:   31 d2                   xor    %edx,%edx
  16:   f7 f7                   div    %edi
  18:   89 d0                   mov    %edx,%eax

000000000000001a <zn_asm.l3>:
  1a:   31 d2                   xor    %edx,%edx
  1c:   48 f7 34 24             divq   (%rsp)
  20:   83 c2 30                add    $0x30,%edx
  23:   88 16                   mov    %dl,(%rsi)
  25:   48 ff ce                dec    %rsi
  28:   85 c0                   test   %eax,%eax
  2a:   75 ee                   jne    1a <zn_asm.l3>
  2c:   ff cb                   dec    %ebx
  2e:   85 db                   test   %ebx,%ebx
  30:   7d de                   jge    10 <zn_asm.l2>
  32:   ff c9                   dec    %ecx
  34:   85 c9                   test   %ecx,%ecx
  36:   7d ce                   jge    6 <zn_asm.l1>
  38:   58                      pop    %rax
  39:   48 89 f0                mov    %rsi,%rax
  3c:   48 ff c0                inc    %rax
  3f:   c3                      retq

मैं इस समाधान के लिए उम्मीद कर रहा था कि इस पोस्ट पर कुछ अन्य प्रस्तुतियाँ को हरा पाने में सक्षम होने के लिए बस कुछ बाइट्स कम हों। यदि मैं रजिस्टरों के 32 या 16 बिट संस्करणों में से कुछ का उपयोग करता हूं तो मैं कुछ बाइट्स को बंद कर सकता हूं।32 बिट एड्रेसिंग संस्करणों में बहुत सारे रजिस्टरों को बदलने से 16 बाइट्स बच गए।

मूल रूप से इस फ़ंक्शन को C / C ++ प्रोग्राम से बुलाया जाता है, जो n rdi से होकर गुजरा है, और rsi के माध्यम से आवंटन के लिए एक सूचक है। आरसीआई के पास जो सूचक है वह वास्तव में आवंटन के अंत से 1 बाइट है, क्योंकि तालिका पीछे की ओर बनाई गई है। इससे एक पूर्णांक को मुद्रण योग्य ASCII वर्णों में परिवर्तित करना आसान हो जाता है (कुछ संख्या x मॉड 10 लेने और ASII के परिणाम को परिवर्तित करने के लिए)।

असेंबली पर C ++ रैपर कोड और टिप्पणियों को देखने के लिए, मेरे रेपो को देखें


1

परी / जीपी , 26 बाइट्स

n->matrix(n,n,x,y,x+y-2)%n

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


किसने आरंभिक x, y को क्या कहा?
रोजलूपी

@RosLuP अभिव्यक्ति का matrix(m,n,X,Y,expr)एक mXnमैट्रिक्स उत्पन्न करता है expr, पंक्ति चर से Xजा रहा 1है mऔर स्तंभ चर से Yजा रहा 1है n
एलेफाल्फा

1

मठगोल्फ , 10 8 बाइट्स

r░y\Åo╫;

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

-2 बाइट्स जो किंग को धन्यवाद

व्याख्या

मैं 3स्पष्टीकरण के लिए उदाहरण इनपुट का उपयोग करूंगा

r          range(0, n) ([0, 1, 2])
 ░         convert to string (implicit map) (['0', '1', '2'])
  y        join array without separator to string or number ('012')
   \       swap top elements ('012', 3)
    Å      start block of length 2 (for-loop, loops 3 times ('012'))
     o     print TOS without popping
      ╫    left-rotate bits in int, list/str ('012' => '120' => '201' => '012')
       ;   discard TOS (prevents final print)

आप यह भी कर सकते हैं r░y\(Åo╫, जो लूप की संख्या 1 से कम कर देता है और लूप के बाद छोड़ देता है।



@ जोकि चालाक है! शायद आप qदोहराव को हटाने के लिए उपयोग कर सकते हैं ?
अधिकतम

मेरा मतलब था o। सबसे अच्छा हालांकि मैं यह पता लगाने सकता है जिस तरह से किया गया है कि यह । यह 10 बाइट्स भी हो सकता है, लेकिन मैं मोबाइल पर हूं।
अधिकतम

चूंकि विभाजक वैकल्पिक है 8 बाइट्स को काम करना चाहिए
जो किंग

0

सी - 96

void g(int k){int i;for(i=0;i<k*k;i++){if(i&&!(i%k))puts("\n");printf("%i ",((i/k)+(i%k))%k);}}

0

गोल्फस्क्रिप्ट, 20 अक्षर

एक बहुत ही आलसी काम।

~:j,{:x;j,{x+j%}%n}/

इसे यहां चलाएं । (पहली पंक्ति स्टड का अनुकरण करना है)।

स्पष्टीकरण :

~                     # evaluate input (turn string "5" into number 5)
:j                    # store into variable j
,                     # turn top of stack into range(top), e.g. 5 --> [0, 1, 2, 3, 4]
{...}/                # for each element in the array... 
  :x;                 # store the element into x and pop from the stack
  j,                  # put range(j) on the stack ([0, 1, 2, 3, 4] again)
  {...}%              # map the array with the following:
      x+j%            # add x and mod the resulting sum by j
  n                   # put a newline on the stack

जब कार्यक्रम समाप्त होता है, तो स्टैक में प्रत्येक एरे के साथ newlines के साथ होता है। इंटरप्रेटर आउटपुट को स्टैक पर छोड़ देता है, जो वांछित परिणाम देता है।


1
अच्छा! यद्यपि तत्वों के बीच रिक्त स्थान आवश्यक नहीं था, यह तब उपयोगी हो सकता है जब हमारे पास मूल्य के तत्व> = 10 (यानी जब n> = 11) हो।
रयान

क्या आप कृपया अपना कोड निकाल सकते हैं? मेरे लिए गोल्फ पढ़ना किसी और के रेगेक्स को पढ़ने से भी बदतर है। (लगभग =)
दोषपूर्ण

@flawr: हह यकीन है, यह काफी सीधा है
क्लोडिउ

0

CJam, 14 वर्ण

l~_)_@,*/Wf<N*

इसका परीक्षण यहां करें।

व्याख्या

यह विचार स्ट्रिंग को फिर से दोहराने के 0लिए हैN-1 , लेकिन इसे ब्लॉकों में विभाजित करता हैN+1 । यह बेमेल पंक्ति को हर बार बाईं ओर स्थानांतरित करता है। अंत में, हमें बाहरी चरित्र से छुटकारा पाने और हर चीज को नए सिरे से जोड़ने की जरूरत है।

यहां इनपुट के लिए स्टैक सामग्री के साथ, विस्फोट कोड है 3

l~              "Read and eval input."; [3]
  _             "Duplicate.";           [3 3]
   )            "Increment.";           [3 4]
    _           "Duplicate.";           [3 4 4]
     @          "Rotate.";              [4 4 3]
      ,         "Get range.";           [4 4 [0 1 2]]
       *        "Repeat.";              [4 [0 1 2 0 1 2 0 1 2 0 1 2]
        /       "Split.";               [[[0 1 2 0] [1 2 0 1] [2 0 1 2]]
         Wf<    "Truncate each line.";  [[[0 1 2] [1 2 0] [2 0 1]]
            N*  "Join with newlines.";  ["012
                                          120
                                          201"]

परिणाम कार्यक्रम के अंत में स्वचालित रूप से मुद्रित होता है। (ध्यान दें, अंतिम चरण के लिए स्टैक सामग्री तकनीकी रूप से एक मिश्रित सरणी है जिसमें संख्याएं और न्यूलाइन वर्ण हैं, न कि केवल एक स्ट्रिंग जिसमें वर्ण हैं।)

वैकल्पिक रूप से, 11 वर्ण

हाल के जोड़ के साथ ew(यह चुनौती से नया है - यह दी गई लंबाई के सभी अतिव्यापी सब्सट्रिंग लौटाता है), एक 11 बाइट्स कर सकता है:

l~,2*))ewN*

यहां बताया गया है कि यह कैसे काम करता है:

l~           "Read and eval input."; [3]
  ,          "Get range.";           [[0 1 2]]
   2*        "Repeat twice.";        [[0 1 2 0 1 2]]
     )       "Pop last.";            [[0 1 2 0 1] 2]
      )      "Increment.";           [[0 1 2 0 1] 3]
       ew    "Get substrings.";      [[[0 1 2] [1 2 0] [2 0 1]]
         N*  "Join with newlines.";  ["012
                                       120
                                       201"]

वैकल्पिक 14 बाइट्स l~_,\{_(+N\}*;:। मुझे आश्चर्य है कि अगर हम साथ बेहतर कर सकते हैं इस यद्यपि।
Sp3000

हां, लेकिन यह अनिवार्य रूप से पीटर के जवाब का एक बंदरगाह है, और मुझे लगा कि मैं एक अलग दृष्टिकोण पेश करूंगा। ewकाम कर सकते हैं लेकिन यह चुनौती से नया है।
मार्टिन एंडर


0

एक्सेल VBA, 77 बाइट्स

बेनामी VBE तत्काल विंडो फ़ंक्शन जो इनपुट लेता है, पूर्णांक के रूप में, n, रेंज से [A1]और आउटपुट से रेंज तक A2.Resize(n,n)

[A2:IU255]="=IF(MAX(ROW()-1,COLUMN())-1<$A$1,MOD(ROW()+COLUMN()-3,$A$1),"""")

0

पर्ल 6 , 23 बाइट्स

{.rotate(.all).put}o|^*

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

अनाम कोड ब्लॉक जो संख्या लेता है और रिक्त स्थान के साथ दिए गए प्रारूप में मैट्रिक्स को प्रिंट करता है। अगर हम इसके बजाय कुछ वापस कर सकते हैं, तो .putहटाया जा सकता है।

स्पष्टीकरण:

                   o|^*    # Transform the input into the range 0..input-1
{                 }        # And pass it into the function
 .rotate                   # Rotate the range by
        (.all)             # Each of the range
              .put         # And print each of them separated by spaces

0

चारकोल , 13 बाइट्स

NθEθ⪫Eθ﹪⁺ιλθ 

इसे ऑनलाइन आज़माएं! लिंक कोड के वर्बोज़ संस्करण के लिए है। नोट: अनुगामी स्थान। स्पष्टीकरण:

Nθ              Input `n` as a number into variable
   θ            `n`
  E             Map over implicit range
      θ         `n`
     E          Map over implicit range
         ι      Current row
        ⁺       Plus
          λ     Current column
       ﹪        Modulo
           θ    `n`
    ⪫           Cast row to string and join with spaces
                Implicitly print each row on its own line

0

एपीएल (एनएआरएस), 15 चार्ट, 30 बाइट्स

{⊃{⍵⌽k}¨k←0..⍵}

परीक्षा:

  f←{⊃{⍵⌽k}¨k←0..⍵}
  f 4
0 1 2 3 4
1 2 3 4 0
2 3 4 0 1
3 4 0 1 2
4 0 1 2 3
  f 3
0 1 2 3
1 2 3 0
2 3 0 1
3 0 1 2
  f 2
0 1 2
1 2 0
2 0 1
  f 1
0 1
1 0
  f 0
0 

यहाँ भाषा को कोई टिप्पणी नहीं चाहिए ...


0

जाप -R, 5 बाइट्स

ÆZéXn

कोशिश करो

यदि विभाजक के रूप में अल्पविराम का उपयोग करना मान्य नहीं है, तो बिना विभाजक के बाइट जोड़ें:

ÆZ¬éXn

कोशिश करो

या एक स्थान का उपयोग करने के लिए 2 बाइट्स:

ÆZéXn)¸

कोशिश करो


0

आर , 37 बाइट्स

sapply(x<-1:scan()-1,`+`,x)%%sum(x|1)

एक वेक्टर को 0 से n-1 तक बनाता है, और क्रमिक रूप से 1, फिर 2 ... फिर n जोड़ता है, और वेक्टर की लंबाई से मैट्रिक्स को संशोधित करता है, जो कि n है।

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


0

फोर्थ (gforth) , 53 बाइट्स

: f dup 0 do cr dup 0 do i j + over mod . loop loop ;

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

व्याख्या

नेस्टेड लूप जो हर एन नंबर्स को एक नई लाइन आउटपुट करता है

कोड स्पष्टीकरण

: f             \ start new word definition
  dup 0 do      \ set loop parameters and loop from 0 to n-1
    cr          \ output a newline
    dup 0 do    \ loop from 0 to n-1 again
      i j +     \ get the sum of the row and column number
      over mod  \ modulo with n
      .         \ print (with space)
    loop        \ end inner loop
  loop          \ end outer loop
;               \ end word definition
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.