整数のペアと正の整数の間の1対1の対応
整数のペアと正の整数の間に1対1の対応があることはよく知られています。あなたのタスクは、選択したプログラミング言語で(互いに逆の関数/プログラムのペアを定義することによって)そのような対応を定義するコードを記述し、対応のバイト数が最小の正当性チェック(下記を参照)を行うことです。定義(正当性チェックを考慮しない)。 ソリューションには以下を含める必要があります。 2つの整数引数を持ち、整数を返す関数/プログラムfの定義(全単射の1方向です)。 1つの整数引数を持ち、整数のペア(配列、リスト、何かで区切られた2つの整数の連結など)を返す関数/プログラムgの定義、または2つの関数/プログラムaおよびbのいずれか整数の引数と整数を返します(それが反対方向です)。 上記で定義したfとg(またはfとa、b)について、g(f(x、y))=(x、y)(またはa(f(x、y) )= xおよびb(f(x、y))= y)整数<x、y>の場合、-100 <x <100、-100 <y <100。fおよびgは、外部の値に対して機能する必要があることに注意してください。この範囲の。 もちろん、a、b、f、gの名前を変更できます。2つのソリューションを同じ言語で記述する必要はありません。 以下は、PARI / GPでの最適ではないソリューションで、関数定義に597文字を使用しています。 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]); } と正当性チェックコード: accu=List([]) m=100; for(x=-m,m,for(y=-m,m,if(line_to_plane(plane_to_line(x,y))!=[x,y],\ …