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 0con 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 4538ejemplo, 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, 0io 0+0ison todos bien.
Usar j(o algo más) en lugar de iestá 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
4538por 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**kno funcionan para complejosk...Mathematica,
4438 bytesExplicación
Convierta la entrada en la base 2. (se
4538convierte{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]])]&Iprimero, peroIntegerDigitsterminé 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), dondejestá la unidad imaginaria.0jsaldrá 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
mapes 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 ** 0y evitar expresiones regulares. Inspirado por el comentario de @ Griffin. ¡Gracias! :)-8 bytes moviendo la
ifparte 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)1bloques 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. :)1s en lugar de la longitud,0xprimero quita la parte del frente. Gracias por la idea de moverifal final; ¡Nunca hubiera sabido que eso funciona de otra manera!MATLAB, 58 bytes
Usemos
285para ilustrar el proceso:Por suerte
1+++1se comporta igual que1+1en MATLAB, por lo que los evalúa anteriores a:1+111+1.¡Ahora esta
strrepllamada es la verdadera joya! Al insertari*1para1obtener algo realmente agradable. Si solo hay uno1, simplemente obtenemosi*1cuál esi. Si hay más de uno, entoncesi*1se repite y se concatenan en una secuencia:i*1i*1i*1i*1. Dado quei==1ien MATLAB y1i*1==iesto simplemente es:i*i*i*i.Anexar
.0parece innecesario aquí, pero es necesario si el último carácter detemp3es a+. No podemos agregar solo un cero, ya que eso daríai*10en el caso anterior y, por lo tanto, el resultado incorrecto.Y finalmente:
Esto no funciona en Octave por varias razones.
strrepno 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 en1ilugar de1*i?i*1parte ...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
1conI(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-0lo que no afecta su valor; mientras que si el número binario termina en '0', entonces esta expresión termina en la...+-0que 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*iestá codificado como[a,b]y*ies[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@sy 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 => 1jes 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-1iAsí 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))%%2calcula un vector de los dígitos binarios. Usando la codificación de longitud de ejecución, usamos Rcomplextipo para calcular la suma apropiada, multiplicando por elx$valuespara eliminar los ceros.Devuelve un
complexvector de un elemento.fuente