Antecedentes :
Se le ha asignado una tarea para convertir números de base 10 a base 2 sin usar ninguna función de conversión de base prefabricada. Tampoco puede usar ninguna biblioteca importada.
Problema :
Convierta una cadena de entrada de base 10 (decimal) a base 2 (binario). No puede utilizar ningún código / funciones / métodos de conversión base prefabricados ni bibliotecas importadas. Como se trata de código golf , la respuesta más corta en bytes ganará.
La entrada será de -32768 a 32767 (incluye el manejo de bytes de signo en su código)
the MSB of signed variables controls if they are negative
- Eso suena como bit de signo, sin embargo, como-32768..32767
sugiere el rango , desea el complemento de 2. Entonces, ¿cuál quieres? ..Respuestas:
GolfScript - 17 bytes
No es mucho más detallado que el incorporado
~2base
.fuente
~
"37"
, por ejemplo, la operación"37" & 1
(en infijo) es una operación configurada. El~
en el frente convierte la entrada a un entero.10
en la pila, no es necesario evaluarlo. Sin embargo, cuando se lee desdestdin
, la entrada será una cadena ( prueba aquí ). La descripción del problema también establece explícitamente que la entrada es una cadena.JavaScript, 46
fuente
>>>=
existía un operador de 4 caracteres ( )! +1 (Además, si lo ejecuta en la consola, puede guardar los últimos 9 caracteres.)x=8; x>>>=1; x;
yx=8; x>>>1; x;
- en el primer caso, el valor de x ha cambiado; en el segundo, no lo ha hecho.>>>=
es un solo operador .Brainf * ck,
9877Obviamente, esto no tiene el propósito de ganar, pero ¿cuál sería una competencia si no tuviera una solución brainfk?
Dado que brainfk solo puede manejar enteros de 8 bits y no negativos, supongo que no cumple completamente con las reglas, pero bueno, nunca estuve allí para ganarlo.
Esto realmente funciona para entradas de 16 bits si su intérprete admite
Incluso lo hice salir en valores ASCII
Aquí está el código anotado:
Algoritmo más corto (77):
Este solo puede manejar enteros de 8 bits.
El algoritmo funciona utilizando un contador binario que en realidad es muy corto (un incremento es el
>[->]++[-<+]-<-
que presenta los bits. El problema es que es difícil imprimir todos los bitsEse último algoritmo se puede adaptar para adaptarse a cualquier número de bits a expensas de los bytes. Para poder tratar con enteros de N bits, se requieren 53 + 3 * N bytes para codificar.
ejemplos:
fuente
Respuesta APL obligatoria - 21
22Ejemplos:
fuente
⎕IO←0
, y devuelve una matriz de bits en lugar de una cadena:2|⌊⎕÷2*⊖⍳16
.Código de máquina de Turing, 272 bytes
Como de costumbre, estoy usando la sintaxis de la tabla de reglas definida aquí. Puede probarlo en ese sitio o, alternativamente, usar esta implementación de Java.
Gran parte del código se copia de mi convertidor de decimal a hexadecimal aquí.
Cuenta hacia atrás desde la entrada en la base 10 mientras cuenta hacia atrás desde 0 en la base 2. Al disminuir el cero, borra el bloque de entrada y termina.
fuente
Javascript 59
fuente
+x
lugar deparseInt(x)
Perl, 44
Este es mi primer programa Perl en la historia, así que perdónenme si se puede seguir jugando más fácilmente. Editar: Gracias @primo por quitarme 7 caracteres de mi respuesta.
La lógica es esencialmente la misma que mi solución C anterior.
Además, utiliza 64 bits.
fuente
reverse
construyendo el revés de la matriz:@s=($x&1,@s)
.$\=$_%2 .$\while$_=$_>>1||<>;print
. O, si las opciones de la línea de comando cuentan un byte cada una, 27:1while$\=$_%2 .$\,$_>>=1}{
usando-p
.Javascript -
5648 y3628 caracteresGracias a @Blender por afeitar 8 caracteres.
Este formulario toma entrada y muestra salida, 48 caracteres:
Si solo se necesita una instrucción que ponga
a
una variable,x
se necesita la forma binaria de una variable (y no se molesta en destruir elx
valor como efecto secundario), aquí tiene 28 caracteres:fuente
Math.floor
con~~
, ya que el rango de los números es pequeño.a=x%2+a
podría acortarsea+=x%2
? Funciona en todos los idiomas que conozco.a=a+x%2
, pero eso+
es para la concatenación de cadenas. Es decir, su sugerencia da como resultado los dígitos en orden inverso.Python -
6160 caracteresfuente
print
y""
.print
ya que devuelve automáticamente el resultadoC, 55 caracteres
Imprime un cero inicial adicional (por el bien de 2 bytes).
Recursión dentro
printf
invierte el orden de impresión, por lo que el algoritmo extrae bits de derecha a izquierda pero imprime de izquierda a derecha.EDITAR : guardado un char usando en
putchar
lugar deprintf
.fuente
Dyalog APL , 11 bytes
2|
El resto de la división cuando se reduce a⌊
la mitad el valor redondeado hacia abajo de⎕
la entrada÷
dividido por cada uno de los2*
dos a la potencia de cada uno de⍳16
{0, 1, 2, ..., 15}Requiere
⎕IO←0
cuál es el predeterminado en muchos sistemas.TryAPL en línea!
fuente
C, 81
La salida tiene estrictamente 16 bits (incluidos los ceros de relleno)
fuente
Hojas de Apps Script + Google,
147144121 bytesGuión
Sábana
Versión modificada de este script por ZygD.
fuente
Haskell, 66 bytes
Llama con
b "-1023"
, agregamain=interact b
un programa completo o pruébalo en Ideon.c
realiza la conversión para enteros positivos.b r=show.c.read$r
convierte una cadena en un número, aplicac
y vuelve a convertir en cadena.b('-':r)='-':b r
elimina un posible líder-
y lo vuelve a agregar al resultado.fuente
PowerShell,
59878270 bytes+28 bytes para soportar números negativos.
-12 bytes gracias a @ ASCII-only
Pruébalo en línea!
Adaptado de este código . Toma datos a través de un parámetro de línea de comandos
-d
.fuente
APL (NARS), 17 caracteres, 34 bytes
Es una copia y modificación de la respuesta de Adam /codegolf//a/90107 en la forma en que se puede agregar el parámetro para la longitud de bits, y ⎕IO para esta función (aquí es ⎕IO = 1) debería no tiene importancia ...
Parece fácil manejar el número de bits de esta manera (compruebo que el último resultado debe ser correcto)
fuente
Smalltalk (Smalltalk / X), 63/78
la primera versión crea una cadena intermedia (78):
en realidad, no hay necesidad de crear la cadena; solo da salida a los caracteres (63):
mhmh: ¿hay una forma más corta de leer un número?
fuente
Python 3.x: 65 caracteres
fuente
Bash, 44
Pase un valor de entrada al script a través de la variable de entorno
n
. La representación decimal del resultado binario no puede excederLONG_MAX
.Esto también debe ser compatible con
ksh93
yzsh
sib
ye
se inicializan a0
y se utiliza expansión aritmética adecuada.fuente
n
ya está definido, por lo que es un fragmento. Eso podría solucionarse tomando la entrada como un argumento de línea de comandos y configurándolan
en su script.n=127 sh -c '...'
quesh -c 'n=$1 ...' _ 127
. No hay ninguna razón para preferir uno sobre el otro en este caso, ya que ambos son una forma perfectamente típica de pasar valores.C # - 104
Este método convertirá decimal a binario hasta
64
bits.Cuando se ejecuta el método anterior en Linqpad - rr = p (-32768); rr.Dump ();
Salida:
01111111111111111111111111111111111111111111111111000000000000000
fuente
int
.Java 8,
8071 bytes-9 bytes debido a una regla en los comentarios. Las entradas negativas de base 10 pueden devolver el valor positivo / absoluto de base-2 como salida aparentemente.
Explicación:
Pruébalo en línea.
fuente
Kotlin , 82 bytes
Pruébalo en línea!
fuente
Pequeño Básico , 133 bytes
Un script que entra y sale de la
TextWindow
consola.Pruébelo en SmallBasic.com Requiere Silverlight y, por lo tanto, debe ejecutarse en IE.
La E / S se toma / da desde la consola negra.
-22 bytes gracias a @Neil
fuente
For i=0To c-1
?MATL ,
1517 bytesPruébalo en MATL Online
TIO
(+2 bytes eliminando el 0 inicial para números negativos, el bit de signo debería ser el primer bit).
La salida en MATL Online debe leerse de abajo hacia arriba (MSB está en la parte inferior).
La parte principal es bastante simple:
`2&\t
= mientras el valor es mayor que 0, divídalo entre 2 y acumule el resto.Manejar números negativos y darles la representación del complemento 2 fue la parte difícil. Al final fui con el " restar de2norte "método para obtener el complemento de dos de un número. Dado que solo estamos obligados a manejar valores de hasta -32768, para los números negativos, el código crea 2dieciséis= 65536 with
16W
, agrega la entrada a eso (por ejemplo, 65536 + (-42)), lo que da algo que MATLAB ve como un número positivo pero representa la representación binaria con signo de la entrada en forma de 16 bits.fuente
C (gcc) ,
5043 bytes-7 bytes gracias a ceilingcat .
Pruébalo en línea!
fuente
PowerShell , 43 bytes
Pruébalo en línea!
fuente
> <> ,
3433 bytesPruébalo en línea!
fuente