Latar Belakang
Sudah terkenal dalam matematika bahwa bilangan bulat dapat dimasukkan ke dalam korespondensi satu-ke-satu dengan pasangan bilangan bulat. Ada banyak cara yang memungkinkan untuk melakukan ini, dan dalam tantangan ini, Anda akan menerapkan salah satunya dan operasi terbalik.
Tugas
Masukan Anda adalah bilangan bulat positif n > 0
. Hal ini diketahui bahwa terdapat bilangan bulat non-negatif yang unik a, b ≥ 0
sehingga . Output Anda adalah "versi terbalik" , bilangan bulat positif .n == 2a * (2*b + 1)
n
2b * (2*a + 1)
Anda dapat mengasumsikan bahwa input dan output sesuai dengan tipe data integer unsigned standar bahasa Anda.
Aturan dan penilaian
Anda dapat menulis program lengkap atau fungsi. Hitungan byte terendah menang, dan celah standar tidak diizinkan.
Uji kasus
Ini diberikan dalam format in <-> out
, karena fungsi yang akan diterapkan adalah kebalikannya sendiri: jika Anda memberi umpan balik ke hasilnya, Anda harus mendapatkan input asli.
1 <-> 1
2 <-> 3
4 <-> 5
6 <-> 6
7 <-> 8
9 <-> 16
10 <-> 12
11 <-> 32
13 <-> 64
14 <-> 24
15 <-> 128
17 <-> 256
18 <-> 48
19 <-> 512
20 <-> 20
28 <-> 40
30 <-> 384
56 <-> 56
88 <-> 224
89 <-> 17592186044416
Papan peringkat
Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa. Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
## Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir dalam tajuk:
## Perl, 43 + 2 (-p flag) = 45 bytes
Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
sumber
Jawaban:
Jelly ,
171615 byteCobalah online!
Bagaimana itu bekerja
sumber
Pyth,
1615 byteTerima kasih 1 byte untuk Dennis
Suite uji
Penjelasan:
sumber
MATL , 22 byte
Cobalah online!
Penjelasan
sumber
Q
untuk1+
(ini telah diperkenalkan baru-baru ini) danq
untuk1-
. Itu juga menghemat ruang (yang bisa Anda simpan dengan cara lainH
). Lihat di siniPython 2, 39 byte
n & -n
memberikan kekuatan terbesar 2 yang membelahn
. Ini bekerja karena dalam aritmatika dua-pelengkap-n == ~n + 1
,. Jikan
memiliki k tertinggal angka nol, mengambil pelengkap akan menyebabkan ia memiliki k yang tertinggal. Kemudian menambahkan 1 akan mengubah semua trailing menjadi nol, dan mengubah bit 2 ^ k dari 0 menjadi 1. Jadi-n
diakhiri dengan 1 diikuti oleh k 0 (sama sepertin
), sambil memiliki bit yang berlawanan darin
semua tempat yang lebih tinggi.sumber
n&-n
kerjanya? saya melihat apa yang dilakukan trik ini tetapi tidak seberapa :(n&-n
mengembalikan kekuatan tertinggi 2 yang divdesn
.n & -n
.n=1;exec"c=n&-n;print n,':',2*len(bin(c))-5<<n/2/c;n+=1;"*100
, tetapi dua karakter di belakang solusi terbaik.n
.MATL , 25
26byteIni menggunakan rilis saat ini (10.2.1) dari bahasa / kompiler.
Cobalah online!
Penjelasan
Cukup mudah, berdasarkan kekuatan kasar. Mencoba semua kombinasi a dan b , memilih yang sesuai dan melakukan perhitungan yang diperlukan.
sumber
Julia, 41 byte
Ini adalah fungsi anonim yang menerima integer dan mengembalikan integer. Untuk menyebutnya, tetapkan ke variabel.
Kami mendefinisikan
a
sebagai 1 + eksponen 2 dalam faktorisasi utaman
. Sejakfactor
kembali sebuahDict
, kita dapat menggunakanget
dengan nilai default 0 dalam kasus faktorisasi prima tidak mengandung 2. Kami kanan sedikit pergeserann
oleha
, dan mengambil 2 untuk kekuatan ini. Kami mengalikannya dengan2a-1
untuk mendapatkan hasilnya.sumber
Perl 5, 40 byte
38 byte plus 2 untuk
-p
-p
membaca STDIN ke dalam variabel$_
.$i++,$_/=2until$_%2
kenaikan$i
(yang dimulai dari 0) dan separuh$_
sampai$_
bukan nol mod 2. Setelah itu,$_
adalah faktor ganjil dari angka asli, dan$i
merupakan eksponen 2.$_=2*$i+1<<$_/2-.5
- Sisi kanan=
hanya rumus untuk angka yang dicari: {1 lebih dari dua kali eksponen 2} kali {2 pangkat dari {setengah faktor ganjil dikurangi setengah}}. Tetapi "waktu {2 pangkat dari ...}" dinobatkan sebagai "digeser ke kiri oleh ...". Dan sisi kanan yang ditugaskan$_
.Dan
-p
cetakan$_
.sumber
C, 49 byte
sumber
JavaScript ES6,
3633 bytePemahaman saya adalah bahwa
Math.clz32
ini akan menjadi lebih pendek dari mengutak-atiktoString(2).length
.Sunting: Disimpan 3 byte berkat @ user81655.
sumber
n&-n
ke variabel:n=>63-2*Math.clz32(x=n&-n)<<n/x/2
n&=-n
, tetapi saya perlun
lagi ...PARI / GP , 38 byte
Perhatikan itu
>>
dan\
memiliki prioritas yang sama dan dihitung dari kiri ke kanan, sehingga bagian terakhir bisan>>k\2
lebih daripada(n>>k)\2
. Versi ungolfed akan membuatk
leksikal denganmy
:sumber