एक XOR तालिका का निर्माण करें


21

परिचय

XOR एक डिजिटल लॉजिक गेट है जो किसी विशेष या को लागू करता है। ज्यादातर बार, यह दिखाया गया है ^। बाइनरी में चार संभावित परिणाम:

0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

इसे बाइनरी में जोड़ मोडुलो 2 के रूप में भी देखा जा सकता है। दशमलव में, हमें दशमलव को बाइनरी में बदलने की आवश्यकता है, 35 = 100011और 25 = 11001XOR मान की गणना करने के लिए, हम उन्हें एक दूसरे के ऊपर रखते हैं:

100011
 11001 ^
--------
111010  = 58 in decimal

कार्य : जब एक पूर्णांक मान N 1 से अधिक दिया जाता है, तो X + तालिका का आकार N + 1 के साथ आउटपुट होता है। उदाहरण के लिए, N = 5:

 0 1 2 3 4 5
 1 0 3 2 5 4
 2 3 0 1 6 7
 3 2 1 0 7 6
 4 5 6 7 0 1
 5 4 7 6 1 0

आप देख सकते हैं कि प्रत्येक संख्या के सामने एक स्थान है, क्योंकि तालिका में सबसे अधिक मात्रा में लंबाई है 1. हालांकि, अगर हम N = 9 लेते हैं, तो हमें निम्नलिखित ग्रिड मिलते हैं:

  0  1  2  3  4  5  6  7  8  9
  1  0  3  2  5  4  7  6  9  8
  2  3  0  1  6  7  4  5 10 11
  3  2  1  0  7  6  5  4 11 10
  4  5  6  7  0  1  2  3 12 13
  5  4  7  6  1  0  3  2 13 12
  6  7  4  5  2  3  0  1 14 15
  7  6  5  4  3  2  1  0 15 14
  8  9 10 11 12 13 14 15  0  1
  9  8 11 10 13 12 15 14  1  0

उच्चतम मान की लंबाई 2 है, इसलिए मान लंबाई 3 (उच्चतम लंबाई + 1) के लिए सही-संरेखित है।

नियम:

  • व्हाट्सएप को लीड करना अनिवार्य नहीं है, केवल अगर उपयोग किया जाता है (या नहीं) लगातार
  • आपको ऊपर दिखाए गए फॉर्म में एक टेबल आउटपुट करना होगा।
  • स्तंभों के बीच की गद्दी यथासंभव छोटी होनी चाहिए
  • यह , इसलिए कम से कम बाइट्स जीत के साथ सबमिशन!

कॉलम के बीच कितना पैडिंग की अनुमति है? केवल न्यूनतम संभव राशि?
मार्टिन एंडर

@ मार्टिनबटनर हां, न्यूनतम संभव राशि। मैं उस वर्णन में जोड़ दूँगा।
अदनान


उदाहरणों को देखते हुएoutput an XOR table with the size N+1
edc65

N के लिए अधिकतम मूल्य क्या है? ... (एन == 1000000 के लिए टेबल का आकार 10 टेराबाइट के पास होगा)
edc65

जवाबों:


12

MATL , 10 बाइट्स

0i2$:tXgZ~

संकलक (और विशेष रूप से इस कार्यक्रम में) अब ऑक्टेव में काम करने लगता है, हालांकि इसे अभी भी कुछ परिशोधन की आवश्यकता है। आप अस्थायी रूप से इस GitHub कमिट का उपयोग कर सकते हैं

