Criando somas distintas

10

Você deve escrever um programa ou função que receba números inteiros como entrada e produza ou retorne dois números inteiros cuja soma é o primeiro.

Há um requisito adicional: nenhum número pode fazer parte da saída para duas entradas diferentes .

Detalhes

  • Você deve poder manipular entradas para pelo menos o intervalo -32768 .. 32767(inclusive).
  • Se seu tipo de dados não pode lidar com números inteiros arbitrários, tudo bem, mas seu algoritmo deve funcionar para números grandes e pequenos arbitrários na teoria.

Exemplos

Cada bloco mostra uma parte de uma solução correta ou incorreta no formato de input => output.

1 => 6 -5
2 => -2 4
15 => 20 -5

Incorrect, as `-5` is used in two outputs.

-5 => -15 10
0 => 0 0
1 => 5 6
2 => -5 7

Incorrect, as `5 + 6` isn't `1`.

-1 => -1 0
0 => 6 -6
2 => 1 1

Can be correct if other outputs doesn't collide.

Este é um código de golfe, portanto a entrada mais curta vence.

randomra
fonte
Você pode restringir o intervalo de entrada para -32768 .. 32767 para não precisarmos usar números inteiros de 17 bits?
FUZxxl 18/07/2015
@FUZxxl Meu mal, essa era a intenção. Fixo.
Random # 18/07
A saída pode ser uma lista / matriz / tupla / conjunto / etc contendo dois números inteiros? (Por exemplo, f (1) => [2, -1])
monopolo
Parece haver várias soluções que dependem fundamentalmente de um tamanho inteiro restrito - por exemplo, multiplicando a entrada por um grande número positivo e um grande número negativo. Parece-me que essas soluções estão falhando no requisito de que "seu algoritmo funcione para números grandes e pequenos arbitrários na teoria". Estou interpretando mal a pergunta?
mathmandan

Respostas:

9

Pitão, 8 bytes

_J^Q3+QJ

Demonstração. Equivalente ao código Python 2:

Q=input()
J=Q**3
print -J
print Q+J

Então, a saída tem forma (-n**3, n+n**3)

Algumas saídas:

-5 (125, -130)
-4 (64, -68)
-3 (27, -30)
-2 (8, -10)
-1 (1, -2)
 0 (0, 0)
 1 (-1, 2)
 2 (-8, 10)
 3 (-27, 30)
 4 (-64, 68)
 5 (-125, 130)

Elas são distintas porque os cubos são espaçados o suficiente para que a adição nde n**3não seja suficiente para atravessar a lacuna para o próximo cubo: n**3 < n+n**3 < (n+1)**3para positivo ne simetricamente para negativo n.

xnor
fonte
Você não precisa do ,início, duas linhas parecem ser permitidas.
Maltysen
@ Maltysen Tentei removê-lo, mas apenas o segundo número é impresso. Talvez a Jtarefa suprima a impressão?
Xnor
Oh sim, você está certo, desculpe.
Maltysen
-em pyth não é o operador de negação unário, o seu _, então _J^Q3+QJfunciona como esperado.
Maltysen
@ Maltysen Na verdade, isso funciona, eu só preciso Jnão estar do lado de fora. Obrigado por me cutucar sobre isso.
Xnor
8

Boneco de neve 0.1.0 , 101 caracteres

}vg0aa@@*45,eQ.:?}0AaG0`NdE`;:?}1;bI%10sB%nM2np`*`%.*#NaBna!*+#@~%@0nG\]:.;:;bI~0-NdEnMtSsP" "sP.tSsP

Entrada em STDIN, saída separada por espaço em STDOUT.

Isso usa o mesmo método da resposta de isaacg.

Versão comentada com novas linhas, para "legibilidade":

}vg0aa          // get input, take the first char
@@*45,eQ.       // check if it's a 45 (ASCII for -) (we also discard the 0 here)
// this is an if-else
:               // (if)
  ?}0AaG        // remove first char of input (the negative sign)
  0`NdE`        // store a -1 in variable e, set active vars to beg
;
:               // (else)
  ?}1           // store a 1 in variable e, set active vars to beg
;bI             // active variables are now guaranteed to be beg
%10sB           // parse input as number (from-base with base 10)
%nM             // multiply by either 1 or -1, as stored in var e earlier
2np`*`          // raise to the power of 2 (and discard the 2)
%.              // now we have the original number in b, its square in d, and
                //   active vars are bdg
*#NaBna!*+#     // add abs(input number) to the square (without modifying the
                //   input variable, by juggling around permavars)
