Tạo bảng XOR


19

Giới thiệu

XOR là một cổng logic kỹ thuật số thực hiện độc quyền hoặc. Hầu hết thời gian, điều này được hiển thị như ^. Bốn kết quả có thể có trong nhị phân:

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

Điều này cũng có thể được xem như là bổ sung modulo 2 trong nhị phân. Trong phần thập phân, chúng ta cần chuyển đổi số thập phân thành nhị phân 35 = 10001125 = 11001. Để tính giá trị XOR, chúng ta đặt chúng lên nhau:

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

Tác vụ : Khi được cho một giá trị nguyên N lớn hơn 1, hãy xuất bảng XOR với kích thước N + 1. Ví dụ: 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

Bạn có thể thấy rằng có một khoảng trắng ở trước mỗi số, vì số tiền cao nhất trong bảng có độ dài 1. Tuy nhiên, nếu chúng ta lấy N = 9, chúng ta sẽ có được lưới sau:

  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

Giá trị cao nhất có chiều dài 2, vì vậy giá trị được căn phải theo chiều dài 3 (chiều dài cao nhất + 1).

Quy tắc:

  • Khoảng trắng hàng đầu là không bắt buộc, chỉ khi được sử dụng (hoặc không) một cách nhất quán
  • Bạn phải xuất một bảng theo mẫu ở trên.
  • Phần đệm giữa các cột phải càng nhỏ càng tốt
  • Đây là , vì vậy bài nộp có số byte ít nhất sẽ thắng!

Bao nhiêu phần đệm được cho phép giữa các cột? Chỉ có số lượng tối thiểu có thể?
Martin Ender

@ MartinBüttner Có, số tiền tối thiểu có thể. Tôi sẽ thêm nó vào mô tả.
Ad Nam


Nhìn vào các ví dụoutput an XOR table with the size N+1
edc65

Giá trị tối đa cho N là gì? ... (với N == 1000000 kích thước của bảng sẽ gần 10 Terabyte)
edc65

Câu trả lời:


12

MATL , 10 byte

0i2$:tXgZ~

Trình biên dịch (và đặc biệt là chương trình này) dường như hoạt động trong Octave, mặc dù nó vẫn cần một số tinh chỉnh. Bạn có thể sử dụng tạm thời cam kết GitHub này .

Chỉnh sửa (30/03/2016) : Dùng thử trực tuyến!

Thí dụ

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

Giải trình

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

Trình biên dịch làm việc tại Octave sắp ra mắt ...
Luis Mendo

... Tốt, hy vọng. Bất cứ ý tưởng về điều này , bất cứ ai?
Luis Mendo

5
Chắc chắn là công cụ phù hợp cho công việc. +1
một spaghetto

1
Sau một số điều chỉnh, trình biên dịch dường như hoạt động trong Octave (4.0.0). Tôi cần phải thử nghiệm nhiều hơn, nhưng tất cả các chương trình tôi đã thử, bao gồm cả chương trình này, đều hoạt động. Trong khi tôi đăng một bản phát hành mới, đây là một liên kết đến cam kết GitHub hiện tại để chạy mã này trong Octave. Ngôn ngữ không thay đổi (vẫn phát hành 5.0.0), vì vậy nó sớm hơn thử thách này
Luis Mendo

5

Đồ dùng Bash + BSD, 45

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

Tôi đã chờ đợi rất lâu để tìm cách sử dụng rs. Đây có vẻ là một trong những tốt. rscó thể cần phải được cài đặt trên các hệ thống Linux. Nhưng nó chạy ngay ra khỏi hộp trên OS X.

  • $1mở rộng đến N, và do đó echo \$[{0..$1}^{0..$1}]mở rộng raecho $[{0..N}^{0..N}]
  • Đây là evaled:
  • Việc mở rộng cú đúp mở rộng đến $[0^0] $[0^1] $[0^2] ... $[0^N] ... $[N^N]
  • Đây là một loạt các mở rộng số học xor mở rộng thành một dòng thuật ngữ
  • rs(định hình lại) định hình lại dòng này thành N + 1 hàng. -jbên phải biện minh và -g1cho độ rộng máng là 1. Điều này đảm bảo bảng đầu ra cuối cùng có chiều rộng tối thiểu giữa các cột.