संपादित करें (मार्च 30 '16) : इसे ऑनलाइन आज़माएं!

उदाहरण

>> matl 0i2$:tXgZ~
> 9
0  1  2  3  4  5  6  7  8  9
1  0  3  2  5  4  7  6  9  8
2  3  0  1  6  7  4  5 10 11
3  2  1  0  7  6  5  4 11 10
4  5  6  7  0  1  2  3 12 13
5  4  7  6  1  0  3  2 13 12
6  7  4  5  2  3  0  1 14 15
7  6  5  4  3  2  1  0 15 14
8  9 10 11 12 13 14 15  0  1
9  8 11 10 13 12 15 14  1  0

व्याख्या

0i2$:       % vector 0, 1, 2, ... up to input number
t           % duplicate
Xg          % nd-grid
Z~          % bitxor

ऑक्टेव में काम करने वाले कंपाइलर जल्द ही आ रहे हैं ...
लुइस मेंडू

... अच्छा, उम्मीद है। इस बारे में कोई विचार , कोई भी?
लुइस मेंडू

5
निश्चित रूप से नौकरी के लिए सही उपकरण। +1
एक स्पेगेटो

1
कुछ ट्विकिंग के बाद, कंपाइलर ऑक्टेव (4.0.0) में काम करने लगता है। मुझे और परीक्षण करने की आवश्यकता है, लेकिन मैंने जितने भी कार्यक्रम आजमाए हैं, उनमें यह एक काम है। जब मैं एक नया रिलीज़ पोस्ट करता हूं, तो यहां वर्तमान GitHub का लिंक ऑक्टेव में इस कोड को चलाने के लिए प्रतिबद्ध है। भाषा नहीं बदली है (यह अभी भी 5.0.0 जारी है), इसलिए यह इस चुनौती से पहले है
लुइस मेंडो

5

बैश + बीएसडी बर्तन, 45

eval echo \$[{0..$1}^{0..$1}]|rs -jg1 $[$1+1]

मैं एक लंबे समय के लिए एक उपयोग खोजने के लिए इंतज़ार कर रहा हूँ rs। यह अच्छा दिखता है। rsलिनक्स सिस्टम पर स्थापित करने की आवश्यकता हो सकती है। लेकिन यह ओएस एक्स पर बॉक्स के ठीक बाहर चलता है।

  • $1एन तक फैलता है, और इस तरह echo \$[{0..$1}^{0..$1}]फैलता हैecho $[{0..N}^{0..N}]
  • यह तब evalएड है:
  • ब्रेस विस्तार का विस्तार होता है $[0^0] $[0^1] $[0^2] ... $[0^N] ... $[N^N]
  • यह एक्सआर अंकगणितीय विस्तार की एक श्रृंखला है जो शब्दों की एक पंक्ति तक विस्तारित होती है
  • rs(reshape) इस पंक्ति को N + 1 पंक्तियों में बदल देता है। -jदायां औचित्य -g1देता है , और एक नाली-चौड़ाई देता है 1. यह सुनिश्चित करता है कि अंतिम आउटपुट तालिका में कॉलम के बीच न्यूनतम चौड़ाई है।

मैंने N = 1000 तक परीक्षण किया है, जिसमें 3.8 सेकंड लगे। बड़े एन सैद्धांतिक रूप से संभव है, हालांकि बैश किसी भी समय (एन + 1) usage ब्रेस विस्तार के मेमोरी उपयोग के साथ मेमोरी से बाहर चले जाएंगे।


4

सी, 114 128 152

खलीद ए खुनीफर के काम से प्रेरित, सरलीकृत अंतरिक्ष की गिनती संपादित करें

एसी फ़ंक्शन जो ऐनक का अनुसरण करता है।

T(n){int i=0,j,x=1,d=0;while(x<=n)x+=x,++d;for(;i<=n;i++)for(j=0;j<=n;j++)printf("%*d%c",d*3/10+1,i^j,j<n?32:10);}

इसे इनपुट, डिफ़ॉल्ट 9 के रूप में n डालने का प्रयास करें

कम गोल्फ वाला

T(n)
{
   int i=0, j, x=1,d=0;
   while(x<=n) x+=x,++d; // count the digits
   // each binary digit is approximately 0.3 decimal digit
   // this approximation is accurate enough for the task
   for(;i<=n;i++)
     for(j=0;j<=n;j++)
       printf("%*d%c",d*3/10+1,
              i^j,
              j < n ? 32:10); // space between columns, newline at end
}

3

जावास्क्रिप्ट (ईएस 6) 120 122

संपादित 2 बाइट्स Thx ETHproductions बचाया

एक अनाम फ़ंक्शन। नोट: तालिका में संख्या the अंकों तक सीमित है, जो कि बड़ी संख्या के लिए अनुमति देने वाली तालिका के समग्र आकार को देखते हुए उचित से अधिक है

अब मुझे लघु कॉलम आकार प्राप्त करने के लिए एक छोटा रास्ता खोजना चाहिए, जो लघुगणकों से बचता है

n=>(a=Array(n+1).fill(-~Math.log10(2<<Math.log2(n)))).map((m,i)=>a.map((z,j)=>`       ${i^j}`.slice(~m)).join``).join`
`

परीक्षा

f=n=>(a=Array(n+1).fill(-~Math.log10(2<<Math.log2(n)))).map((m,i)=>a.map((z,j)=>`       ${i^j}`.slice(~m)).join``).join`\n`

function update() {
  var v=+I.value
  O.textContent = f(v)
}  

update()
N: <input id=I type=number value=9 oninput='update()'>
<pre id=O></pre>


बहुत बढ़िया, ~mएक अतिरिक्त स्थान पर कब्जा करने के उपयोग से प्यार है। टेम्पलेट स्ट्रिंग का उपयोग करके दो बाइट्स बचा सकते हैं:(z,j)=>`(7 spaces)${i^j}`.slice(~m)
ETHproductions

@ETHproductions 1) अच्छा सुझाव, धन्यवाद 2) आपने कैसे एक ... (मैं यह भी नहीं पूछ सकता है) का प्रबंधन किया ... 2 चार्ट (96) के अंदर एक चार (96)?
edc65

