Menghasilkan tabel XOR

19

pengantar

XOR adalah gerbang logika digital yang mengimplementasikan atau. Sebagian besar waktu, ini ditampilkan sebagai ^. Empat kemungkinan hasil dalam biner:

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

Ini juga bisa dilihat sebagai penambahan modulo 2 dalam biner. Dalam desimal, kita perlu mengkonversi desimal menjadi biner, 35 = 100011dan 25 = 11001.Untuk menghitung nilai XOR, kita menempatkannya di atas satu sama lain:

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

Tugas : Ketika diberi nilai integer N lebih besar dari 1, output tabel XOR dengan ukuran N + 1. Misalnya, 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

Anda dapat melihat bahwa ada satu ruang di depan setiap angka, karena jumlah tertinggi dalam tabel memiliki panjang 1. Namun, jika kita mengambil N = 9, kita mendapatkan kotak berikut:

  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

Nilai tertinggi memiliki panjang 2, sehingga nilainya lurus ke panjang 3 (panjang tertinggi + 1).

Aturan:

  • Ruang putih terkemuka tidak wajib, hanya jika digunakan (atau tidak) secara konsisten
  • Anda harus menampilkan tabel dalam bentuk yang ditunjukkan di atas.
  • Padding antar kolom harus sekecil mungkin
  • Ini adalah , jadi pengiriman dengan jumlah byte paling sedikit menang!
Adnan
sumber
Berapa banyak bantalan yang diperbolehkan di antara kolom? Hanya jumlah minimal yang mungkin?
Martin Ender
@ MartinBüttner Ya, jumlah seminimal mungkin. Saya akan menambahkannya ke deskripsi.
Adnan
Melihat contoh-contohoutput an XOR table with the size N+1
edc65
Berapa nilai maksimal untuk N? ... (untuk N == 1000000 ukuran meja akan mendekati 10 Terabyte)
edc65

Jawaban:

12

MATL , 10 byte

0i2$:tXgZ~

Compiler (dan khususnya program ini) sekarang tampaknya berfungsi di Octave, walaupun masih perlu beberapa perbaikan. Anda dapat menggunakan komit GitHub untuk sementara waktu .

Sunting (30 Mar '16) : Cobalah online!

Contoh

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

Penjelasan

0i2$:       % vector 0, 1, 2, ... up to input number
t           % duplicate
Xg          % nd-grid
Z~          % bitxor
Luis Mendo
sumber
Kompiler yang bekerja di Octave segera hadir ...
Luis Mendo
... yah, semoga. Ada yang tahu tentang ini , siapa pun?
Luis Mendo
5
Jelas alat yang tepat untuk pekerjaan itu. +1
spaghetto
1
Setelah beberapa penyesuaian, kompiler tampaknya berfungsi di Octave (4.0.0). Saya perlu melakukan lebih banyak pengujian, tetapi semua program yang saya coba, termasuk yang ini, berfungsi. Sementara saya memposting rilis baru, berikut ini tautan ke GitHub saat ini yang berkomitmen untuk menjalankan kode ini dalam Oktaf. Bahasa belum berubah (masih rilis 5.0.0), jadi ini lebih awal dari tantangan ini
Luis Mendo
5

Utilitas Bash + BSD, 45

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

Saya sudah menunggu lama untuk menemukan gunanya rs. Ini sepertinya bagus. rsmungkin perlu diinstal pada sistem Linux. Tapi itu berjalan di luar kotak pada OS X.

  • $1mengembang ke N, dan dengan demikian echo \$[{0..$1}^{0..$1}]mengembang keecho $[{0..N}^{0..N}]
  • Ini kemudian evaldiedit:
  • Ekspansi brace diperluas ke $[0^0] $[0^1] $[0^2] ... $[0^N] ... $[N^N]
  • Ini adalah serangkaian ekspansi aritmatika xor yang berkembang ke satu baris istilah
  • rs(membentuk kembali) membentuk kembali baris ini ke baris N +1. -jmembenarkan kanan, dan -g1memberikan lebar selokan 1. Ini memastikan tabel hasil akhir memiliki lebar minimal antara kolom.

Saya telah menguji hingga N = 1000, yang membutuhkan 3,8 detik. Besar N secara teori dimungkinkan, meskipun bash akan kehabisan memori di beberapa titik dengan penggunaan memori (N + 1) ² dari ekspansi brace.

Trauma Digital
sumber
3

JavaScript (ES6) 120 122

Edit 2 byte disimpan thx ETHproduk

Fungsi anonim. Catatan: angka dalam tabel dibatasi hingga 7 digit, itu lebih dari wajar mengingat ukuran keseluruhan tabel memungkinkan angka yang lebih besar

Sekarang saya harus menemukan cara yang lebih pendek untuk mendapatkan ukuran kolom maks, menghindari logaritma

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

Uji

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>

edc65
sumber
Luar biasa, suka digunakan ~muntuk menangkap ruang ekstra. Menggunakan string template dapat menyimpan dua byte:(z,j)=>`(7 spaces)${i^j}`.slice(~m)
ETHproduksi
@ ETHproductions 1) saran bagus, terima kasih 2) bagaimana Anda mengatur untuk menempatkan ... (Saya bahkan tidak bisa bertanya) ... char (96) di dalam 2 char (96)?
edc65
Aha, Anda hanya menggunakan beberapa backticks, (ignore this padding) ``abc`def`` (ignore this too)seperti ini: abc`def
Tampil
3

C, 114 128 152

Edit penghitungan ruang yang disederhanakan, terinspirasi oleh karya Khaled A Khunaifer

Fungsi AC yang mengikuti spesifikasi.

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

Coba masukkan n sebagai input, default 9