Tôi đã thử nghiệm lên tới N = 1000, mất 3,8 giây. Về mặt lý thuyết, N lớn có thể, mặc dù bash sẽ hết bộ nhớ tại một số điểm với việc sử dụng bộ nhớ (N + 1) ² của việc mở rộng nẹp.


3

JavaScript (ES6) 120 122

Chỉnh sửa 2 byte đã lưu thx ETHproductions

Một chức năng ẩn danh. Lưu ý: số trong bảng được giới hạn ở 7 chữ số, điều này hợp lý hơn với kích thước tổng thể của bảng cho phép số lớn hơn

Bây giờ tôi nên tìm một cách ngắn hơn để có được kích thước cột tối đa, tránh logarit

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`
`

Kiểm tra

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>


Tuyệt vời, thích sử dụng ~mđể chụp thêm một không gian. Sử dụng chuỗi mẫu có thể lưu hai byte:(z,j)=>`(7 spaces)${i^j}`.slice(~m)
ETHproductions

@ETHproductions 1) đề xuất tốt, cảm ơn 2) làm thế nào bạn quản lý để đặt một ... (tôi thậm chí không thể hỏi nó) ... một char (96) trong 2 char (96)?
edc65

Aha, bạn chỉ cần sử dụng nhiều backticks, như vậy: (ignore this padding) ``abc`def`` (ignore this too)Hiển thị như thế này:abc`def
ETHproductions

3

C, 114 128 152

Chỉnh sửa đếm không gian đơn giản, lấy cảm hứng từ tác phẩm của Khaled A Khunaifer

Chức năng AC theo thông số kỹ thuật.

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

Hãy thử nó chèn n làm đầu vào, mặc định 9

Ít chơi gô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

C, 103 byte

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
Chào mừng bạn đến với Câu đố lập trình & Code Golf! Đối với những gì tôi có thể thấy, câu trả lời của bạn, không may là nhiều người khác ở đây, hoàn thành bỏ lỡ điểm căn chỉnh cột.
edc65

Hãy thử nó với đầu vào 5 (quá nhiều khoảng trống giữa các cột) hoặc 65 (quá ít)
edc65

điều này sẽ ổn vào cuối cùng cho đến 512, cuối cùng ở đây ...
Ros

3

Thạch, không cạnh tranh

7 byte Câu trả lời này không cạnh tranh, vì nó sử dụng các tính năng trì hoãn thử thách.

0r©^'®G

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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
Xin chúc mừng câu trả lời thứ 1000 của bạn :)
Adnan

3

R, 38 byte

Thông thường R yêu cầu rất nhiều byte chỉ để định dạng đầu ra. Trong trường hợp này thì hoàn toàn ngược lại. outerthường được dùng để chỉ sản phẩm bên ngoài của hai mảng, khi được cung cấp một hàm thực hiện điều này trên lề của các vectơ. Trong trường hợp này, chúng tôi áp dụng hàm XOR bitwise bitwXor.

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

2

CJam, 29 27 byte

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

Kiểm tra nó ở đây.

Giải trình

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.

Chà, nhanh thật đấy haha
Adnan

2

MathCAD, 187 byte

nhập mô tả hình ảnh ở đây

MathCAD xử lý được xây dựng trong các bảng dễ dàng - nhưng hoàn toàn không có Xor bit, cũng không chuyển đổi thập phân sang nhị phân hoặc nhị phân sang thập phân. Các hàm cho phép lặp qua các giá trị có thể. Các vị trí i, a2, Xa và Xb giữ. Vòng lặp while tích cực chuyển đổi thành nhị phân và trong khi chuyển đổi thành nhị phân cũng thực hiện chức năng xor (chữ thập nhỏ với vòng tròn xung quanh nó). Nó lưu số nhị phân trong một số cơ sở 10 bao gồm 0 và 1. Điều này sau đó được chuyển đổi trước khi được lưu trữ trong ma trận M thông qua chức năng tổng.

