Es ist bekannt, dass es Eins-zu-Eins-Entsprechungen zwischen Ganzzahlpaaren und den positiven Ganzzahlen gibt. Ihre Aufgabe ist es, Code zu definieren, der eine solche Korrespondenz definiert (indem Sie ein Paar von Funktionen / Programmen definieren, die invers zueinander sind), in einer Programmiersprache Ihrer Wahl sowie eine Korrektheitsprüfung (siehe unten) mit der kleinsten Anzahl von Bytes für die Korrespondenz Definition (ohne Berücksichtigung der Korrektheitsprüfung).
Die Lösung muss Folgendes umfassen:
die Definition einer Funktion / eines Programms f mit zwei ganzzahligen Argumenten und der Rückgabe einer ganzen Zahl (das ist eine Richtung der Bijektion).
entweder die Definition einer Funktion / eines Programms g mit einem Ganzzahlargument und die Rückgabe eines Paares von Ganzzahlen (kann ein Array, eine Liste, die Verkettung der beiden durch etwas getrennten Ganzzahlen sein ...) oder zwei Funktionen / Programme a und b mit ein ganzzahliges Argument und die Rückgabe einer Ganzzahl (das ist die andere Richtung).
Ein zusätzliches Code-Snippet überprüft, ob für das oben definierte f und g (oder f und a, b) g (f (x, y)) = (x, y) (oder a (f (x, y)) gilt. ) = x und b (f (x, y)) = y) für alle ganzen Zahlen x, y im Bereich -100 <x <100, -100 <y <100. Beachten Sie, dass f und g für Werte außerhalb arbeiten müssen auch in diesem Bereich.
Sie können natürlich a, b, f oder g umbenennen. Die beiden Lösungen müssen nicht in derselben Sprache geschrieben sein.
Im Folgenden finden Sie eine überhaupt nicht optimale Lösung in PARI / GP mit 597 Zeichen für die Funktionsdefinitionen.
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]);
}
und den Korrektheitsprüfcode:
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
steht für n
-tuples, dass der ausgelassene Operator keine (paarweise) Multiplikation ist, sondern das kartesische Produkt. Z^2 = ZxZ
.