XOR 테이블 생성


19

소개

XOR은 배타적 논리합을 구현하는 디지털 논리 게이트입니다. 대부분의 경우 이것은로 표시됩니다 ^. 바이너리로 가능한 4 가지 결과 :

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

이것은 또한 이진수로 모듈로 2를 더한 것으로 볼 수 있습니다. 소수, 우리는 이진 소수점 변환 할 필요가 35 = 10001125 = 11001.TO XOR 값을 계산, 우리는 서로의 상단에 그들을 배치 :

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

태스크 : 1보다 큰 정수 값 N이 제공되면 크기가 N + 1 인 XOR 테이블을 출력하십시오 (예 : 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)에 오른쪽 정렬됩니다.

규칙 :

  • 선행 공백은 필수적으로 사용되지 않거나 일관성있게 사용되는 경우에만 필수입니다.
  • 위에 표시된 형식으로 테이블을 출력해야합니다.
  • 열 사이의 패딩은 가능한 한 작아야합니다
  • 이것은 이므로 바이트 수가 가장 적은 제출이 승리합니다!

열 사이에 얼마나 많은 패딩이 허용됩니까? 가능한 최소 금액 만?
Martin Ender

@ MartinBüttner 네, 가능한 최소한의 금액입니다. 설명에 추가하겠습니다.
Adnan


예보기output an XOR table with the size N+1
edc65

