XOR tablosu üretme


21

Giriş

XOR, özel bir veya. Çoğu zaman, bu olarak gösterilir ^. İkilide olası dört sonuç:

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

Bu ayrıca ikili dosyada modulo 2 ekleme olarak da görülebilir. Ondalık olarak, ikili ondalık dönüştürmek, gerek 35 = 100011ve 25 = 11001.To XOR değerini hesaplamak, biz birbirinin üstüne koyun:

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

Görev : 1'den büyük bir N tamsayı değeri verildiğinde, N + 1 boyutunda bir XOR tablosu çıktılayın. Örneğin, 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

Her sayının önünde bir boşluk olduğunu görebilirsiniz, çünkü tablodaki en yüksek miktar 1 uzunluğuna sahiptir. Ancak, N = 9 alırsak, aşağıdaki tabloyu alırız:

  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

En yüksek değer 2 uzunluğuna sahiptir, bu nedenle değer 3 uzunluğuna (en yüksek uzunluk + 1) sağa hizalanır.

Kurallar:

  • Öncü boşluk zorunlu değildir, yalnızca tutarlı olarak kullanılırsa (veya kullanılmazsa)
  • Yukarıda gösterilen biçimde bir tablo çıkarmalısınız.
  • Sütunlar arasındaki dolgu mümkün olduğunca küçük olmalıdır
  • Bu , yani en az bayt ile gönderme kazanır!

Sütunlar arasında ne kadar dolguya izin verilir? Sadece mümkün olan en düşük miktar?
Martin Ender

@ MartinBüttner Evet, mümkün olan en düşük miktar. Bunu açıklamaya ekleyeceğim.
Adnan


Örneklere bakınoutput an XOR table with the size N+1
edc65

N için maksimum değer nedir? ... (N == 1000000 için tablonun boyutu 10 Terabayt'a yakın olacaktır)
edc65

Yanıtlar:


12

MATL , 10 bayt

0i2$:tXgZ~

Derleyici (ve özellikle bu program) Octave'de çalışıyor gibi görünüyor, ancak yine de biraz ayrıntılandırmaya ihtiyaç duyuyor. Bu GitHub taahhüdünü geçici olarak kullanabilirsiniz .

Edit (Mar 30 '16) : Çevrimiçi deneyin!

Misal

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

açıklama

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

Octave'da çalışan derleyici çok yakında ...
Luis Mendo

... umarım. Hakkında herhangi bir fikir bu , kimse?
Luis Mendo

5
Kesinlikle iş için doğru araç. 1
Bir spaghetto

1
Biraz değişiklik yaptıktan sonra, derleyici Octave'da (4.0.0) çalışıyor gibi görünüyor. Daha fazla test yapmam gerekiyor, ancak bunu da denediğim tüm programlar çalışıyor. Yeni bir sürüm yayınlarken, mevcut GitHub'ın bu kodu Octave'de çalıştırma taahhüdünün bir bağlantısı . Dil değişmedi (hala 5.0.0 sürümü), bu yüzden bu meydan okumadan daha erken
Luis Mendo

5

Bash + BSD araçları, 45

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

Bir kullanım alanı bulmak için uzun zamandır bekliyordum rs. Bu iyi bir şey gibi görünüyor. rsLinux sistemlerine yüklenmesi gerekebilir. Ancak OS X'te kutudan çıkar çıkmaz çalışır.

  • $1N genişler ve böylece echo \$[{0..$1}^{0..$1}]genişlerecho $[{0..N}^{0..N}]
  • Bu daha sonra evaldüzenlenir:
  • Brace genişlemesi $[0^0] $[0^1] $[0^2] ... $[0^N] ... $[N^N]
  • Bu, bir terim satırına genişleyen bir dizi xor aritmetik açılımıdır
  • rs(yeniden şekillendir) bu satırı N + 1 satırlarına yeniden şekillendirir. -jsağa yaslar ve -g11 oluk genişliğini verir. Bu, son çıktı tablosunun sütunlar arasında minimum genişliğe sahip olmasını sağlar.

3.8 saniye süren N = 1000'e kadar test yaptım. Büyük N teorik olarak mümkündür, ancak küme ayracı genişlemesinin (N + 1) ² bellek kullanımı ile bash bellek tükenir.


4

C, 114128152

Düzenle Khaled A Khunaifer'in çalışmalarından ilham alan basitleştirilmiş alan sayımı

Özellikleri izleyen AC işlevi.

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

Giriş olarak n eklemeyi deneyin , varsayılan 9

Daha az 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
}

3

JavaScript (ES6) 120 122

Düzenleme 2 kaydedilen thx ETHproductions bayt

Anonim bir işlev. Not: tablodaki sayı 7 basamakla sınırlıdır, bu da bir tablonun toplam boyutu göz önüne alındığında daha büyük rakamlara izin vermek makul olandan daha fazla

Şimdi logaritmalardan kaçınarak maksimum sütun boyutunu elde etmenin daha kısa bir yolunu bulmalıyım

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

Ölçek

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>


Harika, ~mekstra bir alan yakalamak için kullanımını seviyorum . Bir şablon dizesi kullanmak iki bayt kaydedebilir:(z,j)=>`(7 spaces)${i^j}`.slice(~m)
ETHproductions

@ETHproductions 1) iyi öneri, teşekkürler 2) 2 char (96) içine bir char (96) bile ... (ben bile sormak mümkün değil) koymayı başardınız?
edc65

