Biasanya, kami menguraikan angka menjadi angka biner dengan menetapkannya dengan kekuatan 2, dengan koefisien
0
atau1
untuk setiap istilah:
25 = 1*16 + 1*8 + 0*4 + 0*2 + 1*1
Pilihan
0
dan1
... tidak terlalu biner. Kami akan melakukan ekspansi biner yang sebenarnya dengan memperluas dengan kekuatan 2, tetapi dengan koefisien1
atau-1
sebaliknya:
25 = 1*16 + 1*8 + 1*4 - 1*2 - 1*1
Sekarang ini terlihat biner.
Dengan angka positif, sepele untuk melihat bahwa:
- Setiap angka ganjil memiliki banyak sekali ekspansi biner sejati
- Setiap angka genap tidak memiliki ekspansi biner yang benar
Oleh karena itu, agar ekspansi biner yang benar dapat didefinisikan dengan baik, kami membutuhkan ekspansi yang paling kecil , yaitu dengan panjang terpendek.
Dengan bilangan bulat positif, ganjil n
, kembalikan ekspansi biner yang sebenarnya, dari digit paling signifikan ke digit paling tidak signifikan (atau dalam urutan terbalik).
Aturan:
- Karena ini adalah kode-golf , Anda harus melakukan ini dalam hitungan byte sesingkat mungkin. Dibangun secara bawaan.
- Output apa pun yang dapat mewakili dan daftar koefisien dapat diterima: array, serangkaian koefisien dengan pemisah, dll ...
- Berlaku celah golf standar.
- Program Anda harus bekerja untuk nilai-nilai dalam ukuran integer standar bahasa Anda.
Uji Kasus
25 -> [1,1,1,-1,-1]
47 -> [1,1,-1,1,1,1]
1 -> [1]
3 -> [1,1]
1234567 -> [1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1]
0
bukan-1
untuk keadaan tegangan rendah. Penelepon yang menerima bit tahu apa artinya. (Ini masih merupakan latihan manipulasi bit non-sepele, karena hak putar hanya berfungsi jika memiliki 32 bit signifikan. Mis. Angka 5-bit membutuhkan lebar putar 5.)111-1-1
output yang valid untuk25
?Jawaban:
Japt , 6 byte
Cobalah online!
Penjelasan:
sumber
Pyth ,
1211 byteCoba di sini!
Bagaimana?
Pertama, kita perhatikan bahwa tugasnya hanyalah "mengganti
0
huruf s dalam biner dengan huruf-1
s dan bergeser ke kanan dengan 1 tempat." - Itulah tepatnya yang harus kita lakukan! Konversi biner memberi kita daftar0
s dan1
s. Semua harus kita lakukan di sini adalah untuk menemukan cara Golfy untuk mengkonversi0
ke-1
. Operator bitwise|
(bitwise OR) adalah teman kami. Peta di atas representasi biner bergeser dengan|
dan-1
. Jika nomor saat ini0
, itu akan dikonversi ke-1
.sumber
Perl 6
Versi string, 31 byte
Cobalah online!
Versi daftar, 36 byte
Cobalah online!
sumber
JavaScript (ES6),
3534 byteCuplikan tes
Tampilkan cuplikan kode
sumber
Perl 6 , 72 byte
Pasti ada cara yang lebih baik, tetapi inilah yang saya miliki ...
Cobalah online!
Penjelasan : Ini adalah fungsi yang membutuhkan satu argumen (
->$a
). Kami pertama-tama mendapatkan jumlah koefisien yang dibutuhkan ($a.base(2).chars
= jumlah karakter dalam representasi basis 2), kemudian membuat produk Cartesian (X
) dari banyak pasangan itu(1,-1)
. ([X]
Berarti: kurangi daftar berikut denganX
.) Jadi, kami mendapatkan daftar semua kemungkinan kombinasi 1s dan -1s. Kemudian kami memfilter (grep
) hanya daftar yang menyandikan nomor yang diberikan$a
. Hanya ada satu, jadi kami mendapatkan daftar satu daftar dengan koefisien.Blok grep melakukan ini: mengambil argumennya sebagai daftar (
@^a
), membalikkannya dan menutupnya dengan daftar tanpa batas0,1,2,...
menggunakan operator "shift bit kiri"+<
. Zipping berhenti segera setelah daftar pendek habis (baik untuk kita!) Kami kemudian menjumlahkan semua hasil dan membandingkannya dengan nomor yang diberikan. Kami harus menggunakan.reverse
karena OP menuntut agar koefisien berada dalam urutan dari yang paling signifikan hingga yang tidak signifikan.sumber
Jelly , 5 byte
Cobalah online!
sumber
05AB1E ,
65 byteCobalah online!
sumber
D<
bisa®
(®
default-1
).J, 11 byte
Cobalah online!
Terima kasih kepada @JosiahWinslow untuk algoritmenya.
Adakah pemikiran untuk mempersingkat konversi? Pikiranku adalah menggunakan
!.
-fit (nvm, itu hanya mengubah toleransi konversi).Menggunakan
{
-membawa lebih lama dengan 1 karakter.sumber
Java 8, 101 byte
Port dari @Oliver 's Japt answer , dengan beberapa byte lagi ..;)
Pasti bisa bermain golf dengan menggunakan pendekatan matematika, bukan pendekatan String ini.
Penjelasan:
Coba di sini.
sumber
R ,
908846 byteCobalah online!
Menerapkan algoritma Oliver , tetapi mengembalikan digit dalam urutan terbalik. Karena kami dijamin
n
tidak pernah genap, bit yang paling tidak signifikan (pertama) selalu1
, jadi kami menghapusnya dan menambahkan1
sampai akhir untuk mensimulasikan rotasi dalam R. Terima kasih kepada Shaggy karena membuat saya memperbaiki matematika saya .Cukup dengan menempatkan
rev( )
fungsi panggilan di footer harus mengembalikan nilai dalam urutan yang sama.jawaban asli, 88 byte:
Fungsi anonim; mengembalikan nilai dalam urutan terbalik dengan nama kolom terlampir.
Cobalah online!
Penjelasan:
sumber
from the most significant digit to the least significant digit (or in reversed order).
karenanya ini harus dapat diterima.25
, misalnya, akan[1,1,1,-1,-1]
atau[-1,-1,1,1,1]
.2*bits - 1
bukan1-2*bits
. Terima kasih.Perl 5 , 30 byte
Kode 29 byte, 1 byte untuk
-p
switch.Cobalah online!
sumber
CJam, 12 byte
Port jawaban Golfscript saya.
sumber
Ruby ,
44 37 3332 byteCobalah online!
sumber
Golfscript,
141314 byte-1 byte karena saya lupa
%
ada. +1 byte karena saya juga lupa input adalah string.sumber
{}
untuk membuatnya menjadi blok. Program lengkap hanya bisa mendapatkan input sebagai string.{2base{.+(}%\}
untuk 15 byte. Demikian pula jawaban CJam Anda.~
.