N의 최대 값은 얼마입니까? ... (N == 1000000의 경우 테이블 크기는 10 테라 바이트에
가까움

답변:


12

MATL , 10 바이트

0i2$:tXgZ~

컴파일러 (특히이 프로그램)는 이제 옥타브에서 작동하는 것처럼 보이지만 여전히 약간의 수정이 필요합니다. 이 GitHub 커밋을 임시로 사용할 수 있습니다 .

편집 (Mar 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

옥타브의 컴파일러 작업은 ... 곧
루이스 Mendo

글쎄요. 이것 에 대한 아이디어가 있습니까?
Luis Mendo

5
작업에 꼭 맞는 도구입니다. +1
스파게티

1
약간의 조정 후 컴파일러는 Octave (4.0.0)에서 작동하는 것 같습니다. 더 많은 테스트를 수행해야하지만이 프로그램을 포함하여 시도한 모든 프로그램이 작동합니다. 새 릴리스를 게시하는 동안 Octave에서이 코드를 실행 하기위한 현재 GitHub 커밋 에 대한 링크가 있습니다 . 언어는 변경되지 않았으며 (여전히 5.0.0 릴리스)이 도전보다 더
빠릅니다.

5

배쉬 + BSD 유틸리티, 45

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

에 대한 사용을 찾기 위해 오랜 시간을 기다렸습니다 rs. 이것은 좋은 것 같습니다. rsLinux 시스템에 설치해야 할 수도 있습니다. 그러나 그것은 OS X에서 즉시 실행됩니다.

  • $1N으로 echo \$[{0..$1}^{0..$1}]확장되어echo $[{0..N}^{0..N}]
  • 그런 다음 evaled :
  • 가새 확장은 $[0^0] $[0^1] $[0^2] ... $[0^N] ... $[N^N]
  • 이것은 한 줄의 용어로 확장되는 일련의 xor 산술 확장입니다.
  • rs(줄 바꿈)이 줄을 N + 1 행으로 바꿉니다. -j오른쪽 정렬 및 -g1여백 너비 1을 제공합니다. 이렇게하면 최종 출력 테이블의 열 너비가 최소가됩니다.

나는 N = 1000까지 테스트했으며 3.8 초가 걸렸습니다. 이론적으로 큰 N이 가능하지만 괄호 확장의 (N + 1) ² 메모리 사용으로 bash에서 메모리 부족이 발생합니다.


3

자바 스크립트 (ES6) 120 122

저장된 2 바이트 ETH 프로덕션 편집

익명의 기능. 참고 : 표의 숫자는 7 자리로 제한됩니다. 즉, 표의 전체 크기를 고려하면 더 큰 숫자를 사용할 수 있습니다.

이제 로그를 피하면서 최대 열 크기를 얻는 더 짧은 방법을 찾아야합니다.

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추가 공간을 확보하기 위해 사용하는 것이 좋습니다. 템플릿 문자열을 사용하면 2 바이트를 절약 할 수 있습니다.(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
ETHproductions

3

C, 114128152

Khaled A Khunaifer의 작업에서 영감을 얻은 단순화 된 공간 계산 편집

사양을 따르는 AC 기능.

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

입력으로 n을 삽입 하십시오 . 기본값은 9입니다.

덜 골프

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

C, 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 번째 답변에 축하드립니다 :)
Adnan

3

R, 38 바이트

일반적으로 R은 출력 형식을 지정하기 위해 많은 바이트를 필요로합니다. 이 경우에는 정반대입니다. outer이것은 일반적으로 두 배열의 외부 곱을 의미하며, 함수가 제공되면 벡터의 여백에 걸쳐 이것을 수행 할 수 있습니다. 이 경우 비트 XOR 함수를 적용합니다 bitwXor.

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

2

CJam, 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.

글쎄, 그것은 빠르다
Adnan

2

MathCAD, 187 바이트

enter image description here

MathCAD는 내장 된 테이블을 쉽게 처리하지만 비트 Xor 또는 10 진수를 2 진수로 또는 2 진수를 10 진수로 변환하는 변환기는 전혀 없습니다. for 함수는 가능한 값을 반복합니다. i, a2, Xa 및 Xb 자리가 유지됩니다. while 루프는 적극적으로 이진으로 변환하고 이진으로 변환하는 동안 xor 기능도 수행합니다 (주변의 작은 십자형). 이진수를 0과 1로 구성된 10 진수로 저장합니다. 그런 다음 합산 함수를 통해 M 행렬에 저장되기 전에 변환됩니다.

자리 표시자를 더 짧은 자리 표시 자로 바꾸면 쉽게 골프를 밟을 수 있지만 게시하고 다른 사람보다 이진수를 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

C, 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
Java 게시물과 마찬가지로 열을 올바르게 정렬하려고 시도하지 않습니다. 그것은 이 도전 에서 유일하게 어려운 부분 입니다. 이 코드는 입력 <8 또는> 64 일 때 잘못된 출력을 제공합니다.
edc65

@ edc65 정렬 방법을 찾았습니다. 최대 xor 값은 11..1입력 값에서 중요한 값과 2 진입니다. n먼저 2의 가장 가까운 거듭 제곱을 찾은 다음 이전 숫자와 0001 xor 1110 = 1111
곱하여 계산할

좋습니다, 당신은 지금 올바른 길을 가고 있습니다. 아직도, 당신은 더 테스트해야합니다 : k 루프는 n = 8에 대한 잘못된 결과를 제공합니다 (짧은 대답은 로컬 변수 i를 0으로 초기화하지 않습니다)
edc65

이 간단한 루프는 다음을 수행해야합니다 for(k=1;k<=n;)k*=2;k--;.. 이제는 C 시도보다 훨씬 짧다는 것을 알았습니다 (광산은 성능에 더 좋지만이 도전에서는 성능에 중요하지 않습니다)
edc65

@ edc65 당신은 할 필요 2^k xor 2^k -1를 위해 max{2^k<=n}또는 2^k -1위해 min{2^k>=n}. 모두를 얻을 11..1거기에
Khaled.K

2

파이썬 3, 133131 바이트

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

언 골프 드 :

(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

Caché ObjectScript , 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

Excel VBA, 95 바이트

범위에서 입력 [A1]을 받아 콘솔로 출력하는 익명의 VBE 즉시 창 기능 .

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 또는 Edge에서 실행해야합니다.

검은 색 콘솔을 선택한 다음 input integer를 입력하고을 누릅니다 Enter.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.