Vamos criar um mapeamento subjetivo simples de números inteiros positivos para números gaussianos , que são números complexos em que as partes reais e imaginárias são números inteiros.
Dado um número inteiro positivo, por exemplo 4538
, expresse-o em binário sem líderes 0
:
4538 base 10 = 1000110111010 base 2
Remova qualquer trilha 0
:
100011011101
Substitua qualquer execução de uma ou mais 0
por uma única +
:
1+11+111+1
Substitua todos 1
por i
:
i+ii+iii+i
Avalie a expressão complexa resultante e produza o número inteiro gaussiano simplificado:
i+ii+iii+i = i+i*i+i*i*i+i = 2i+i^2+i^3 = 2i+(-1)+(-i) = -1+i
A saída pode ser expressa de uma maneira matemática tradicional ou fornecida como dois números inteiros separados para as partes real e complexa. Por 4538
exemplo, qualquer um deles seria bom:
-1+i
i-1
-1+1i
(-1, 1)
-1 1
-1\n1
Para entradas como 29
, saídas de Mathy formatado como 0
, 0i
ou 0+0i
são todos muito bem.
Usar j
(ou qualquer outra coisa) em vez de i
é bom se isso for mais natural para o seu idioma.
O código mais curto em bytes vence.
fonte
4+2j
->100+10j
...Respostas:
MATL , 7 bytes
Experimente online!
Como funciona
Considere entrada,
4538
por exemplo.fonte
Geléia , 8 bytes
Experimente online!
Como funciona
fonte
Python 2, 53 bytes
Estou tentando golfe isso e parece golfable, mas estou sem idéias atm ...
fonte
(k or 1)
não parece ideal, mas a única coisa que posso pensar é(k+0**k)
...0**k
não funciona para complexok
...Mathematica,
4438 bytesExplicação
Converta a entrada na base 2. (
4538
torna-se{1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0}
)Multiplique por
I
({1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0}
se torna{I, 0, 0, 0, I, I, 0, I, I, I, 0, I, 0}
)Dividir por execuções (
{I, 0, 0, 0, I, I, 0, I, I, I, 0, I, 0}
torna-se{{I}, {0, 0, 0}, {I, I}, {0}, {I, I, I}, {0}, {I}, {0}}
)Encontre o produto no nível 2. (
{{I}, {0, 0, 0}, {I, I}, {0}, {I, I, I}, {0}, {I}, {0}}
torna-se{I, 0, -1, 0, -I, 0, I, 0}
)Soma o resultado. (
{I, 0, -1, 0, -I, 0, I, 0}
torna-se-1 + I
)fonte
Tr[Times@@@(I*Split@RealDigits[#,2][[1]])]&
I
primeiro, masIntegerDigits
acabei sendo mais curta.Python 2 ,
777671 bytesGraças a @ZacharyT por jogar fora um byte!
Experimente online!
fonte
JavaScript (ES6),
6764 bytesSaídas como uma matriz de 2 elementos.
Explicação
Como o JavaScript não possui números imaginários, precisamos acompanhar as partes reais e imaginárias em variáveis separadas. A maneira mais fácil de fazer isso é em uma única matriz, com a parte real primeiro. i é representado como [0,1] , i 2 (ou -1 ) como [-1,0] , i 3 (ou -i ) como [0, -1] e i 4 (ou 1 ) como [1 , 0] .
Primeiro, dividimos repetidamente o número por 2, coletando cada corrida de uma na sua representação binária. Cada série de n corresponde a i n . Isso corresponde à adição de 1 - (n & 2) ao item no índice n & 1 na matriz de dois itens. Então é isso que fazemos.
Provavelmente devo acrescentar mais explicações, mas não consigo pensar no que mais precisa ser explicado. Sinta-se livre para comentar com qualquer dúvida que possa ter.
fonte
Python,
1991291241169490716361 bytesA entrada é apenas o número em si.
A saída está no formato
(a+bj)
, ondej
está a unidade imaginária.0j
será produzido em vez de(0+0j)
Primeiro converta para binário. Trunque a
'0b'
desativação. Mate os zeros à direita. Divida usando um bloco de zero (s) como delimitador. Mapeie cada bloco para1j ** len
. Então, pegue a soma da coisa toda.-70 bytes por não converter em vantagens. Regex de
-5 bytes é mais curto.
-8 bytes , livrando-se das duas variáveis desnecessárias que estavam sendo chamadas apenas uma vez.
-22 bytes usando números complexos em vez da minha coisa estranha. Obrigado à resposta do @Dennis 'por me informar sobre números complexos!
-4 bytes ao perceber que essa
map
é apenas uma maneira sofisticada de compreender a lista, exceto por mais tempo.-19 bytes , alternando para um método ligeiramente arcano de evitar erros
j ** 0
e regex. Inspirado pelo comentário de @ Griffin. Obrigado! :)-8 bytes movendo a
if
peça até o fim.-2 bytes Agradecemos ao @Griffin por salvar 2 bytes removendo os colchetes para torná-lo uma expressão de gerador!
fonte
sum(1j**x.count('1')for x in bin(input()).split('0')if x)
1
blocos e não usa regex como o meu. Além disso, não quero roubar o código de você, pois é muito melhor que a minha versão. :)1
s em vez de comprimento, ela tira a0x
parte da frente primeiro. Obrigado pela idéia de mover oif
para o fim; Eu nunca saberia que funciona de outra maneira!MATLAB, 58 bytes
Vamos usar
285
para ilustrar o processo:Felizmente
1+++1
se comporta exatamente como1+1
no MATLAB, de modo que os avalia acima para:1+111+1
.Agora, essa
strrep
chamada é a verdadeira jóia! Através da inserçãoi*1
para1
nós conseguir algo muito bom. Se houver apenas um1
, simplesmente obtemosi*1
qual éi
. Se houver mais de uma, em seguida,i*1
se repete e concatenadas em uma seqüência:i*1i*1i*1i*1
. Desdei==1i
em MATLAB e1i*1==i
isso simplesmente é:i*i*i*i
.Anexar
.0
parece desnecessário aqui, mas é necessário se o último caractere detemp3
for a+
. Não podemos acrescentar apenas um zero, pois isso dariai*10
no caso acima e, portanto, o resultado errado.E finalmente:
Isso não funciona no Octave por vários motivos.
strrep
não pode aceitar valores ASCII como entrada, ele precisa dos caracteres reais (em'0'
vez de48
). Além disso,+++
não avalia apenas+
no Octave, pois isso quebraria os atalhos de incremento / decrementox++
ex--
.fonte
eval
:-P Você não pode usar em1i
vez de1*i
?i*1
parte ...Pitão - 15 bytes
Frustrantemente longo.
Conjunto de Teste .
fonte
Mathematica, 84 bytes
Função anônima. Pega um número como entrada e retorna um número complexo como saída.
fonte
Mathematica, 75 bytes
Independentemente, surgiu quase a mesma solução que o LegionMammal978 postou 23 minutos atrás! Substituir
1
porI
(que é o símbolo interno do Mathematica para a raiz quadrada de -1) funciona porque os espaços são tratados como multiplicação de expressões vizinhas. O lugar que salvei na outra solução, ou seja, evitando a necessidadeStringTrim
, é sempre acrescentando-0
: se o número binário termina1
, então essa expressão termina no...I-0
que não afeta seu valor; enquanto se o número binário termina em '0', essa expressão termina na...+-0
qual é analisada como "adicione 0 negativo" e, assim, se livra do sinal de adição à direita.fonte
Matlab, 99 bytes
Casos de teste:
fonte
Haskell,
102918987 bytesDivide repetidamente por dois e verifica o bit. Mantém um acumulador de
i^(number of odds)
ondea+b*i
é codificado como[a,b]
e*i
é[a,b]↦[-b,a]
(rotação de 90 graus). A inicial(*2)
é evitar uma pesquisa para o primeiro bit.Uso (obrigado a @OwenMorgan pelos exemplos):
fonte
Java, 172 bytes
fonte
Clojure, 183 bytes
Posso fazer isso?
Use a função da seguinte maneira:
fonte
Na verdade , 35 bytes
Experimente online!
Explicação:
Código Python 3 aproximadamente equivalente:
Experimente online!
fonte
'0@s
e usar``░
para aparar qualquer sequência vazia à direita deve economizar quatro bytes.Gelatina , 10 bytes
Isso não é melhor do que a resposta de Dennis Jelly, mas eu queria tentar de qualquer maneira uma resposta de Jelly. Sugestões de golfe são bem-vindas! Experimente online!
Ungolfing
fonte
1 => 1 => 1j
é equivalente a2 => 10 => 1 => 1j
.Na verdade , 15 bytes
Sugestões de golfe são bem-vindas! Experimente online!
Ungolfing:
fonte
Axioma,
140, 131, 118108 bytes% i é o cliente imaginário.
resultados
fonte
Perl 6 ,
4046 bytesEu vim com isso rapidamente
Infelizmente, atualmente é impreciso na implementação do Rakudo no MoarVM .
say i ** 3; # -1.83697019872103e-16-1i
Então eu tive que fazer a próxima melhor coisa:
Expandido:
Teste:
fonte
PHP, 87 bytes
Quase o mesmo que a solução ETHproductions; apenas iterativo em vez de recursivo.
Pega entrada da linha de comando, define variáveis
${0}
e${1}
.fonte
TI-Basic (TI-84 Plus CE), 70 bytes
Não há um builtin para converter em uma string binária (nem existe para analisar uma string); portanto, este programa divide-se manualmente por 2, incrementando N cada vez que vê 1 e adicionando i ^ N a S (N> 0) e redefinindo N se vir um zero.
fonte
Java , 100 bytes
Experimente online!
fonte
R , 54 bytes
Experimente online!
n%/%2^(0:log2(n))%%2
calcula um vetor dos dígitos binários. Usando a codificação de execução, usamos R'scomplex
tipo para calcular a soma apropriada, multiplicando pelax$values
para remover zeros.Retorna um
complex
vetor de um elemento.fonte