Aha, sadece birden fazla backticks kullanıyorsun, şöyle (ignore this padding) ``abc`def`` (ignore this too):abc`def
ETHproductions 27:15

3

C, 149 bayt

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

Detaylı

#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 postanız gibi, sütunları doğru bir şekilde hizalama denemesi yoktur. Bu zorluğun tek zor kısmı bu. Bu kod, <8 veya> 64 girişi olduğunda yanlış çıkış verir.
edc65 28:15

@ edc65 Nasıl hizalanacağımı öğrendim, maksimum xor değeri 11..1giriş değerindeki anlamlı değere ikili n, önce 2'ye en yakın gücü bularak, daha sonra bir önceki sayı ile xor olabilir.0001 xor 1110 = 1111
Khaled.K

Güzel, şimdi doğru yoldasınız. Yine de, daha fazla test etmelisiniz: k ile döngü n = 8 için yanlış sonuç verir (ve kısa cevabınız yerel değişkeni i 0'a başlatmaz)
edc65

Bu basit döngü yapmalıdır: for(k=1;k<=n;)k*=2;k--;. Şimdi bunun C girişimden çok daha kısa olduğunu görüyorum (benimki performans için daha iyi, ancak performans bu zorlukta önemli değil)
edc65

@ edc65 2^k xor 2^k -1için max{2^k<=n}veya 2^k -1için yapmanız gerekir min{2^k>=n}. tüm almak için 11..1oraya
Khaled.K

3

C, 103 bayt

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
Programlama Bulmacaları ve Kod Golf hoş geldiniz! Gördüğüm kadarıyla, cevabınız, ne yazık ki burada diğerleri gibi, sütun hizalama noktasını tamamlayın.
edc65

Giriş 5 (sütunlar arasında çok fazla boşluk) veya 65 (çok az) ile
deneyin

bu son 512'ye kadar tamam olurdu, sonunda burada ...
Ros

3

Jöle, rakipsiz

7 bayt Bu cevap yarışmayı zorlaştırır, çünkü meydan okumadan sonra gelen özellikleri kullanır.

0r©^'®G

Çevrimiçi deneyin!

Nasıl çalışır

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. cevabın için tebrikler :)
Adnan

3

R, 38 bayt

Genellikle R, çıktıyı biçimlendirmek için çok bayt gerektirir. Bu durumda tam tersi. outergenellikle iki dizinin dış ürününe atıfta bulunur, bir fonksiyon sağlandığında bunu vektörlerin kenar boşluklarında gerçekleştirebilir. Bu durumda, bitsel XOR fonksiyonunu uygularız bitwXor.

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

2

CJam, 29 27 bayt

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

Burada test edin.

açıklama

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.

Bu hızlıydı haha
Adnan

2

MathCAD, 187 Bayt

enter image description here

MathCAD kolayca tablolar içinde işlemek - ama kesinlikle hiçbir bitwise Xor, ne de ondalık ikili veya ikili veya ondalık dönüştürücüler. For işlevleri olası değerler üzerinden yinelenir. İ, a2, Xa ve Xb yeri tutulur. While döngüsü aktif olarak binary'ye dönüştürülür ve binary'ye dönüştürülürken xor işlevini de (etrafında daire bulunan küçük çarpı) gerçekleştirir. İkili sayıyı 0 ve 1'lerden oluşan bir baz-10 sayısında saklar. Bu daha sonra toplama fonksiyonu aracılığıyla M matrisinde depolanmadan önce dönüştürülür.

Bu kolayca golf olabilir (sadece daha kısa olanlar için yer tutucular takas eğer), ama ben bunu yayınlamak ve herhangi bir şey daha ondalık dönüştürücü ikili aşağı golf olup olmadığını görmek düşündüm.


2

k4, 50 bayt

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

Örneğin:

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

Python 3, 133131 bayt

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

Mathematica, 108 bayt

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

Hatayı dikkate almayın, sadece Threadne yaptığını bilmiyor.


1

Emacs Lisp, 193 bayt

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

Çıkış gönderilir *Message*olacaktır tampon, stdouteğer xbir komut içinde kullanılacak edildi.

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

Değişken genişlikte dolgu yapmak için bazı yollar bulmak için biraz zaman aldı .format()(bazıları değil, çok fazla) ve doğru ayarlanmış olsun, ama şimdi her şeye göre hazırlandığımı düşünüyorum. Bu genişlik hesaplamasında daha fazla golf kullanabilirsiniz.

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 bayt

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

Detaylı:

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 bayt (rakip olmayan)

hD]UA.&P

Açıklama:

         - 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

Burada deneyin


0

Python 2, 77 bayt

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

3
Programlama Bulmacaları ve Kod Golf hoş geldiniz! Gördüğüm kadarıyla, cevabınız, ne yazık ki burada diğerleri gibi, tamamlama sütun hizalama noktasını kaçırıyor.
kedi


0

Excel VBA, 95 bayt

Aralıktan [A1]ve çıkıştan konsola giriş alan anonim VBE anında pencere işlevi .

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

Küçük Temel , 499 bayt

Nesneden girdi alan TextWindowve aynı çıktıyı çıkaran bir betik

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'da deneyin Silverlight kullanır ve bu nedenle IE veya Edge'de çalıştırılmalıdır

Siyah konsolu seçin, ardından input integer yazın ve tuşuna basın Enter.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.