XORテーブルを作成する


19

前書き

XORは、排他的論理和を実装するデジタルロジックゲートです。ほとんどの場合、これはと表示され^ます。バイナリの4つの可能な結果:

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

これは、2を法とする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であるため、各数字の前にスペースが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)。

ルール:

  • 一貫して使用される(またはされない)場合にのみ、先頭の空白は必須ではありません
  • 上記の形式でテーブルを出力する必要があります。
  • 列間のパディングはできるだけ小さくする必要があります
  • これはであるため、バイト数が最小の提出が勝ちです!

列間にどのくらいのパディングが許可されていますか?最小限の量だけですか?
マーティンエンダー

@MartinBüttnerはい、可能な最小量。これを説明に追加します。
アドナン


例を見てみるとoutput an XOR table with the size N+1
edc65

Nの最大値は?...(1000000 == Nためのテーブルのサイズは10テラバイト近くなり)
edc65

回答:


12

MATL、10バイト

0i2$:tXgZ~

コンパイラ(特にこのプログラム)はOctaveで動作するようになりましたが、まだ改良が必要です。このGitHub commitを暫定的に使用できます。

編集(16年3月30日)オンラインで試してみてください!

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

...まあ、うまくいけば。これについてのアイデアはありますか?
ルイスメンドー

5
間違いなく仕事に最適なツール。1
spaghetto

1
少し調整した後、コンパイラはOctave(4.0.0)で動作するようです。さらにテストする必要がありますが、これを含めて試したすべてのプログラムが動作します。新しいリリースを投稿している間、Octaveでこのコードを実行するための現在のGitHubコミットへのリンクがあります。それはこの挑戦よりも早くですので、言語は、(それはまだ5.0.0をリリースの)変更されていません
ルイスMendo

5

Bash + BSD utils、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}]
  • これは次にeval編集されます:
  • ブレースの拡張は $[0^0] $[0^1] $[0^2] ... $[0^N] ... $[N^N]
  • これは、1行の用語に展開される一連のxor算術展開です。
  • rs(変形)は、この行をN + 1行に変形します。 -j右詰め、および-g11本の樋幅を与え、最終的な出力テーブルは、列間の最小幅を有している保証します。

N = 1000までテストしましたが、3.8秒かかりました。大きなNは理論的には可能ですが、bashはブレース展開の(N + 1)²のメモリ使用量のある時点でメモリを使い果たします。


3

JavaScript(ES6)120 122

ETHproductionで保存された2バイトの編集

匿名関数。注:テーブル内の数字は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)どうやって...(私はそれを尋ねることさえできません)... char(96)を2 char(96)の中に入れましたか?
edc65

なるほど、あなただけそうのように、複数のバッククォートを使用します。(ignore this padding) ``abc`def`` (ignore this too)ショーを次のように:abc`def
ETHproductions

3

C、114 128 152

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までの最後でOKでしょう
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

R、38バイト

通常、Rは出力をフォーマットするためだけに多くのバイトを必要とします。この場合、まったく逆です。outerこれは通常、2つの配列の外積を指します。関数を指定すると、ベクトルの余白全体でこれを実行できます。この場合、ビット単位の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.

迅速な(笑)だったまあ、
アドナン・

2

MathCAD、187バイト

enter image description here

MathCADは組み込みテーブルを簡単に処理しますが、ビット単位のXorも、10進数から2進数への変換も、2進数から10進数への変換もまったく行いません。for関数は、可能な値を反復処理します。i、a2、Xa、およびXbプレースホールド。whileループはアクティブにバイナリに変換し、バイナリに変換するときにxor関数も実行します(その周りの円との小さなクロス)。2進数を0と1で構成される10進数で保存します。これは、合計関数を介してMマトリックスに格納される前に変換されます。

これは簡単に短縮できます(プレースホルダーを短いものに交換するだけで)。しかし、私はそれを投稿し、誰もが何よりも2進数から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のべき乗を見つけてから、前の数値とxorすることで0001 xor 1110 = 1111
調整できます

いいですね、あなたは今正しい軌道に乗っています。それでも、あなたはより多くのテストする必要があり:kのループは、n = 8のために間違った結果を与える(とあなたの短い答えは、私が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

Python 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

Mathematica、108バイト

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

エラーは無視してくださいThread。何をしているのか分からないだけです。


1

Emacs Lisp、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

Python 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

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

Python 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で実行する必要があります

黒いコンソールを選択し、入力整数を入力してを押しEnterます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.