अहा, आप सिर्फ कई बैकटिक्स का उपयोग करते हैं, जैसे कि: (ignore this padding) ``abc`def`` (ignore this too)इस तरह से दिखाता है:abc`def
२१

3

सी, 149 बाइट्स

int i=0,j,n,k=2;char b[256];scanf("%d",&n);while((k*=2)<=n);k^=k-1;while(i++<=n&&putchar(10))for(j=0;j<=n;j++)printf(" %*d",sprintf(b,"%d",k),i-1^j);
---------

विस्तृत

#include <stdio.h>

int main()
{
    int i=0, j, n, k=2;
    char b[256] = { 0 };

    scanf("%d", &n);

    // find max xor value in the table
    while((k*=2)<=n); k^=k-1;

    printf("> %d ~ %d", k, sprintf(b,"%d",k));

    while(i++ <= n && putchar(10))
    {
        for(j = 0; j <= n;j++)
        {
            printf(" %*d", sprintf(b,"%d",k), (i-1)^j);
        }
    }

    return 0;
}

1
आपकी जावा पोस्ट की तरह, कॉलम को सही ढंग से संरेखित करने का कोई प्रयास नहीं है। यह इस चुनौती का एकमात्र कठिन हिस्सा है। यह कोड गलत आउटपुट देता है जब इनपुट <8 या> 64.
edc65

@ edc65 मुझे पता चला कि कैसे संरेखित किया जाता है, अधिकतम xor मान 11..1इनपुट मूल्य में महत्वपूर्ण एक के लिए द्विआधारी है n, पहले 2 की निकटतम शक्ति का पता लगाकर किया जा सकता है, फिर इसे पिछली संख्या के साथ xor करें,0001 xor 1110 = 1111
Khaled.K

अच्छा है, अब आप सही रास्ते पर हैं। फिर भी, आपको अधिक परीक्षण करना चाहिए: k के साथ लूप n = 8 के लिए गलत परिणाम देता है (और आपका संक्षिप्त उत्तर स्थानीय चर i से 0 को प्रारंभ नहीं करता है)
edc65

