Creemos un mapeo simple y sobreyectivo de enteros positivos a enteros gaussianos , que son números complejos donde las partes real e imaginaria son enteros.
Dado un número entero positivo, por ejemplo 4538
, exprésalo en binario sin encabezado 0
:
4538 base 10 = 1000110111010 base 2
Elimine cualquier rastro 0
:
100011011101
Reemplace cualquier ejecución de uno o más 0
con una sola +
:
1+11+111+1
Reemplace todos los 1
's con i
' s:
i+ii+iii+i
Evalúe la expresión compleja resultante y genere el entero gaussiano simplificado:
i+ii+iii+i = i+i*i+i*i*i+i = 2i+i^2+i^3 = 2i+(-1)+(-i) = -1+i
La salida se puede expresar de una manera matemática tradicional, o se puede dar como dos enteros separados para las partes real y compleja. Por 4538
ejemplo, cualquiera de estos estaría bien:
-1+i
i-1
-1+1i
(-1, 1)
-1 1
-1\n1
Para las entradas como 29
, salidas Mathy formateado como 0
, 0i
o 0+0i
son todos bien.
Usar j
(o algo más) en lugar de i
está bien si eso es más natural para su idioma.
El código más corto en bytes gana.
fuente
4+2j
->100+10j
...Respuestas:
MATL , 7 bytes
Pruébalo en línea!
Cómo funciona
Considere la entrada
4538
por ejemplo.fuente
Jalea , 8 bytes
Pruébalo en línea!
Cómo funciona
fuente
Python 2, 53 bytes
He estado tratando de jugar al golf y parece golfable, pero estoy sin ideas atm ...
fuente
(k or 1)
no parece óptimo, pero lo único que se me ocurre es(k+0**k)
...0**k
no funcionan para complejosk
...Mathematica,
4438 bytesExplicación
Convierta la entrada en la base 2. (se
4538
convierte{1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0}
)Multiplicar por
I
(se{1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0}
convierte{I, 0, 0, 0, I, I, 0, I, I, I, 0, I, 0}
)Dividido por carreras (se
{I, 0, 0, 0, I, I, 0, I, I, I, 0, I, 0}
convierte{{I}, {0, 0, 0}, {I, I}, {0}, {I, I, I}, {0}, {I}, {0}}
)Encuentra el producto en el nivel 2. (se
{{I}, {0, 0, 0}, {I, I}, {0}, {I, I, I}, {0}, {I}, {0}}
convierte{I, 0, -1, 0, -I, 0, I, 0}
)Suma el resultado. (se
{I, 0, -1, 0, -I, 0, I, 0}
convierte-1 + I
)fuente
Tr[Times@@@(I*Split@RealDigits[#,2][[1]])]&
I
primero, peroIntegerDigits
terminé siendo más corto.Python 2 ,
777671 bytes¡Gracias a @ZacharyT por jugar golf en 1 byte!
Pruébalo en línea!
fuente
JavaScript (ES6),
6764 bytesSalidas como una matriz de 2 elementos.
Explicación
Como JavaScript no tiene números imaginarios, tenemos que hacer un seguimiento de las partes reales e imaginarias en variables separadas. La forma más fácil de hacerlo es en una sola matriz, con la parte real primero. i se representa como [0,1] , i 2 (o -1 ) como [-1,0] , i 3 (o -i ) como [0, -1] e i 4 (o 1 ) como [1 , 0] .
Primero, dividimos repetidamente el número por 2, recolectando cada serie de unidades en su representación binaria. Cada serie de n unos corresponde a i n . Esto corresponde a agregar 1 - (n & 2) al elemento en el índice n & 1 en la matriz de dos elementos. Entonces eso es lo que hacemos.
Probablemente debería agregar más explicaciones, pero no puedo pensar en qué más hay que explicar. Siéntase libre de comentar con cualquier pregunta que pueda tener.
fuente
Python,
1991291241169490716361 bytesLa entrada es solo el número mismo.
La salida está en el formato
(a+bj)
, dondej
está la unidad imaginaria.0j
saldrá en lugar de(0+0j)
Primero convierta a binario. Truncar el
'0b'
apagado. Mata a los ceros finales. Dividir usando un bloque de cero (s) como delimitador. Asigna cada bloque a1j ** len
. Luego, toma la suma de todo.-70 bytes al no convertir a más.
-5 bytes regex es más corto.
-8 bytes al deshacerse de las dos variables innecesarias que solo se llamaban una vez.
-22 bytes usando números complejos en lugar de mi cosa extraña. ¡Gracias a la respuesta de @Dennis por informarme de números complejos!
-4 bytes al darse cuenta de que
map
es solo una forma elegante de hacer comprensiones de listas, excepto por más tiempo.-19 bytes cambiando a un método ligeramente arcano para evitar errores
j ** 0
y evitar expresiones regulares. Inspirado por el comentario de @ Griffin. ¡Gracias! :)-8 bytes moviendo la
if
parte al final.-2 bytes ¡Gracias a @Griffin por guardar 2 bytes eliminando los corchetes para convertirlo en una expresión generadora!
fuente
sum(1j**x.count('1')for x in bin(input()).split('0')if x)
1
bloques y no usa expresiones regulares como la mía. Además, no quiero robarte el código, ya que es mucho mejor que mi versión. :)1
s en lugar de la longitud,0x
primero quita la parte del frente. Gracias por la idea de moverif
al final; ¡Nunca hubiera sabido que eso funciona de otra manera!MATLAB, 58 bytes
Usemos
285
para ilustrar el proceso:Por suerte
1+++1
se comporta igual que1+1
en MATLAB, por lo que los evalúa anteriores a:1+111+1
.¡Ahora esta
strrep
llamada es la verdadera joya! Al insertari*1
para1
obtener algo realmente agradable. Si solo hay uno1
, simplemente obtenemosi*1
cuál esi
. Si hay más de uno, entoncesi*1
se repite y se concatenan en una secuencia:i*1i*1i*1i*1
. Dado quei==1i
en MATLAB y1i*1==i
esto simplemente es:i*i*i*i
.Anexar
.0
parece innecesario aquí, pero es necesario si el último carácter detemp3
es a+
. No podemos agregar solo un cero, ya que eso daríai*10
en el caso anterior y, por lo tanto, el resultado incorrecto.Y finalmente:
Esto no funciona en Octave por varias razones.
strrep
no puede tomar valores ASCII como entrada, necesita los caracteres reales (en'0'
lugar de48
). Además,+++
no se evalúa sólo+
en Octave, ya que ello romper los atajos de aumento / disminuciónx++
yx--
.fuente
eval
:-P ¿No puedes usar en1i
lugar de1*i
?i*1
parte ...Pyth - 15 bytes
Frustrantemente largo.
Test Suite .
fuente
Mathematica, 84 bytes
Función anónima. Toma un número como entrada y devuelve un número complejo como salida.
fuente
Mathematica, 75 bytes
Independientemente se le ocurrió casi la misma solución que LegionMammal978 publicó hace 23 minutos. Reemplazar
1
conI
(que es el símbolo interno de Mathematica para la raíz cuadrada de -1) funciona porque los espacios se tratan como una multiplicación de expresiones vecinas. El lugar que guardé en la otra solución, es decir, evitando la necesidad de hacerloStringTrim
, es agregando siempre-0
: si el número binario termina1
, entonces esta expresión termina en...I-0
lo que no afecta su valor; mientras que si el número binario termina en '0', entonces esta expresión termina en la...+-0
que se analiza como "agregar 0 negativo" y, por lo tanto, elimina el signo más final.fuente
Matlab, 99 bytes
Casos de prueba:
fuente
Haskell,
102918987 bytesSe divide repetidamente por dos y comprueba el bit. Mantiene un acumulador de
i^(number of odds)
dondea+b*i
está codificado como[a,b]
y*i
es[a,b]↦[-b,a]
(rotación de 90 grados). La inicial(*2)
es evitar una búsqueda para el primer bit.Uso (gracias a @OwenMorgan por los ejemplos):
fuente
Java, 172 bytes
fuente
Clojure, 183 bytes
¿Se me permite hacer esto?
Use la función así:
fuente
En realidad , 35 bytes
Pruébalo en línea!
Explicación:
Código de Python 3 aproximadamente equivalente:
Pruébalo en línea!
fuente
'0@s
y usar``░
para recortar cualquier cadena vacía final debería ahorrarle cuatro bytes.Jalea , 10 bytes
Esto no es mejor que la respuesta Jelly de Dennis, pero de todos modos quería probar suerte con una respuesta Jelly. Sugerencias de golf bienvenidas! Pruébalo en línea!
Ungolfing
fuente
1 => 1 => 1j
es equivalente a2 => 10 => 1 => 1j
.Actualmente , 15 bytes
Sugerencias de golf bienvenidas! Pruébalo en línea!
No golfista:
fuente
Axioma,
140, 131, 118108bytes% i es el costante imaginario.
resultados
fuente
Perl 6 ,
4046 bytesSe me ocurrió esto bastante rápido
Desafortunadamente, actualmente es inexacto en la implementación de Rakudo en MoarVM .
say i ** 3; # -1.83697019872103e-16-1i
Así que tuve que hacer lo siguiente mejor:
Expandido:
Prueba:
fuente
PHP, 87 bytes
Casi lo mismo que la solución de ETHproductions; solo iterativo en lugar de recursivo.
Toma datos de la línea de comandos, establece variables
${0}
y${1}
.fuente
TI-Basic (TI-84 Plus CE), 70 bytes
No hay una función integrada para convertir en una cadena binaria (ni tampoco para analizar una cadena), por lo que este programa se divide manualmente por 2, incrementa N cada vez que ve un 1 y agrega i ^ N a S (N> 0) y reinicia N si ve un cero.
fuente
Java , 100 bytes
Pruébalo en línea!
fuente
R , 54 bytes
Pruébalo en línea!
n%/%2^(0:log2(n))%%2
calcula un vector de los dígitos binarios. Usando la codificación de longitud de ejecución, usamos Rcomplex
tipo para calcular la suma apropiada, multiplicando por elx$values
para eliminar los ceros.Devuelve un
complex
vector de un elemento.fuente