Esto está relacionado tangencialmente con mi búsqueda para inventar un lenguaje de programación esotérico .
Se puede usar una tabla de los números binarios 0 .. 15 para implementar una función binaria universal mediante operaciones de indexación. Dadas dos entradas de 1 bit X e Y, las 16 funciones posibles se pueden codificar en un código de operación de 4 bits.
X Y F|0 1 2 3 4 5 6 7 8 9 A B C D E F
- - - - - - - - - - - - - - - - - -
0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
0 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
- - - - - - - - -
0 ~X ~Y ^ & Y X | 1
ZERO NOT-Y AND OR
NOT-X XOR ONE
Entonces este conjunto de 16 funciones se puede aplicar a entradas binarias como la función
U (f, x, y): (f >> ((x << 1) | y)) & 1 ,
o
U (f, x, y): (f / 2 ^ (x × 2 + y))% 2 ,
o con indexación o partición matricial.
Será útil conocer la forma más compacta de representar o generar dicha tabla de valores para cualquier lenguaje posible que se construya sobre este tipo de operación binaria.
La meta:
Genere esta salida de texto exacta:
0101010101010101
0011001100110011
0000111100001111
0000000011111111
¡Eso es! El código más corto gana.
fuente
Respuestas:
J, 10 (13?) Caracteres
Lista de números:
a binario:
Transponer:
Marcha atrás:
¿Necesitamos eliminar los espacios? En cuanto a la otra respuesta J parece que sí, así que tendrá que añadir 3 caracteres y tomar prestado el
1":
de la respuesta de Jan .fuente
Pitón 2, 40
fuente
APL (14)
Suponiendo
⎕IO=0
(que es un ajuste):Explicación:
⍳16
: números [0,16)(4⍴2)⊤
: codifica cada número en la base 2 con 4 dígitos⊖
: retroceso horizontal (para que el MSB termine arriba)⎕D[
...]
: seleccione estos valores de los⎕D
cuales es la cadena0123456789
. (Se muestra una matriz numérica con espacios entre los valores, una matriz de caracteres no. Así que esto convierte cada bit numérico en uno de los caracteres'0' '1'
).fuente
(4⍴2)⊤
→2⊥⍣¯1
Gelatina ,
427 bytes (no competitiva)Pruébalo en línea!
Gracias a Dennis por su ayuda. Aquí está el primer mensaje, aquí está el último (también hubo otras discusiones). Con su ayuda, aparentemente (casi) arraigé el puntaje.
fuente
/// , 51 bytes
Pruébalo en línea
fuente
GolfScript (
18 1715 caracteres)(Con agradecimiento a Howard)
No entiendo por qué el 10-char
no funciona Sospecho que un error en el intérprete estándar está dando como resultado tipos no compatibles en la pila.
Una alternativa de 18 caracteres que entiendo completamente es:
Un enfoque más matemático es un poco más largo, con 28 caracteres:
Mucho de eso es para la conversión de base y el relleno cero. Sin esos, se reduce a 19 caracteres,
con salida
fuente
16,zip{n}/
funcionar entonces?16,zip{','-~n}%
zip
debería devolver una matriz de matrices, pero en realidad parece devolver una matriz de matrices Ruby (es mi mejor suposición). Cualesquiera que sean los elementos, la aplicación de `` '' a ellos no afecta la forma en que imprimen, que es diferente a cualquiera de los 4 tipos de datos de GolfScript. Tienes razón, eso','-
parece convertirlos en matrices normales: buen truco.CJam - 16
Código equivalente de Java (como explicación):
fuente
Javascript (ECMA6), 67
Para usar esto, llame
Bitshift!
Y también XOR y un poco de recursión.
Lo primero que debe notar es que si tomamos cualquier línea y la cambia (# de ceros continuos) / 2 hacia la izquierda, obtenemos un buen XOR para obtener la siguiente línea.
Por ejemplo,
XOR estos bitwise nos dan
cuál es la siguiente línea (línea 3).
Aplicando el mismo proceso para la línea 3, desplaza 2 a la izquierda y obtenemos ...
XOR'ed da
que es la línea 2.
Observe que la cantidad que cambiamos se reduce a la mitad cada vez.
Ahora simplemente llamamos a esta función de forma recursiva, con 2 argumentos. El valor entero de esta línea, y N, que es cuánto necesitamos cambiar. Cuando hagamos recursivos, simplemente pase el valor XOR desplazado y n / 2.
es rellenar los 0 al comienzo de cada línea porque toString elimina los 0 iniciales.
fuente
s=(k,n)=>n?s((k<<n/2)^k,n>>1)+"0".repeat(n)+k.toString(2)+` `:""
J, 21 caracteres
i.16
es una lista de 0..152^i.4
es una lista (1,2,4,8)%~/
produce la tabla de divisiones donde el argumento izquierdo forma filas pero es el argumento correcto para la división2|
calcula el resto después de dividir [cada celda] por dos<.
pisos que valen 0 o 11":
formatea la tabla con un carácter por celdafuente
floor
que no debería ser necesario. El dominio de2|
ya es 0 o 1, ¿verdad?|
opera en flotadores .2|3.25
es1.25
. No queremos eso.GolfScript, 19 caracteres
Otro enfoque de GolfScript
fuente
Rubí (44)
Aburrido y largo: solo imprime las representaciones binarias con relleno de 0 de los números.
fuente
Posdata
108177126777470Invierte los valores para un método de modificación más simple .
151131119Aplicando un enfoque más APL -ish. editar: reemplazó el corte de cadenas y la compresión de matrices con indexación y bucles for.
Sangrado:
Reimplementar las funciones utilizadas en la respuesta J ganadora conduce a esto (con mucho código de soporte ).
i
aquí hay un vector basado en 1 descrito en las funciones elementales de Iverson , de ahí el-1 ... +
para producir0 .. 15
.fuente
Perl (36 + 1)
+1 para
say
, como siempre. el doble0
no es un error tipográfico :)fuente
say
.perl -e'...'
es estándar y esto requiereperl -E'...'
, sin aumento en el recuento de bytes. De todos modos, creo que se decidió por Code Golf Meta que-M5.01
es gratis.JavaScript (ECMA6), 108
Intentando un enfoque diferente aquí. Aunque me animaron a usar operadores binarios, me permití enviar esta solución ya que el desafío también es complejidad kolmogorov y estaba pensando: ¿cómo puedo reducir la cantidad de código que representa esos valores ...? Bases .
(Salto de línea por conveniencia).
Es una lástima que tuve que meterme con el relleno con ceros a la izquierda, pero el objetivo de este código es simplemente representar el resultado binario de destino en Base 36, que son exactamente esos
gut, a43, 2z3, 73
valores.Nota: Me doy cuenta de que no estará cerca de la respuesta ganadora, pero solo por el bien de la idea ...
fuente
alert(['gut','a43','2z3',73].map(n=>(1e8+parseInt(n,36).toString(2)).slice(-16)).join('\n'))
. Este enfoque utiliza nuevas líneas en lugar de cuatroalert()
s.Sprects , 44 bytes
La respuesta de Cedric fue portada a Sprects.
fuente
MATL ( no competidor ), 8 bytes
Pruébalo en línea!
Explicación
fuente
CJam ( no competidor ),
109 bytes¡Gracias a @Dennis por 1 byte de descuento!
Pruébalo en línea!
Explicación
fuente
JavaScript (ES6),
5852 bytesConstruye la cadena recursivamente.
Cómo funciona
Esta recursión se basa en el hecho de que el patrón está hecho de la representación binaria vertical de nibbles 0x0 a 0xF:
Por lo tanto, cada posición (X, Y) en este modelo se puede expresar como la Y-ésimo bit de X:
X & (1 << Y)
. También podemos aislar este bit con:(X >> Y) & 1
. En lugar de hacer el seguimiento de X e Y, que iterate en una única variablen
que va de 0 a 63. Por lo tanto, la fórmula se convierte en:(n >> (n >> 4)) & 1
. En realidad, es más fácil iterar de 63 a 0, por lo que la cadena se construye en orden inverso. En otras palabras, el carácter n-1 se agrega a la izquierda del carácter n .Como nota al margen, la recursión no trae nada aquí excepto un código más corto.
Sin los saltos de línea, el código tiene una longitud de 35 bytes:
Necesitamos 17 bytes más para insertar los saltos de línea. Esto podría acortarse a 14 bytes si un salto de línea inicial es aceptable.
Manifestación
fuente
(f=(n=64)=>n--?f(n)+(n>>(n>>4)&1):'')().match(/.{16}/g).join`\n`
(63 bytes).replace(/.{16}/g,"$0\n")
tiene la misma longitud. Demasiado.Bash + coreutils, 65 bytes
No es el más corto, pero tampoco el más largo:
(El último personaje es un espacio)
Pruébalo en línea .
fuente
NARS2000 APL, 22
Derivado de la respuesta APL de marinus, que no parece funcionar en NARS2000.
Generar vector
Cambiar a cero
Generar forma para codificar
Codificar
Ajuste para indexación basada en 1
Eje primario inverso
Índice
fuente
C, 73 caracteres
Esta es solo una solución general para generar 64 bits en cuatro bloques de 16 bits; solo necesitas cambiar el número
0xFF0F0F33335555
para generar otra secuencia de bits.simplificado y sin golf:
fuente
Haskell, 73
¡Ay, 73 caracteres! Sin embargo, no puedo por el amor de Dios hacer esto más pequeño.
La verdadera parte triste de esto es que si hiciera eco de la salida usando bash, solo necesitaría 74 caracteres.
fuente
JavaScript (ES5) 69
for(x="";4>x;x++){z="";for(n=0;16>n;)z+=1-!(n++&1<<x);console.log(z)}
fuente
inca2 ,
332724Esto se basa en la respuesta de Jan Dvorak . inca2 puede ejecutar esto a partir de las correcciones de errores de ayer. Técnicamente inválido ya que el idioma fue inventado después de la pregunta, pero la invención de un idioma fue parte de mi objetivo al plantear la pregunta. Así que aquí hay algo de recuperación en agradecimiento a las otras respuestas. :)
Explicación:
Algunos de los paréntesis deberían ser innecesarios, pero aparentemente hay algunos problemas pendientes con mi interpretación de la gramática. Y "ravel => map => rehape" es realmente torpe: el mapa debe ser más inteligente. Editar: las correcciones de errores permiten la eliminación de parens.
Factorizando la conversión de base en una función separada
N:x|y%.x^~1+[]/x.y
produce esto19Versión de 16 caracteres .Y aunque estoy haciendo trampa de todos modos aquí, seguí adelante e hice de esto una función incorporada. Pero, aunque es una función niládica (que no requiere un argumento), no hay soporte para funciones niládicas, y debe suministrarse con un argumento ficticio.
inca2, 2
fuente
Pyth 24/26
El método más corto fue la respuesta de grc traducida a Pyth, que me pareció barata, así que hice mi propio método:
Mina: 26 caracteres.
grc: 24 caracteres
fuente
C ++ 130
Convierte hexadecimal a binario
fuente
Haskell (Lambdabot), 47 bytes
Un poco engañoso porque usa transposición de Data.List y replicateM de Control.Monad, sin embargo, ambos se cargan de forma predeterminada desde Lambdabot.
Además, estoy seguro de que hay margen de mejora, solo quería compartir la idea
fuente
Julia (39 bytes)
Segundo guión que escribí en Julia, debo admitir que me gusta Julia, es una bestia bonita.
Devoluciones
Explicación:
bin(x,4)
- Convierte int a entero binario con relleno a 4 caracteres.collect(_)
- Dividir la cadena en una matriz de caracteres.map(x->_,0:15)
- Haga esto para los primeros 16 dígitos en el rango.hcat(_...)
- Splat y concatenar horizontalmente en una matriz.fuente
C
8377767471Muy claro.
fuente
?:
, y otro ahorro de 1 al mover a++
.main
af
. lolR,
5341 bytesUna traducción de la respuesta de Python de @ grc. Afeitó 12 bytes a partir de la traducción original mediante el uso de
rep()
'seach
ylength
argumentos (y coincidente argumento parcial), y recordando que0:1
es equivalente ac(0,1)
.También puede intentar una traducción de la respuesta J de @ Gareth, algo como esto (34 bytes):
Sin embargo, utiliza una función que no forma parte de la base R y genera una matriz que es difícil de formatear en texto impreso exacto como en la especificación.
fuente