यह सरल लूप करना चाहिए for(k=1;k<=n;)k*=2;k--;:। अब मैं देखता हूं कि मेरे सी प्रयास से बहुत कम है (मेरा प्रदर्शन बेहतर है, लेकिन इस चुनौती में प्रदर्शन कोई मायने नहीं रखता)
edc65

@ edc65 आपको बस इतना करना 2^k xor 2^k -1के लिए max{2^k<=n}या 2^k -1के लिए min{2^k>=n}। सभी पाने के लिए 11..1वहाँ में
Khaled.K

3

सी, 103 बाइट्स

Y(n){int i,j=n++;char*f="%2u";while(j/=8)++f[1];for(;j<n;++j,puts(""))for(i=0;i<n;++i)printf(f,i^j);}

1
प्रोग्रामिंग पहेलियाँ और कोड गोल्फ में आपका स्वागत है! जो मैं देख सकता हूं, आपके उत्तर के लिए, दुर्भाग्य से कई अन्य लोग यहां कॉलम संरेखण बिंदु को पूरा करने से चूक जाते हैं।
edc65

इनपुट 5 (स्तंभों के बीच बहुत अधिक स्थान) या 65 (बहुत कम)
edc65

यह 512 तक ठीक रहेगा, यहाँ आखिरी समय पर ...
Ros

3

जेली, गैर-प्रतिस्पर्धात्मक

7 बाइट्स यह उत्तर गैर-प्रतिस्पर्धात्मक है, क्योंकि यह चुनौती को स्थगित करने वाली विशेषताओं का उपयोग करता है।

0r©^'®G

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

यह काम किस प्रकार करता है

0r©^'®G  Main link. Input: n (integer)

0r       Range; yield [0, ..., n].
  ©      Save the range in the register.

     ®   Yield the range from the register.
   ^'    XOR each integer in the left argument with each integer in the right one.
      G  Grid; separate rows by newlines, columns by spaces, with a fixed width for
         all columns. Since the entries are numeric, align columns to the right.

2
आपके 1000 वें उत्तर पर बधाई :)
अदनान

3

आर, 38 बाइट्स

आमतौर पर R को आउटपुट स्वरूपित करने के लिए बहुत सारे बाइट्स की आवश्यकता होती है। इस मामले में यह बिलकुल विपरीत है। outerजो आमतौर पर दो सरणियों के बाहरी उत्पाद को संदर्भित करता है, जब आपूर्ति की जा सकती है तो वैक्टर के मार्जिन पर यह कार्य करता है। इस मामले में, हम बिटवेअर XOR फ़ंक्शन लागू करते हैं bitwXor

names(x)=x=1:scan();outer(x,x,bitwXor)

2

सीजेएम, 29 27 बाइट्स

ri:X),_ff{^s2X2b,#s,)Se[}N*

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

व्याख्या

ri      e# Read input and convert to integer.
:X      e# Store in X.
),      e# Get range [0 1 ... X].
_ff{    e# Nested map over all repeated pairs from that range...
  ^     e#   XOR.
  s     e#   Convert to string.
  2     e#   Push 2.
  X2b,  e#   Get the length of the base-2 representation of X. This is the same as getting
        e#   getting the base-2 integer logarithm and incrementing it.
  #     e#   Raise 2 to that power. This rounds X up to the next power of 2.
  s,    e#   Convert to string and get length to determine column width.
  )     e#   Increment for additional padding.
  Se[   e#   Pad string of current cell from the left with spaces.
}
N*      e# Join with linefeeds.

खैर, यह जल्दी था
अदनान

2

मठकाद, 187 बाइट्स

यहाँ छवि विवरण दर्ज करें

