Produziere eine XOR-Tabelle


19

Einführung

XOR ist ein digitales Logikgatter, das ein exklusives oder implementiert. Meistens wird dies als angezeigt ^. Die vier möglichen Ergebnisse in binärer Form:

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

Dies kann auch als Addition modulo 2 in binär angesehen werden. In dezimal, müssen wir das Dezimalsystem um binäre, konvertieren 35 = 100011und 25 = 11001.Um berechnen den XOR Wert legen wir sie auf der jeweils anderen:

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

Die Aufgabe : Wenn ein ganzzahliger Wert N größer als 1 ist, wird eine XOR-Tabelle mit der Größe N + 1 ausgegeben. Beispiel: 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

Sie können sehen, dass vor jeder Zahl ein Leerzeichen steht, da der höchste Betrag in der Tabelle die Länge 1 hat. Wenn wir jedoch N = 9 nehmen, erhalten wir das folgende Raster:

  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

Der höchste Wert hat die Länge 2, daher ist der Wert rechtsbündig mit der Länge 3 (höchste Länge + 1).

Regeln:

  • Führende Leerzeichen sind nicht obligatorisch, nur wenn sie konsistent verwendet werden (oder nicht)
  • Sie müssen eine Tabelle in der oben gezeigten Form ausgeben.
  • Der Abstand zwischen den Spalten sollte so gering wie möglich sein
  • Das ist , also gewinnt die Einsendung mit der geringsten Anzahl von Bytes!

Wie viel Abstand ist zwischen den Spalten zulässig? Nur die minimal mögliche Menge?
Martin Ender

@ MartinBüttner Ja, die minimal mögliche Menge. Ich werde das der Beschreibung hinzufügen.
Adnan


Betrachtet man die Beispieleoutput an XOR table with the size N+1
edc65

Was ist der Maximalwert für N? ... (für N == 1000000 wäre die Größe der Tabelle in der Nähe von 10 Terabyte)
edc65

Antworten:


12

MATL , 10 Bytes

0i2$:tXgZ~

Der Compiler (und insbesondere dieses Programm) scheint jetzt in Octave zu funktionieren, obwohl noch einige Verbesserungen erforderlich sind. Sie können dieses GitHub-Commit vorläufig verwenden .

Bearbeiten (30. März 16) : Online ausprobieren!

Beispiel

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

Erläuterung

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

Compiler arbeitet in Kürze in Octave ...
Luis Mendo

... hoffentlich. Irgendeine Idee dazu ?
Luis Mendo

5
Auf jeden Fall das richtige Werkzeug für den Job. +1
ein Spaghetto

1
Nach einigen Optimierungen scheint der Compiler in Octave (4.0.0) zu funktionieren. Ich muss noch mehr Tests durchführen, aber alle Programme, die ich ausprobiert habe, einschließlich dieses, funktionieren. Während ich eine neue Version veröffentliche, ist hier ein Link zum aktuellen GitHub-Commit , um diesen Code in Octave auszuführen. Die Sprache hat sich nicht geändert (es ist immer noch Version 5.0.0), also ist es früher als diese Herausforderung
Luis Mendo

5

Bash + BSD-Utensilien, 45

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

Ich habe lange darauf gewartet, eine Verwendung für zu finden rs. Das scheint gut zu sein. rsmuss möglicherweise auf Linux-Systemen installiert werden. Unter OS X läuft es jedoch sofort.

  • $1expandiert zu N und echo \$[{0..$1}^{0..$1}]expandiert somit zuecho $[{0..N}^{0..N}]
  • Dies ist dann evaled:
  • Die Klammererweiterung wird auf erweitert $[0^0] $[0^1] $[0^2] ... $[0^N] ... $[N^N]
  • Dies ist eine Reihe von xor-arithmetischen Erweiterungen, die sich zu einer Zeile von Begriffen erweitern
  • rs(umformen) formt diese Linie in N + 1 Zeilen um. -jright rechtfertigt und -g1gibt eine Bundbreite von 1 an. Dadurch wird sichergestellt, dass die endgültige Ausgabetabelle nur eine minimale Breite zwischen den Spalten aufweist.

Ich habe bis zu N = 1000 getestet, was 3,8 Sekunden gedauert hat. Ein großes N ist theoretisch möglich, obwohl bash irgendwann nicht mehr genügend Arbeitsspeicher hat, wenn (N + 1) ² Speicher der geschweiften Klammer verwendet wird.


3

JavaScript (ES6) 120 122

Bearbeite 2 Bytes, die dank ETHproductions gespeichert wurden

Eine anonyme Funktion. Hinweis: Die Zahl in der Tabelle ist auf 7 Stellen begrenzt, was angesichts der Gesamtgröße einer Tabelle, die größere Zahlen zulässt, mehr als angemessen ist

Jetzt sollte ich einen kürzeren Weg finden, um die maximale Spaltengröße zu erhalten und Logarithmen zu vermeiden

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

Prüfung

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>


Genial, liebe die Verwendung ~m, um einen zusätzlichen Raum einzufangen. Durch die Verwendung eines Template-Strings können zwei Bytes gespart werden:(z,j)=>`(7 spaces)${i^j}`.slice(~m)
ETHproductions

@ETHproductions 1) guter Vorschlag, danke 2) wie haben Sie es geschafft, ein ... (ich kann es nicht einmal fragen) ... Zeichen (96) in 2 Zeichen (96) zu setzen?
edc65

Aha, du verwendest einfach mehrere Backticks, wie folgt: Erscheint so (ignore this padding) ``abc`def`` (ignore this too):abc`def
ETHproductions

3

C 114 128 152

Bearbeiten Vereinfachtes Zählen des Platzes, inspiriert von der Arbeit von Khaled A Khunaifer

