Konversi dari biner ke negabinary

15

Diberikan integer biner secara inklusif antara 0dan1111111111111111 (yaitu bilangan bulat tak bertanda 16-bit) sebagai input, menghasilkan bilangan bulat yang sama di negabinary .

Masukan bisa dalam format apa pun yang paling nyaman untuk bahasa Anda; misalnya, jika lebih mudah bagi program untuk menangani input dengan 16 digit, seperti0000000000000101 , daripada hanya 101, Anda dapat menulis program untuk hanya menerima input seperti itu.

Contoh I / O

> 1
1
> 10
110
> 1010
11110
> 110111001111000
11011001110001000
> 1001001
1011001

Berikut adalah contoh program yang saya tulis yang melakukan konversi basis, termasuk basis negatif dan non-integer. Anda dapat menggunakannya untuk memeriksa pekerjaan Anda.

Peter Olson
sumber
Hanya untuk memperjelas lebih jauh, input dan output harus biner, bukan? Maksud saya: string karakter 0s dan 1s. Tampak jelas bagi saya, tetapi jawaban membuat saya ragu ringan ...
Joanis
@ M. Joanis Inputnya adalah biner, outputnya negatif (yang terlihat persis sama dengan biner - serangkaian angka nol dan satu - tetapi cara penafsirannya berbeda.)
Peter Olson
2
Tautan tampaknya rusak, yang merupakan alasan utama mengapa kami memerlukan pertanyaan untuk mandiri hari ini
Jo King

Jawaban:

6

APL, 21 karakter

'01'[-(16/¯2)⊤-2⊥⍎¨⍞]

Saya menggunakan Dyalog APL untuk ini, dengan ⎕IO set ke 0, memungkinkan kita untuk mengindeks array mulai dari 0 daripada 1.

Penjelasan, dari kanan ke kiri:

  • memberi kami input pengguna sebagai vektor karakter.
  • ⍎¨menerapkan fungsi eksekusi ( ) untuk masing-masing (¨ ) karakter yang disebutkan di atas, menghasilkan vektor bilangan bulat 1 dan 0.
  • 2⊥ mendekode vektor dari basis 2 menjadi desimal.
  • - meniadakan bilangan bulat desimal yang dihasilkan.
  • (16/¯2)⊤mengkodekan bilangan bulat desimal ke basis ¯2(negatif 2). ( 16/¯2Ulangan ¯2, 16kali, menghasilkan 16 digit nomor negabinary kami.)
  • - meniadakan setiap elemen dari nomor kami yang baru disandikan (sebelum ini, terdiri dari -1 dan 0), sehingga kita dapat menggunakannya untuk mengindeks vektor karakter kita.
  • '01'[ ... ]indeks array karakter ( '01') menggunakan 0's dan 1's dari negabinary vector. Ini agar kami mendapatkan hasil yang lebih cantik.

Contoh:

      '01'[-(16/¯2)⊤-2⊥⍎¨⍞]
10111010001
0001101011010001
Dillon Cower
sumber
4

Ruby, 32 31 karakter

m=43690
'%b'%(gets.to_i(2)+m^m)

Menggunakan pintasan perhitungan negabinary .

Stefano Diem Benatti
sumber
Input bukan kode keras. 0xAAAA bukan input, topengnya akan mengubah input. 0xAAAA setara dengan 101010101010101010, yang digunakan dalam operasi XOR untuk mengubah biner menjadi negabinary .. Input itu sendiri berasal dari getskata kunci, yang diambil dari STDIN.
Stefano Diem Benatti
mengubah 0xAAAA menjadi 43690 (yang merupakan angka yang sama dalam desimal) untuk mengurangi jumlah karakter dengan 1. Membuatnya lebih sulit untuk memahami apa yang sedang terjadi.
Stefano Diem Benatti
Ah, baiklah. Saya tidak ruby ​​baik jadi saya tidak yakin. Maaf soal itu.
Rɪᴋᴇʀ
3

GolfScript, 34 29 27 karakter

n*~]2base{.2%\(-2/.}do;]-1%