MathCAD आसानी से तालिकाओं में बनाया गया है - लेकिन पूरी तरह से कोई बिटवॉयर Xor नहीं है, न ही दशमलव कन्वर्टर्स को बाइनरी या बाइनरी को दशमलव। कार्यों के लिए संभव मूल्यों के माध्यम से पुनरावृति। I, a2, Xa और Xb प्लेस होल्ड करते हैं। जबकि लूप सक्रिय रूप से बाइनरी में परिवर्तित हो जाता है, और बाइनरी में कनवर्ट करते समय भी एक्सोर फ़ंक्शन (इसके चारों ओर सर्कल के साथ थोड़ा क्रॉस) करता है। यह बाइनरी नंबर को 0 और 1 के 1 से मिलकर एक बेस -10 नंबर में स्टोर करता है। यह तब सारांश फ़ंक्शन के माध्यम से एम मैट्रिक्स में संग्रहीत होने से पहले परिवर्तित हो जाता है।

इसे आसानी से नीचे गिराया जा सकता है (यदि केवल छोटे लोगों के लिए प्लेसहोल्डर्स को स्वैप करके), लेकिन मुझे लगा कि मैं इसे पोस्ट करूंगा और देखूंगा कि कोई भी बाइनरी को दशमलव कनवर्टर से नीचे कर सकता है और कुछ भी नहीं।


2

k4, 50 बाइट्स

{-1@" "/:'(-|//#:''x)$x:$2/:''~x=/:\:x:0b\:'!1+x;}

उदाहरण के लिए:

  {-1@" "/:'(-|//#:''x)$x:$2/:''~x=/:\:x:0b\:'!1+x;}9
 0  1  2  3  4  5  6  7  8  9
 1  0  3  2  5  4  7  6  9  8
 2  3  0  1  6  7  4  5 10 11
 3  2  1  0  7  6  5  4 11 10
 4  5  6  7  0  1  2  3 12 13
 5  4  7  6  1  0  3  2 13 12
 6  7  4  5  2  3  0  1 14 15
 7  6  5  4  3  2  1  0 15 14
 8  9 10 11 12 13 14 15  0  1
 9  8 11 10 13 12 15 14  1  0

2

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

import math
n=int(input())
r,p=range(n+1),print
for y in r:[p(end='%%%dd '%len(str(2**int(math.log2(n)+1)-1))%(x^y))for x in r];p()

1

गणितज्ञ, 108 बाइट्स

