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)
sumber
Z^n
singkatann
-tuples adalah bahwa operator yang dihilangkan bukan perkalian (berpasangan) tetapi produk Cartesian.Z^2 = ZxZ
.Jawaban:
MATL ,
4336 byteIni menggunakan fungsi
spiral
(1YL
), yang menghasilkan array 2D persegi dari ukuran yang diberikan dengan nilai-nilai yang diatur dalam spiral luar. Misalnya, dengan input7
yang dihasilkannyaPusat array, yang berisi
1
, sesuai dengan tupel[0 0]
. Sudut kiri atas sesuai dengan[-3 -3]
dll. Jadi misalnya f (-3, -3) akan menjadi 43 dan g (43) akan menjadi [-3 -3].Kode menghasilkan array 2D dengan matriks spiral ini, sebesar yang diperlukan untuk melakukan konversi. Perhatikan bahwa ukuran yang lebih besar selalu memberikan hasil yang sama untuk entri yang sudah termasuk dalam ukuran yang lebih kecil.
Dari Z 2 hingga N (18 byte):
Cobalah online!
Dari N hingga Z 2 (
2518 byte)Cobalah online!
Cuplikan untuk diperiksa
Catatan yang
G
perlu dimodifikasi untuk mengakomodasi fakta bahwa kita belum memiliki satu input. Kode lambat, jadi tautan memeriksa tupel dengan nilai dari -9 hingga 9 saja. Untuk -99 hingga 99 cukup ganti baris pertama.Kode menguji setiap tupel dengan nilai dalam rentang yang ditentukan. Itu konversi ke nomor, kemudian dari nomor itu kembali ke tuple, dan kemudian memeriksa apakah tuple asli dan pulih sama. Hasilnya semua harus
1
, menunjukkan bahwa semua perbandingan memberitrue
.Butuh beberapa saat untuk berlari.
Cobalah online!
sumber
JavaScript (ES6), 171 byte
Sedikit memutar-mutar: angka negatif memiliki bit mereka terbalik; setiap bilangan bulat kemudian digandakan, dan 1 ditambahkan jika awalnya negatif; bit dari integer kemudian disisipkan. Operasi mundur menghapus bit alternatif, membaginya dengan 2, dan membalik semua bit jika nilainya negatif. Saya bisa menyimpan 3 byte dengan membatasi diri saya pada nilai 15-bit, bukan nilai 16-bit.
Tampilkan cuplikan kode
sumber
Jelly,
50484645434039 bytePlane to line (
181716 byte ):Cobalah online!
Line to plane (
323029272423 bytes ):Cobalah online!
Penjelasan:
Saya hanya akan menjelaskan
plane to line
, karenaline to plane
justru kebalikannya.Pertama, kami mengonversi setiap bilangan bulat ke bilangan asli, berdasarkan fungsinya
f(x) = 2*|x| - (x<0)
.Kemudian, kami mengonversi dua bilangan asli menjadi dua bilangan alami lainnya, berdasarkan fungsinya
g(x,y) = (x+y,y)
.Akhirnya, kami mengonversinya menjadi satu bilangan alami, berdasarkan fungsinya
h(x,y) = (x+1)C2 + y
sumber
7