Pendekatan lurus ke depan. Sangat menarik bahwa versi terpendek adalah versi yang pertama kali dikonversi menjadi angka dan kemudian kembali ke basis -2 (setidaknya versi terpendek yang dapat saya temukan hingga sekarang). Tapi yang menyenangkan dari yang ini adalah, mengandung hampir 15%% .

Edit 1: Untuk basis 2 kita dapat menyimpan satu operasi modulo dan juga bergabung dengan kedua loop.

Sunting 2: Saya menemukan kode yang lebih pendek untuk mengonversi string biner ke integer.

Howard
sumber
3

Haskell, 86 83 Bytes

import Data.Bits
import Data.Digits
c n|m<-0xAAAAAAAA=digits 2$xor(unDigits 2 n+m)m

Panggil menggunakan c dan kemudian array integer untuk digit, mis

c [1,1]

PS: Saya baru, apakah saya mengirimkan ini dengan benar?

EDIT: Menyimpan beberapa byte berkat Laikoni dan juga memperbaiki beberapa kesalahan ketik

EDIT2: Atau, c :: String -> String:

import Data.Bits
import Data.Digits
c n|m<-0xAAAAAAAA=concatMap show.digits 2$xor(unDigits 2(map(read.(:[]))n)+m)m

Untuk 114 byte (tetapi Anda menyebutnya dengan string: c "11")

Nama Tampilan Umum
sumber
Ya, benar! Selamat datang di situs ini! Semoga kamu tetap disini!
R
Selamat datang di PPCG! Anda dapat menjatuhkan tanda kurung undigits 2 n, karena aplikasi fungsi mengikat lebih kuat daripada tanda kurung +m. Anda juga dapat menyimpan beberapa byte dengan mengikat mdalam penjaga: c n|m<-0xAAAAAAAA= ....
Laikoni
2

Python (2.x), 77 karakter

(tidak sesingkat solusi lain karena kebutuhan untuk beralih secara manual ...) Harus memenuhi persyaratan.

i=input();d=""
while i:i,r=i//-2,i%-2;i+=r<0;d+=`r+[0,2][r<0]`
print d[::-1]

Saran untuk perbaikan lebih lanjut dipersilakan!

Beri makan dengan nilai awal seperti ini: 0b1001001

ChristopheD
sumber
2

JavaScript, 68 byte

function(b){for(r='',n=parseInt(b,2);r=(n&1)+r,n>>=1;n=-n);return r}

Akan menjadi 52 byte di ES6, tapi itu pasca-tanggal tantangan:

b=>eval(`for(r='',n=0b${b};r=(n&1)+r,n>>=1;n=-n);r`)
Neil
sumber
2

Jelly , 4 byte, tantangan tanggal kiriman bahasa

Ḅb-2

Cobalah online!

Mengambil input, dan menghasilkan output, sebagai daftar digit.

Penjelasan

Ḅb-2
Ḅ     Convert binary to integer
 b-2  Convert integer to base -2

Ini cukup banyak terjemahan langsung dari spesifikasi.


sumber
Bukankah ini tidak bersaing? Tantangan ini dari '11 ...
NoOneIsHere
Saya melewatkan itu. Saya akan menaruh catatan di header.
1

k, 17 byte tidak bersaing

Beberapa fitur yang digunakan mungkin menunda tantangan.

1_|2!{_.5+x%-2}\2/

Input adalah daftar 1 dan 0, dan output juga daftar 1 dan 0.

Contoh programnya bekerja.

zgrep
sumber
0

PHP, 69 Bytes

for($i=bindec($argn);$i;$i+=$i%2&$c,$i>>=1,$c^=1)$r=($i%2).$r;echo$r;

Versi Online

Jörg Hülsermann
sumber
0

ES8, 54B

b=>eval`for(r='',n=0b${b};r=(n&1)+r,n>>=1;n=-n);r`
pengguna75200
sumber
0

Japt , 4 byte

Input sebagai string biner, output sebagai array digit negabinary.

Íì2n

Cobalah

Atau, mengambil input sebagai array digit biner:

ì2JÉ

Cobalah

Shaggy
sumber