Người ta biết rằng có các tương ứng một-một giữa các cặp số nguyên và số nguyên dương. Nhiệm vụ của bạn là viết mã xác định sự tương ứng như vậy (bằng cách xác định một cặp hàm / chương trình là nghịch đảo của nhau) bằng ngôn ngữ lập trình bạn chọn, cộng với kiểm tra tính chính xác (xem bên dưới) với số byte nhỏ nhất cho sự tương ứng định nghĩa (không tính đến tính chính xác).
Giải pháp phải bao gồm:
định nghĩa của hàm / chương trình f có hai đối số nguyên và trả về một số nguyên (đó là một hướng của mệnh đề).
hoặc định nghĩa của hàm / chương trình g có một đối số nguyên và trả về một cặp số nguyên (có thể là một mảng, một danh sách, nối hai số nguyên cách nhau bởi một số ...) hoặc hai hàm / chương trình a và b có một đối số nguyên và trả về một số nguyên (đó là hướng khác).
một đoạn mã bổ sung kiểm tra rằng đối với f và g (hoặc f và a, b) bạn đã xác định ở trên, bạn có g (f (x, y)) = (x, y) (hoặc a (f (x, y) ) = x và b (f (x, y)) = y) cho mọi số nguyên x, y trong phạm vi -100 <x <100, -100 <y <100. Lưu ý rằng f và g phải hoạt động cho các giá trị bên ngoài của phạm vi này là tốt.
Bạn có thể đổi tên a, b, f hoặc g tất nhiên. Hai giải pháp không phải được viết bằng cùng một ngôn ngữ.
Dưới đây là một giải pháp không tối ưu ở tất cả trong PARI / GP, với 597 ký tự cho các định nghĩa hàm.
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]);
}
và mã kiểm tra tính chính xác:
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
là viết tắt của n
-tuples là toán tử bị bỏ qua không phải là phép nhân (cặp đôi) mà là sản phẩm của Cartesian. Z^2 = ZxZ
.