AC-Funktion, die den Spezifikationen folgt.

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

Versuchen Sie , n als Eingabe einzufügen, Standard 9

Weniger golfen

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 Bytes

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
Willkommen bei Programming Puzzles & Code Golf! Für das, was ich sehen kann, verfehlt Ihre Antwort, wie leider viele andere hier, den Spaltenausrichtungspunkt vollständig.
edc65

Versuchen Sie es mit Eingabe 5 (zu viel Platz zwischen den Spalten) oder 65 (zu wenig)
edc65

Dies wäre endlich in Ordnung, bis 512, endlich hier ...
Ros

3

Gelee, nicht konkurrierend

7 Bytes Diese Antwort ist nicht konkurrierend, da sie Funktionen verwendet, die die Herausforderung nachholen.

0r©^'®G

Probieren Sie es online!

Wie es funktioniert

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
Herzlichen Glückwunsch zu Ihrer 1000. Antwort :)
Adnan

3

R, 38 Bytes

Normalerweise benötigt R viele Bytes, um die Ausgabe zu formatieren. In diesem Fall ist es genau umgekehrt. outerDies bezieht sich normalerweise auf das äußere Produkt von zwei Arrays. Wenn eine Funktion geliefert wird, kann sie dies über die Ränder der Vektoren hinweg ausführen. In diesem Fall wenden wir die bitweise XOR-Funktion an bitwXor.

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

2

CJam, 29 27 Bytes

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

Teste es hier.

Erläuterung

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.

Nun, das war schnell haha
Adnan

2

MathCAD, 187 Bytes

Bildbeschreibung hier eingeben

In MathCAD lassen sich problemlos Tabellen erstellen - es gibt jedoch absolut kein bitweises Xor, keine Konverter von Dezimal zu Binär oder von Binär zu Dezimal. Die for-Funktionen durchlaufen die möglichen Werte. Die Plätze i, a2, Xa und Xb gelten. Die while-Schleife wandelt sich aktiv in binär um und führt beim Umwandeln in binär auch die xor-Funktion aus (das kleine Kreuz mit dem Kreis darum). Es speichert die Binärzahl in einer Basis-10-Zahl, die aus Nullen und Einsen besteht. Diese wird dann konvertiert, bevor sie über die Summationsfunktion in der M-Matrix gespeichert wird.

Dies kann leicht heruntergespielt werden (wenn auch nur durch Austauschen der Platzhalter gegen kürzere), aber ich dachte, ich würde es veröffentlichen und sehen, ob jemand mehr als alles andere den Binär-zu-Dezimal-Konverter heruntergolfen kann.


2

k4, 50 Bytes

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

Z.B:

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

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

Detailliert

#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
Genau wie in Ihrem Java-Beitrag wird nicht versucht, die Spalten korrekt auszurichten. Das ist der einzige schwierige Teil dieser Herausforderung. Dieser Code gibt eine falsche Ausgabe aus, wenn <8 oder> 64
eingegeben werden

@ edc65 Ich habe herausgefunden, wie man ausrichtet. Der maximale xor-Wert ist binär 11..1zu dem signifikanten Wert im Eingabewert n. Er kann durchgeführt werden, indem zuerst die nächste Potenz von 2 ermittelt wird und dann mit der vorherigen Zahl xor.0001 xor 1110 = 1111
Khaled.K

Gut, Sie sind jetzt auf dem richtigen Weg. Dennoch sollten Sie mehr testen: Die Schleife mit k gibt ein falsches Ergebnis für n = 8 (und Ihre kurze Antwort initialisiert die lokale Variable i nicht auf 0)
edc65

Diese einfachere Schleife tun soll: for(k=1;k<=n;)k*=2;k--;. Jetzt sehe ich, dass das viel kürzer ist als mein C-Versuch, um dasselbe (meiner ist besser für die Leistung, aber die Leistung spielt bei dieser Herausforderung keine Rolle)
edc65

@ edc65 musst du machen 2^k xor 2^k -1für max{2^k<=n}oder 2^k -1für min{2^k>=n}. um alles 11..1da
rein

2

Python 3, 133 131 Bytes

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 Bytes

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

Ignorieren Sie den Fehler, es ist nur Threadnicht zu wissen, was es tut.


1

Emacs Lisp, 193 Bytes

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

Die Ausgabe wird in dem gesendeten *Message*Puffer, der sein würde , stdoutwenn xin einem Skript verwendet werden sollte.

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

Es dauerte einige Zeit, bis man einen Weg gefunden hatte, um das Auffüllen mit variabler Breite .format()(einige, nicht viele) durchzuführen und es richtig einzustellen, aber ich denke, ich muss jetzt alles spezifizieren. Könnte aber mehr Golf in dieser Breitenberechnung gebrauchen.

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

Detailliert:

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 Bytes (nicht konkurrierend)

hD]UA.&P

Erläuterung:

         - 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

Probieren Sie es hier aus


0

Python 2, 77 Bytes

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

3
Willkommen bei Programming Puzzles & Code Golf! Soweit ich sehen kann, verfehlt Ihre Antwort, wie leider viele andere hier, den Spaltenausrichtungspunkt vollständig.
Katze


0

Excel VBA, 95 Bytes

Anonyme VBE-Direktfensterfunktion, die Eingaben aus dem Bereich [A1]und Ausgaben an die Konsole weiterleitet.

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

Kleines Basic , 499 Bytes

Ein Skript, das Eingaben vom TextWindowObjekt entgegennimmt und an dasselbe ausgibt

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

Probieren Sie es bei SmallBasic.com aus. Verwendet Silverlight und muss daher in IE oder Edge ausgeführt werden

Wählen Sie die schwarze Konsole aus, geben Sie eine Ganzzahl ein und drücken Sie Enter.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.