Producir una mesa XOR


21

Introducción

XOR es una puerta lógica digital que implementa un exclusivo o. La mayoría de las veces, esto se muestra como ^. Los cuatro resultados posibles en binario:

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

Esto también puede verse como módulo de adición 2 en binario. En decimal, necesitamos convertir el decimal a binario, 35 = 100011y 25 = 11001. Para calcular el valor XOR, los colocamos uno encima del otro:

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

La tarea : cuando se le da un valor entero N mayor que 1, genera una tabla XOR con el tamaño N + 1. Por ejemplo, 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

Puede ver que hay un espacio delante de cada número, porque la cantidad más alta en la tabla tiene longitud 1. Sin embargo, si tomamos N = 9, obtenemos la siguiente cuadrícula:

  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

El valor más alto tiene longitud 2, por lo que el valor está alineado a la derecha con la longitud 3 (longitud más alta + 1).

Reglas:

  • Los espacios en blanco iniciales no son obligatorios, solo si se usan (o no) de manera consistente
  • Debe generar una tabla en la forma que se muestra arriba.
  • El relleno entre columnas debe ser lo más pequeño posible
  • Este es el , por lo que gana el envío con la menor cantidad de bytes.

¿Cuánto relleno se permite entre columnas? ¿Solo la mínima cantidad posible?
Martin Ender

@ MartinBüttner Sí, la cantidad mínima posible. Agregaré eso a la descripción.
Adnan


Mirando los ejemplosoutput an XOR table with the size N+1
edc65

¿Cuál es el valor máximo para N? ... (para N == 1000000 el tamaño de la tabla estaría cerca de 10 Terabytes)
edc65

Respuestas:


12

MATL , 10 bytes

0i2$:tXgZ~

El compilador (y en particular este programa) ahora parece funcionar en Octave, aunque todavía necesita un poco de refinamiento. Puede usar provisionalmente esta confirmación de GitHub .

Editar (Mar 30 '16) : ¡ Pruébelo en línea!

Ejemplo

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

Explicación

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

Compilador trabajando en Octave próximamente ...
Luis Mendo

... bueno, con suerte. Alguna idea sobre esto , alguien?
Luis Mendo

55
Definitivamente la herramienta adecuada para el trabajo. +1
un espagueti

1
Después de algunos ajustes, el compilador parece funcionar en Octave (4.0.0). Necesito hacer más pruebas, pero todos los programas que he probado, incluido este, funcionan. Mientras publico una nueva versión, aquí hay un enlace al compromiso actual de GitHub para ejecutar este código en Octave. El idioma no ha cambiado (todavía es la versión 5.0.0), por lo que es anterior a este desafío
Luis Mendo

5

Bash + BSD utils, 45

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

He estado esperando mucho tiempo para encontrar un uso rs. Esto parece ser bueno. rsEs posible que deba instalarse en sistemas Linux. Pero se ejecuta de inmediato en OS X.

  • $1se expande a N y, por lo tanto, se echo \$[{0..$1}^{0..$1}]expande aecho $[{0..N}^{0..N}]
  • Esto luego se evaled:
  • La expansión del corsé se expande a $[0^0] $[0^1] $[0^2] ... $[0^N] ... $[N^N]
  • Esta es una serie de expansiones aritméticas xor que se expanden a una línea de términos
  • rs (remodelar) reforma esta línea a N + 1 filas. -jla derecha justifica y -g1proporciona un ancho de canal de 1. Esto asegura que la tabla de salida final tenga un ancho mínimo entre columnas.

He probado hasta N = 1000, lo que tomó 3.8 segundos. Teóricamente, N grande es posible, aunque bash se quedará sin memoria en algún momento con el uso de memoria (N + 1) ² de la expansión de llaves.


4

C, 114 128 152

Editar Conteo espacial simplificado, inspirado en el trabajo de Khaled A Khunaifer

Función de CA que sigue las especificaciones.

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

Intentalo inserte n como entrada, por defecto 9

Menos 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

Editar 2 bytes guardados gracias a ETHproductions

Una función anónima. Nota: el número en la tabla está limitado a 7 dígitos, eso es más que razonable dado el tamaño general de una tabla que permite números más grandes

Ahora debería encontrar una forma más corta de obtener el tamaño máximo de las columnas, evitando logaritmos

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

Prueba

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>


Impresionante, me encanta usarlo ~mpara capturar un espacio extra. El uso de una cadena de plantilla puede ahorrar dos bytes:(z,j)=>`(7 spaces)${i^j}`.slice(~m)
ETHproductions

@ETHproductions 1) buena sugerencia, gracias 2) ¿cómo se las arregló para poner un ... (ni siquiera puedo preguntar) ... un char (96) dentro de 2 char (96)?
edc65