@~%@0nG\]       // active vars are now abcfh, and we have (0>n) in c (where n is
                //   the input number)
:.;:;bI         // if n is negative, swap d (n^2) and g (n^2+n)
~0-NdEnM        // multiply d by -1 (d is n^2 if n is positive, n^2+n otherwise)
tSsP            // print d
" "sP           // print a space
.tSsP           // print g

Comentário sobre a primeira solução do Snowman no PPCG: Acho que meu objetivo de tornar minha linguagem o mais confusa possível foi alcançado.

Na verdade, isso poderia ter sido muito mais curto, mas sou um idiota e esqueci de implementar números negativos para a análise de string -> number. Então eu tive que verificar manualmente se havia um -como o primeiro caractere e removê-lo, se houver.

Maçaneta da porta
fonte
11
Muito melhor que Brainfuck.
fase
11
Como Ostrich se sente sobre isso? ;)
Kade
6

Pitão, 15 11 bytes

4 bytes graças a @Jakube

*RQ,hJ.aQ_J

Demonstração.

Isso mapeia da seguinte maneira:

0  -> 0, 0
1  -> 2, -1
-1 -> -2, 1
2  -> 6, -4
-2 -> -6, 4

E assim por diante, sempre envolvendo n^2e n^2 + n, mais ou menos.

isaacg
fonte
5

APL, 15 bytes

{(-⍵*3)(⍵+⍵*3)}

Isso cria uma função monádica sem nome que retorna o par -n ^ 3 ( -⍵*3), n + n ^ 3 ( ⍵+⍵*3).

Você pode experimentá-lo online .

Alex A.
fonte
2

Pitão - 11 10 bytes

Apenas multiplica por 10e10 e -10e10 + 1 Obrigado a @xnor por me mostrar que eu poderia usar CGo número.

*CGQ_*tCGQ

Experimente online aqui .

Maltysen
fonte
Você pode fazer um número adequadamente grande como CG.
Xnor
@xnor adicionando à lista de dicas.
Maltysen
2

O , 17 15 9 bytes

Usa alguns novos recursos do O.

Q3 ^ .Q + p_p

Versão antiga

[i # .Z3 ^ * \ Z3 ^) _ *] o
Estágio
fonte
11
Estou começando a desfrutar destas respostas S, embora eu gostaria que ele mais se o intérprete não foi escrito em Java ...;)
kirbyfan64sos
@ kirbyfan64sos Não é tão pequeno quanto o Pyth, mas pode superar o CJam e o GolfScript em alguns casos. Desafiadoramente, pode superar qualquer coisa relacionada a matrizes, pois elas são muito poderosas.
fase
1

Python 3, 29 27

Editar: não atende ao requisito no segundo ponto "Detalhes"

Bônus: funciona de -99998 a 99998 inclusive


lambda n:[99999*n,-99998*n]

Isso cria uma função anônima *, que você pode usar colocando colchetes e depois colocando o argumento entre colchetes da seguinte forma:

(lambda n:[99999*n,-99998*n])(arg)

* Obrigado a @ vioz- por sugerir isso.


Exemplo de entrada / saída:

>>> (lambda n:[99999*n,-99998*n])(1)
[99999, -99998]
>>> (lambda n:[99999*n,-99998*n])(2)
[199998, -199996]
>>> (lambda n:[99999*n,-99998*n])(0)
[0, 0]
>>> (lambda n:[99999*n,-99998*n])(-1)
[-99999, 99998]
>>> (lambda n:[99999*n,-99998*n])(-2)
[-199998, 199996]
>>> (lambda n:[99999*n,-99998*n])(65536)
[6553534464, -6553468928]
monopolo
fonte
11
Bela postagem! Só para você saber, é possível remover f=e deixá-lo como uma função anônima, que ainda é uma resposta válida. Então você pode tomar para baixo sua contagem de bytes a 27 :)
Kade
11
"... seu algoritmo deve funcionar para números grandes e pequenos arbitrários em teoria." Obviamente (lambda n:[99999*n,-99998*n])(99999)e (lambda n:[99999*n,-99998*n])(-99998)irá colidir na teoria (e na prática).
mathmandan
@ mathmandan Você está certo, editarei minha postagem para deixar claro que ela não atende aos requisitos. Eu tentava escrever e testar um novo código, mas estou no celular, longe do meu computador.
Monopole
0

Haskell, 16 bytes

Copiei descaradamente o método do @ xnor. Provavelmente não há muito melhor que isso.

f x=(-x^3,x^3+x)
Lynn
fonte