StringRiffle[Thread[Map[ToString,a=Array[BitXor,{#,#}+1,0],{2}]~StringPadLeft~IntegerLength@Max@a],"
"," "]&

त्रुटि की अवहेलना करें, यह Threadनहीं जानता कि यह क्या कर रहा है।


1

एमएसीएस लिस्प, 193 बाइट्स

(defun x(n)(set'a 0)(set'n(1+ n))(while(< a n)(set'b 0)(while(< b n)(princ(format(format"%%%ss "(ceiling(log(expt 2(ceiling(log n 2)))10)))(logxor a b)))(set'b(1+ b)))(set'a(1+ a))(message"")))

Ungolfed:

(defun x(n)
  (set'a 0)
  (set'n(1+ n))
  (while(< a n)
    (set'b 0)
    (while(< b n)
      (princ
        (format
          ;; some format string magic to get the length of the longest
          ;; possible string as a format string
          (format "%%%ss " (ceiling(log(expt 2(ceiling(log n 2)))10)))
          (logxor a b)))
      (set'b(1+ b)))
    (set'a(1+ a))
    ;; new line
    (message"")))

आउटपुट को *Message*बफ़र के लिए भेजा जाता है , जो कि stdoutअगर xकिसी स्क्रिप्ट के अंदर उपयोग किया जाता है तो होगा ।

(x 9)
 0  1  2  3  4  5  6  7  8  9 
 1  0  3  2  5  4  7  6  9  8 
 2  3  0  1  6  7  4  5 10 11 
 3  2  1  0  7  6  5  4 11 10 
 4  5  6  7  0  1  2  3 12 13 
 5  4  7  6  1  0  3  2 13 12 
 6  7  4  5  2  3  0  1 14 15 
 7  6  5  4  3  2  1  0 15 14 
 8  9 10 11 12 13 14 15  0  1 
 9  8 11 10 13 12 15 14  1  0

1

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

यह .format()(कुछ, नहीं बहुत) में चर-चौड़ाई पैडिंग करने का एक तरीका खोजने और इसे सही-समायोजित करने के लिए कुछ देख रहा था, लेकिन मुझे लगता है कि मुझे अब यह कल्पना करने के लिए मिल गया है। हालांकि उस चौड़ाई की गणना में अधिक गोल्फिंग का उपयोग किया जा सकता है।

N=input()+1
for i in range(N):print''.join(' {n:>{w}}'.format(w=len(`2**(len(bin(N))-2)`),n=i^r)for r in range(N))

1

कैच ऑब्जेक्टस्क्रिप्ट , 127 बाइट्स

x(n)s w=$L(2**$bitfind($factor(n),1,100,-1))+1 f i=0:1:n { w $j(i,w) } f i=1:1:n { w !,$j(i,w) f j=1:1:n { w $j($zb(i,j,6),w) } }

विस्तृत:

x(n)
 set w=$Length(2**$bitfind($factor(n),1,100,-1))+1
 for i=0:1:n {
     write $justify(i,w)
 }
 for i=1:1:n {
     write !,$justify(i,w)
     for j=1:1:n {
         write $justify($zboolean(i,j,6),w)
     }

 }

1

पाइके, 8 बाइट्स (गैर-प्रतिस्पर्धात्मक)

hD]UA.&P

स्पष्टीकरण:

         - auto-add eval_or_not_input() to the stack
h        - increment the input
 D]      - Create a list containing [inp+1, inp+1]
   U     - Create a 2d range 
    A.^  - Deeply apply the XOR function to the range
       P - print it out prettily

इसे यहाँ आज़माएँ


0

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

n=input()+1
t=range(n)
for i in t: print "%3d"*n % tuple([x^i for x in t])

3
प्रोग्रामिंग पहेलियाँ और कोड गोल्फ में आपका स्वागत है! जो मैं देख सकता हूं, आपके उत्तर के लिए, दुर्भाग्यवश यहां कई अन्य लोग, स्तंभ संरेखण बिंदु को पूरा करते हैं।
बिल्ली


0

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

अनाम VBE तत्काल विंडो फ़ंक्शन जो रेंज से इनपुट लेता है [A1]और कंसोल को आउटपुट करता है।

For y=0To[A1]:For x=0To[A1]:z=x Xor y:?Spc([Len(2^-Int(-Log(A1,2)))]-Len(z))Str(z);:Next:?:Next

0

छोटा बेसिक , 499 बाइट्स

एक स्क्रिप्ट जो TextWindowऑब्जेक्ट से इनपुट लेती है और उसी पर आउटपुट करती है

a=TextWindow.Read()
For y=0To a
For x=0To a
n=x
b()
z1=z
n=y
b()
l=Math.Max(Array.GetItemCount(z),Array.GetItemCount(z1))
o=0
For i=1To l
If z1[i]<>z[i]And(z[i]=1Or z1[i]=1)Then
z2=1
Else 
z2=0
EndIf
o=o+z2*Math.Power(2,i-1)
EndFor
TextWindow.Write(Text.GetSubText("      ",1,Text.GetLength(Math.Power(2,Math.Ceiling(Math.Log(a)/Math.Log(2))))-Text.GetLength(o))+o+" ")
EndFor
TextWindow.WriteLine("")
EndFor
Sub b
z=0
c=0  
While n>0
c=c+1
z[c]=Math.Remainder(n,2)
n=Math.Floor(n/2)
EndWhile
EndSub

SmallBasic.com पर इसे आजमाएँ। Silverlight का उपयोग करता है और इस प्रकार IE या एज में चलना चाहिए

ब्लैक कंसोल का चयन करें, फिर इनपुट पूर्णांक टाइप करें और दबाएँ Enter


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.