Ajá, solo usas múltiples backticks, así: (ignore this padding) ``abc`def`` (ignore this too)aparece así:abc`def
ETHproductions

3

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

Detallado

#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
Al igual que su publicación de Java, no hay ningún intento de alinear correctamente las columnas. Esa es la única parte difícil de este desafío. Este código da una salida incorrecta cuando se
ingresa

@ edc65 Descubrí cómo alinear, el valor máximo de xor es binario 11..1al significativo en el valor de entrada n, se puede hacer primero encontrando la potencia más cercana de 2, luego xor con el número anterior,0001 xor 1110 = 1111
Khaled.K

Bien, estás en el camino correcto ahora. Aún así, debe probar más: el bucle con k da un resultado incorrecto para n = 8 (y su respuesta corta no inicializa la variable local i a 0)
edc65

Este bucle más simple debe hacer: for(k=1;k<=n;)k*=2;k--;. Ahora veo que es mucho más corto que mi intento de C de lo mismo (el mío es mejor para el rendimiento, pero el rendimiento no importa en este desafío)
edc65

@ edc65 que necesita hacer 2^k xor 2^k -1para max{2^k<=n}o 2^k -1para min{2^k>=n}. conseguir todo 11..1allí
Khaled.K

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
¡Bienvenido a Programming Puzzles & Code Golf! Por lo que puedo ver, su respuesta, como desafortunadamente muchas otras aquí, pierde completamente el punto de alineación de la columna.
edc65

Pruébelo con la entrada 5 (demasiado espacio entre columnas) o 65 (muy poco)
edc65

esto estaría bien por fin hasta 512, por fin aquí ...
Ros

3

Gelatina, no competidora

7 bytes Esta respuesta no es competitiva, ya que utiliza características que son posteriores al desafío.

0r©^'®G

Pruébalo en línea!

Cómo funciona

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
Felicidades por tu respuesta número 1000 :)
Adnan

3

R, 38 bytes

Por lo general, R requiere muchos bytes solo para formatear la salida. En este caso es todo lo contrario. outerque generalmente se refiere al producto externo de dos matrices, puede cuando se le proporciona una función realizar esto a través de los márgenes de los vectores. En este caso, aplicamos la función XOR bit a bit bitwXor.

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

2

CJam, 29 27 bytes

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

Pruébalo aquí.

Explicació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.

Bueno, eso fue rápido jaja
Adnan

2

MathCAD, 187 bytes

enter image description here

MathCAD maneja tablas integradas fácilmente, pero no tiene absolutamente ningún Xor bit a bit, ni convertidores decimal a binario o binario a decimal. Las funciones for iteran a través de los valores posibles. El lugar i, a2, Xa y Xb se mantienen. El ciclo while se convierte activamente en binario, y mientras se convierte en binario también realiza la función xor (la pequeña cruz con el círculo a su alrededor). Almacena el número binario en un número de base 10 que consiste en 0 y 1. Esto se convierte antes de almacenarse en la matriz M mediante la función de suma.

Esto se puede reducir fácilmente (aunque solo sea cambiando los marcadores de posición por otros más cortos), pero pensé que lo publicaría y vería si alguien puede reducir el convertidor binario a decimal más que cualquier otra cosa.


2

k4, 50 bytes

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

P.ej:

  {-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, 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],"
"," "]&

Haga caso omiso del error, simplemente Threadno sabe lo que está haciendo.


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

Sin golf:

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

La salida se envía al *Message*búfer, que sería stdoutsi xse usara dentro de un script.

(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

Tomó un poco de tiempo encontrar una manera de hacer relleno de ancho variable .format()(algunos, no mucho) y ajustarlo correctamente, pero creo que ahora tengo todo para especificar. Sin embargo, podría usar más golf en ese cálculo de ancho.

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 bytes

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

Detallado:

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 (no competitivos)

hD]UA.&P

Explicación:

         - 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

Pruébalo aquí


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
¡Bienvenido a Programming Puzzles & Code Golf! Por lo que puedo ver, su respuesta, como lamentablemente muchos otros aquí, pierde por completo el punto de alineación de la columna.
gato


0

Excel VBA, 95 bytes

Función de ventana inmediata anónima VBE que toma la entrada del rango [A1]y las salidas a la consola.

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

Pequeño Básico , 499 bytes

Un script que toma la entrada del TextWindowobjeto y las salidas al mismo

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

Pruébelo en SmallBasic.com Utiliza Silverlight y, por lo tanto, debe ejecutarse en IE o Edge

Seleccione la consola negra, luego escriba entero de entrada y presione Enter.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.