Mari kita buat pemetaan surjektif yang sederhana dari bilangan bulat positif ke bilangan bulat Gaussian , yang merupakan bilangan kompleks di mana bagian nyata dan imajiner adalah bilangan bulat.
Diberikan bilangan bulat positif, misalnya 4538
, ungkapkan dalam biner tanpa pemimpin 0
:
4538 base 10 = 1000110111010 base 2
Hapus jejak apa pun 0
:
100011011101
Ganti setiap menjalankan satu atau lebih 0
dengan satu +
:
1+11+111+1
Ganti semua 1
dengan i
:
i+ii+iii+i
Mengevaluasi ekspresi kompleks yang dihasilkan dan menampilkan bilangan bulat Gaussian yang disederhanakan:
i+ii+iii+i = i+i*i+i*i*i+i = 2i+i^2+i^3 = 2i+(-1)+(-i) = -1+i
Keluaran dapat diekspresikan dalam cara matematika tradisional, atau diberikan sebagai dua bilangan bulat terpisah untuk bagian nyata dan kompleks. Sebagai 4538
contoh, semua ini akan baik-baik saja:
-1+i
i-1
-1+1i
(-1, 1)
-1 1
-1\n1
Untuk input seperti 29
, mathy diformat output seperti 0
, 0i
atau 0+0i
semua baik-baik saja.
Menggunakan j
(atau sesuatu yang lain) alih-alih i
baik-baik saja jika itu lebih alami untuk bahasa Anda.
Kode terpendek dalam byte menang.
sumber
4+2j
->100+10j
...Jawaban:
MATL , 7 byte
Cobalah online!
Bagaimana itu bekerja
Pertimbangkan input
4538
misalnya.sumber
Jelly , 8 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Python 2, 53 byte
Sudah mencoba bermain golf ini dan sepertinya bisa golf tetapi saya kehabisan ide ...
sumber
(k or 1)
sepertinya tidak optimal, tetapi satu-satunya hal lain yang dapat saya pikirkan adalah(k+0**k)
...0**k
tidak bekerja untuk kompleksk
...Mathematica,
4438 bytePenjelasan
Ubah input menjadi basis 2. (
4538
menjadi{1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0}
)Kalikan dengan
I
({1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0}
menjadi{I, 0, 0, 0, I, I, 0, I, I, I, 0, I, 0}
)Dibagi dengan berjalan (
{I, 0, 0, 0, I, I, 0, I, I, I, 0, I, 0}
menjadi{{I}, {0, 0, 0}, {I, I}, {0}, {I, I, I}, {0}, {I}, {0}}
)Temukan produk di level 2. (
{{I}, {0, 0, 0}, {I, I}, {0}, {I, I, I}, {0}, {I}, {0}}
menjadi{I, 0, -1, 0, -I, 0, I, 0}
)Jumlahkan hasilnya. (
{I, 0, -1, 0, -I, 0, I, 0}
menjadi-1 + I
)sumber
Tr[Times@@@(I*Split@RealDigits[#,2][[1]])]&
I
dulu, tetapiIntegerDigits
akhirnya menjadi lebih pendek.Python 2 ,
777671 byteBerkat @ ZacharyT untuk bermain golf 1 byte!
Cobalah online!
sumber
JavaScript (ES6),
6764 byteOutput sebagai array 2-elemen.
Penjelasan
Karena JavaScript tidak memiliki angka imajiner, kami harus melacak bagian nyata dan imajiner dalam variabel terpisah. Cara termudah untuk melakukan ini adalah dalam satu array, dengan bagian yang sebenarnya terlebih dahulu. i direpresentasikan sebagai [0,1] , i 2 (atau -1 ) sebagai [-1,0] , i 3 (atau -i ) sebagai [0, -1] , dan i 4 (atau 1 ) sebagai [1 , 0] .
Pertama, kami berulang kali membagi angka dengan 2, mengumpulkan setiap run yang ada dalam representasi binernya. Setiap run n yang sesuai dengan i n . Ini sesuai dengan menambahkan 1 - (n & 2) ke item di indeks n & 1 di array dua item. Jadi itu yang kita lakukan.
Saya mungkin harus menambahkan lebih banyak penjelasan, tetapi saya tidak bisa memikirkan apa lagi yang perlu dijelaskan. Jangan ragu untuk berkomentar dengan pertanyaan yang mungkin Anda miliki.
sumber
Python,
1991291241169490716361 byteInput hanyalah nomor itu sendiri.
Output dalam format
(a+bj)
, di manaj
unit imajiner.0j
akan menjadi output, bukan(0+0j)
Konversi pertama ke biner. Pangkas
'0b'
off. Bunuh nol yang tertinggal. Berpisah menggunakan blok nol sebagai pembatas. Petakan setiap blok1j ** len
. Lalu, ambil jumlah keseluruhannya.-70 byte dengan tidak mengonversi ke plus. Regex
-5 byte lebih pendek.
-8 byte dengan menyingkirkan dua variabel yang tidak perlu yang hanya dipanggil sekali.
-22 byte dengan menggunakan bilangan kompleks, bukan hal aneh saya. Terima kasih atas jawaban @Dennis karena memberi tahu saya tentang angka-angka kompleks!
-4 byte dengan menyadari bahwa
map
itu hanya cara mewah untuk melakukan pemahaman daftar, kecuali lebih lama.-19 byte dengan beralih ke metode yang sedikit misterius untuk menghindari kesalahan dengan
j ** 0
dan menghindari regex. Terinspirasi oleh komentar @ Griffin. Terima kasih! :)-8 byte dengan memindahkan
if
bagian ke ujung.-2 byte Terima kasih kepada @Griffin karena telah menghemat 2 byte dengan menghapus tanda kurung siku untuk menjadikannya ekspresi generator!
sumber
sum(1j**x.count('1')for x in bin(input()).split('0')if x)
1
blok yang berbeda dan tidak menggunakan regex seperti yang saya lakukan. Juga, saya tidak ingin mencuri kode dari Anda karena jauh lebih baik daripada versi saya. :)1
s alih-alih panjang, ia mengambil0x
bagian dari depan terlebih dahulu. Terima kasih atas gagasan untuk memindahkanif
sampai akhir; Saya tidak akan pernah tahu itu bekerja sebaliknya!MATLAB, 58 byte
Mari kita gunakan
285
untuk menggambarkan proses:Untungnya
1+++1
berperilaku seperti1+1
di MATLAB, sehingga mengevaluasi atas untuk:1+111+1
.Sekarang ini
strrep
-call adalah permata yang sebenarnya! Dengan memasukkani*1
untuk1
kita mendapatkan sesuatu yang sangat bagus. Jika hanya ada satu1
, kami hanya mendapatkani*1
yangi
. Jika ada lebih dari satu makai*1
akan diulang dan rubah menjadi berurutan:i*1i*1i*1i*1
. Karenai==1i
di MATLAB dan1i*1==i
ini adalah sederhana:i*i*i*i
.Menambahkan
.0
tampaknya tidak perlu di sini, tetapi diperlukan jika karakter terakhirtemp3
adalah a+
. Kami tidak dapat menambahkan hanya nol, karena itu akan memberii*10
dalam kasus di atas dan karenanya hasil yang salah.Dan akhirnya:
Ini tidak berfungsi di Octave karena beberapa alasan.
strrep
tidak dapat mengambil nilai ASCII sebagai input, ini membutuhkan karakter yang sebenarnya ('0'
bukan48
). Juga,+++
tidak mengevaluasi hanya+
dalam Oktaf, karena itu akan merusak pintasan kenaikan / penguranganx++
danx--
.sumber
eval
:-P Tidak bisakah Anda menggunakan1i
bukan1*i
?i*1
perannya ...Pyth - 15 byte
Sangat panjang.
Test Suite .
sumber
Mathematica, 84 byte
Fungsi anonim. Mengambil nomor sebagai input dan mengembalikan nomor kompleks sebagai output.
sumber
Mathematica, 75 byte
Independen datang dengan solusi yang hampir sama yang diposting LegionMammal978 23 menit yang lalu! Mengganti
1
denganI
(yang merupakan simbol internal Mathematica untuk akar kuadrat dari -1) berfungsi karena spasi diperlakukan sebagai perkalian dari ekspresi tetangga. Tempat saya menghemat solusi lain, yaitu dengan menghindari kebutuhanStringTrim
, adalah dengan selalu menambahkan-0
: jika angka biner berakhir1
, maka ungkapan ini berakhir...I-0
yang tidak mempengaruhi nilainya; sementara jika angka biner berakhir dengan '0', maka ekspresi ini berakhir dengan...+-0
yang diuraikan sebagai "tambahkan negatif 0" dan dengan demikian menghilangkan tanda tambah yang mengekor.sumber
Matlab, 99 Bytes
Kasus uji:
sumber
Haskell,
102918987 byteMembagi dua kali dan memeriksa bit. Terus akumulator dari
i^(number of odds)
manaa+b*i
dikodekan sebagai[a,b]
dan*i
merupakan[a,b]↦[-b,a]
(rotasi 90 derajat). Inisial(*2)
adalah untuk menghindari pencarian untuk bit pertama.Penggunaan (terima kasih kepada @OwenMorgan untuk contohnya):
sumber
Java, 172 byte
sumber
Clojure, 183 byte
Apakah saya diizinkan melakukan ini?
Gunakan fungsi seperti ini:
sumber
Sebenarnya , 35 byte
Cobalah online!
Penjelasan:
Kode Python 3 yang hampir sama:
Cobalah online!
sumber
'0@s
dan menggunakan``░
untuk memangkas setiap string kosong trailing akan menghemat empat byte.Jeli , 10 byte
Ini tidak lebih baik daripada jawaban Jelly Dennis, tetapi saya ingin tetap mencoba jawaban Jelly. Selamat datang saran bermain golf! Cobalah online!
Tidak melakukanolf
sumber
1 => 1 => 1j
sama dengan2 => 10 => 1 => 1j
.Sebenarnya , 15 byte
Selamat datang saran bermain golf! Cobalah online!
Tidak melakukan pelanggaran:
sumber
Aksioma,
140, 131, 118108 byte% I adalah costant imajiner. Tidak tahu
hasil
sumber
Perl 6 ,
4046 byteSaya datang dengan ini cukup cepat
Sayangnya saat ini tidak akurat dalam implementasi Rakudo di MoarVM .
say i ** 3; # -1.83697019872103e-16-1i
Jadi saya harus melakukan hal terbaik berikutnya:
Diperluas:
Uji:
sumber
PHP, 87 byte
Hampir sama dengan solusi ETHproductions; hanya iteratif dan bukan rekursif.
Mengambil input dari baris perintah, menetapkan variabel
${0}
dan${1}
.sumber
TI-Basic (TI-84 Plus CE), 70 byte
Tidak ada builtin untuk mengkonversi ke string biner, (juga tidak ada untuk mengurai string), jadi program ini secara manual membaginya dengan 2, menambah N setiap kali melihat 1 dan menambahkan i ^ N ke S (N> 0) dan mengatur ulang N jika melihat nol.
sumber
Java , 100 byte
Cobalah online!
sumber
R , 54 byte
Cobalah online!
n%/%2^(0:log2(n))%%2
menghitung vektor dari angka biner. Menggunakan pengkodean run-length, kami menggunakancomplex
tipe R untuk menghitung jumlah yang sesuai, dikalikan denganx$values
untuk menghapus nol.Mengembalikan
complex
vektor satu elemen.sumber