Điều này có thể dễ dàng được đánh xuống (nếu chỉ bằng cách đổi chỗ dành cho những người giữ chỗ ngắn hơn), nhưng tôi đoán rằng tôi sẽ đăng nó và xem liệu có ai có thể chuyển đổi nhị phân sang bộ chuyển đổi thập phân nhiều hơn bất kỳ thứ gì khác không.


2

k4, 50 byte

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

Ví dụ:

  {-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 byte

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

Chi tiết

#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
Giống như bài viết java của bạn, không có nỗ lực để căn chỉnh chính xác các cột. Đó là phần khó khăn duy nhất của thử thách này. Mã này cung cấp đầu ra sai khi đầu vào <8 hoặc> 64.
edc65

@ edc65 Tôi đã tìm ra cách căn chỉnh, giá trị xor tối đa là nhị phân 11..1với giá trị quan trọng trong giá trị đầu vào n, có thể được thực hiện bằng cách trước tiên tìm công suất gần nhất bằng 2, sau đó xor nó với số trước đó,0001 xor 1110 = 1111
Khaled.K

Tốt, bạn đang đi đúng hướng bây giờ. Tuy nhiên, bạn nên kiểm tra thêm: vòng lặp với k cho kết quả sai cho n = 8 (và câu trả lời ngắn của bạn không khởi tạo biến cục bộ i thành 0)
edc65

Vòng lặp đơn giản hơn nên làm : for(k=1;k<=n;)k*=2;k--;. Bây giờ tôi thấy nó ngắn hơn nhiều so với nỗ lực C của tôi giống nhau (của tôi tốt hơn cho hiệu suất, nhưng hiệu suất không thành vấn đề trong thử thách này)
edc65

@ edc65 bạn cần làm 2^k xor 2^k -1cho max{2^k<=n}hoặc 2^k -1cho min{2^k>=n}. để có được tất cả 11..1trong đó
Khaled.K

2

Python 3, 133 131 byte

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

Toán học, 108 byte

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

Bỏ qua lỗi, đó chỉ là Thread không biết nó đang làm gì.


1

Emacs Lisp, 193 byte

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

Ung dung:

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

Kết quả sẽ được gửi đến các *Message*bộ đệm, đó sẽ là stdoutnếu xđã được sử dụng bên trong một kịch bản.

(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

Python 2, 114 byte

Phải mất một số thời gian để tìm cách thực hiện phần đệm có chiều rộng thay đổi .format()(một số, không nhiều) và điều chỉnh nó đúng, nhưng tôi nghĩ rằng tôi đã có tất cả để xác định ngay bây giờ. Có thể sử dụng nhiều golf hơn trong tính toán chiều rộng mặc dù.

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

Đối tượng bộ nhớ cache , 127 byte

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

Chi tiết:

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

Pyke, 8 byte (không cạnh tranh)

hD]UA.&P

Giải trình:

         - 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

Hãy thử nó ở đây


0

Python 2, 77 byte

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

3
Chào mừng bạn đến với Câu đố lập trình & Code Golf! Đối với những gì tôi có thể thấy, câu trả lời của bạn, không may là nhiều người khác ở đây, hoàn thành bỏ lỡ điểm căn chỉnh cột.
mèo


0

VBA Excel, 95 byte

Chức năng cửa sổ ngay lập tức VBE ẩn danh nhận đầu vào từ phạm vi [A1]và đầu ra đến bàn điều khiển.

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

Cơ bản nhỏ , 499 byte

Một tập lệnh lấy đầu vào từ TextWindowđối tượng và đầu ra giống nhau

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

Dùng thử tại SmallBasic.com Sử dụng Silverlight và do đó phải được chạy trong IE hoặc Edge

Chọn bàn điều khiển màu đen, sau đó nhập số nguyên đầu vào và nhấn Enter.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.