Es bien sabido que hay correspondencias uno a uno entre pares de enteros y los enteros positivos. Su tarea es escribir el código que define dicha correspondencia (definiendo un par de funciones / programas que son inversos entre sí) en el lenguaje de programación de su elección, más una verificación de corrección (ver más abajo) con el menor número de bytes para la correspondencia definición (sin tener en cuenta la verificación de corrección).
La solución debe incluir:
La definición de una función / programa f que tiene dos argumentos enteros y devuelve un entero (esa es una dirección de la biyección).
ya sea la definición de una función / programa g que tiene un argumento entero y devuelve un par de enteros (podría ser una matriz, una lista, la concatenación de los dos enteros separados por algo ...) o dos funciones / programas ayb que tienen un argumento entero y devolver un entero (esa es la otra dirección).
un fragmento de código adicional que comprueba que para f y g (o f y a, b) que definió anteriormente, tiene g (f (x, y)) = (x, y) (o a (f (x, y) ) = x y b (f (x, y)) = y) para cualquier número entero x, y en el rango -100 <x <100, -100 <y <100. Tenga en cuenta que f y g tienen que trabajar para valores fuera de de este rango también.
Puede cambiar el nombre de a, b, f o g, por supuesto. Las dos soluciones no tienen que estar escritas en el mismo idioma.
A continuación se muestra una solución no óptima en absoluto en PARI / GP, con 597 caracteres para las definiciones de funciones.
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]);
}
y el código de verificación de corrección:
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
de las n
tuplas es que el operador omitido no es la multiplicación (en pares) sino el producto cartesiano. Z^2 = ZxZ
.