Kurang golf

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
}
edc65
sumber
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);}
Ros
sumber
1
Selamat Datang di Programming Puzzles & Code Golf! Untuk apa yang bisa saya lihat, jawaban Anda, seperti sayangnya banyak orang lain di sini, benar-benar kehilangan titik penyelarasan kolom.
edc65
Cobalah dengan input 5 (terlalu banyak ruang antar kolom) atau 65 (terlalu sedikit)
edc65
ini akan baik-baik saja pada akhirnya sampai 512, akhirnya di sini ...
Ros
3

Jelly, tidak bersaing

7 byte Jawaban ini tidak bersaing, karena menggunakan fitur yang mengeposkan tantangan.

0r©^'®G

Cobalah online!

Bagaimana itu bekerja

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.
Dennis
sumber
2
Selamat atas jawaban 1000 Anda :)
Adnan
3

R, 38 byte

Biasanya R membutuhkan banyak byte hanya untuk memformat output. Dalam hal ini justru sebaliknya. outeryang biasanya mengacu pada produk luar dari dua array, dapat ketika disediakan fungsi melakukan ini melintasi margin vektor. Dalam hal ini, kami menerapkan fungsi XOR bitwise bitwXor.

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

CJam, 29 27 byte

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

Uji di sini.

Penjelasan

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.
Martin Ender
sumber
Ya, itu tadi cepat haha
Adnan
2

MathCAD, 187 Bytes

masukkan deskripsi gambar di sini

MathCAD menangani built in tables dengan mudah - tetapi sama sekali tidak memiliki bitwise Xor, atau decimal ke biner atau biner ke decimal converter. Untuk fungsi iterate melalui nilai yang mungkin. Tempat i, a2, Xa dan Xb ditahan. Loop sementara aktif mengkonversi ke biner, dan saat mengkonversi ke biner juga melakukan fungsi xor (salib kecil dengan lingkaran di sekitarnya). Ini menyimpan nomor biner dalam basis-10 nomor yang terdiri dari 0 dan 1. Ini kemudian dikonversi sebelum disimpan dalam matriks M melalui fungsi penjumlahan.

Ini dapat dengan mudah diturunkan (jika hanya dengan menukar placeholder untuk yang lebih pendek), tapi saya pikir saya akan mempostingnya dan melihat apakah ada yang bisa bermain golf di biner ke desimal konverter lebih dari apa pun.

Menandai
sumber
2

k4, 50 byte

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

Misalnya:

  {-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
Aaron Davies
sumber
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);
---------

Terperinci

#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;
}
Khaled.K
sumber
1
Sama seperti pos java Anda, tidak ada upaya untuk menyelaraskan kolom dengan benar. Itulah satu - satunya bagian yang sulit dari tantangan ini. Kode ini memberikan output yang salah ketika input <8 atau> 64.
edc65
@ edc65 Saya menemukan cara untuk menyelaraskan, nilai xor max adalah biner 11..1dengan yang signifikan pada nilai input n, dapat dilakukan dengan terlebih dahulu menemukan kekuatan terdekat 2, kemudian xor dengan nomor sebelumnya,0001 xor 1110 = 1111
Khaled.K
Bagus, Anda berada di jalur yang benar sekarang. Namun, Anda harus menguji lebih banyak: loop dengan k memberikan hasil yang salah untuk n = 8 (dan jawaban singkat Anda tidak menginisialisasi variabel lokal i ke 0)
edc65
Lingkaran sederhana ini harus dilakukan: for(k=1;k<=n;)k*=2;k--;. Sekarang saya melihat bahwa ini jauh lebih pendek daripada upaya C saya untuk hal yang sama (milik saya lebih baik untuk kinerja, tetapi kinerja tidak masalah dalam tantangan ini)
edc65
@ edc65 yang perlu Anda lakukan 2^k xor 2^k -1untuk max{2^k<=n}atau 2^k -1untuk min{2^k>=n}. untuk mendapatkan semuanya 11..1di sana
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()
Cyoce
sumber
1

Mathematica, 108 byte

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

Abaikan kesalahan, hanya saja Threadtidak tahu apa yang dilakukannya.

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

Tidak Disatukan:

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

Output dikirim ke *Message*buffer, yang stdoutjika xdigunakan di dalam skrip.

(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
Tuan Yuuma
sumber
1

Python 2, 114 byte

Butuh beberapa mencari untuk menemukan cara untuk melakukan padding lebar variabel dalam .format()(beberapa, tidak banyak) dan membuatnya benar-disesuaikan, tapi saya pikir saya punya semuanya untuk spec sekarang. Bisa menggunakan lebih banyak golf dalam perhitungan lebar itu.

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))
Sherlock9
sumber
1

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

Terperinci:

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

 }
adaptun
sumber
1

Pyke, 8 byte (tidak bersaing)

hD]UA.&P

Penjelasan:

         - 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

Coba di sini

Biru
sumber
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])
pbochniak
sumber
3
Selamat Datang di Programming Puzzles & Code Golf! Untuk apa yang bisa saya lihat, jawaban Anda, sayangnya banyak orang lain di sini, benar-benar kehilangan titik penyelarasan kolom.
kucing
0

Excel VBA, 95 byte

Fungsi jendela langsung VBE anonim yang mengambil input dari jangkauan [A1]dan keluaran ke konsol.

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
Taylor Scott
sumber
0

Basic Kecil , 499 byte

Sebuah skrip yang mengambil input dari TextWindowobjek dan hasilnya sama

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

Cobalah di SmallBasic.com Menggunakan Silverlight dan karenanya harus dijalankan di IE atau Edge

Pilih konsol hitam, lalu ketik bilangan masukan dan tekan Enter.

Taylor Scott
sumber