Sudah diketahui bahwa ada korespondensi satu-ke-satu antara pasangan bilangan bulat dan bilangan bulat positif. Tugas Anda adalah menulis kode yang mendefinisikan korespondensi tersebut (dengan mendefinisikan sepasang fungsi / program yang saling berlawanan) dalam bahasa pemrograman pilihan Anda, ditambah pemeriksaan kebenaran (lihat di bawah) dengan jumlah byte terkecil untuk korespondensi definisi (tidak memperhitungkan kebenaran).
Solusinya harus meliputi:
definisi fungsi / program f memiliki dua argumen integer dan mengembalikan integer (itu adalah satu arah dari bijection).
baik definisi fungsi / program g memiliki satu argumen integer dan mengembalikan sepasang integer (mungkin array, daftar, gabungan dari dua integer yang dipisahkan oleh sesuatu ...) atau dua fungsi / program a dan b memiliki argumen integer dan mengembalikan integer (itulah arah lain).
potongan kode tambahan memeriksa bahwa untuk f dan g (atau f dan a, b) yang Anda tetapkan di atas, Anda memiliki g (f (x, y)) = (x, y) (atau a (f (x, y) ) = x dan b (f (x, y)) = y) untuk setiap bilangan bulat x, y dalam kisaran -100 <x <100, -100 <y <100. Perhatikan bahwa f dan g harus bekerja untuk nilai di luar kisaran ini juga.
Anda dapat mengganti nama a, b, f atau g tentu saja. Kedua solusi tidak harus ditulis dalam bahasa yang sama.
Di bawah ini adalah solusi yang tidak optimal sama sekali dalam PARI / GP, dengan 597 karakter untuk definisi fungsi.
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]);
}
dan kode pemeriksaan kebenaran:
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
singkatan n
-tuples adalah bahwa operator yang dihilangkan bukan perkalian (berpasangan) tetapi produk Cartesian. Z^2 = ZxZ
.