É sabido que existem correspondências um a um entre pares de números inteiros e números inteiros positivos. Sua tarefa é escrever um código definindo essa correspondência (definindo um par de funções / programas que são inversos um ao outro) na linguagem de programação de sua escolha, além de uma verificação de correção (veja abaixo) com o menor número de bytes para a correspondência definição (sem levar em consideração a verificação de correção).
A solução deve incluir:
a definição de uma função / programa f com dois argumentos inteiros e retornando um número inteiro (essa é uma direção da bijeção).
seja a definição de uma função / programa g com um argumento inteiro e retornando um par de números inteiros (pode ser uma matriz, uma lista, a concatenação dos dois números inteiros separados por algo ...) ou duas funções / programas a e b tendo um argumento inteiro e retornando um número inteiro (essa é a outra direção).
um trecho de código adicional que verifica se, para efeg (ou f e a, b) que você definiu acima, você tem g (f (x, y)) = (x, y) (ou a (f (x, y)) ) = x eb (f (x, y)) = y) para quaisquer números inteiros x, y no intervalo -100 <x <100, -100 <y <100. Observe que f e g precisam trabalhar com valores fora dessa faixa também.
Você pode renomear a, b, f ou g, é claro. As duas soluções não precisam ser escritas no mesmo idioma.
Abaixo está uma solução não ótima em PARI / GP, com 597 caracteres para as definições de função.
plane_to_line(x,y)={
my(ax,ay,z);
ax=abs(x);
ay=abs(y);
if((ax<=ay)*(y<0), z=4*y*y-2*y+x+2;);
if((ax<=ay)*(y>=0), z=4*y*y-2*y-x+2;);
if((ay<=ax)*(x<0), z=4*x*x -y+2;);
if((ay<=ax)*(x>=0)*(y<0), z=4*x*x+4*x+y+2;);
if((ay<=ax)*(x>=0)*(y>=0),z=4*x*x-4*x+y+2;);
if((x==0)*(y==0),z=1;);
return(z);
}
line_to_plane(z)={
my(l,d,x,y);
l=floor((1+sqrt(z-1))/2);
d=z-(4*l*l-4*l+2);
if(d<=l,x=l;y=d;);
if((l<d)*(d<=3*l),x=2*l-d;y=l;);
if((3*l<d)*(d<=5*l),x=(-l);y=4*l-d;);
if((5*l<d)*(d<=7*l),x=d-6*l;y=(-l););
if((7*l<d)*(d<8*l) ,x=l;y=d-8*l;);
if(z==1,x=0;y=0;);
return([x,y]);
}
e o código de verificação da correção:
accu=List([])
m=100;
for(x=-m,m,for(y=-m,m,if(line_to_plane(plane_to_line(x,y))!=[x,y],\
listput(accu,[x,y]);)))
Vec(accu)
Z^n
é n
-tuples é que o operador omitido não é a multiplicação (em pares), mas o produto cartesiano. Z^2 = ZxZ
.