Chuyển đổi từ nhị phân sang negabinary


15

Cho một số nguyên nhị phân bao gồm giữa 01111111111111111(tức là số nguyên không dấu 16 bit) làm đầu vào, xuất ra cùng một số nguyên trong negabinary .

Đầu vào có thể ở bất kỳ định dạng nào thuận tiện nhất cho ngôn ngữ của bạn; ví dụ, nếu chương trình xử lý đầu vào dễ dàng hơn với 16 chữ số 0000000000000101, thay vì chỉ đơn giản 101, bạn có thể viết chương trình để chỉ chấp nhận đầu vào theo cách đó.

Mẫu I / O

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

Đây là một chương trình mẫu mà tôi đã viết thực hiện chuyển đổi cơ sở, bao gồm các cơ sở âm và không nguyên. Bạn có thể sử dụng nó để kiểm tra công việc của bạn.


Chỉ cần làm rõ thêm một chút, đầu vào và đầu ra sẽ phải là nhị phân, phải không? Ý tôi là: chuỗi ký tự của 0s và 1s. Có vẻ rõ ràng với tôi, nhưng một câu trả lời khiến tôi nghi ngờ nhẹ ...
Joanis

@ M.Joanis Đầu vào là nhị phân, đầu ra là negabinary (trông giống hệt như nhị phân - một chuỗi các số 0 và một số - nhưng cách hiểu số này là khác nhau.)
Peter Olson

2
Liên kết dường như không hoạt động, đó là lý do chính cho lý do tại sao chúng tôi yêu cầu các câu hỏi phải được khép kín trong những ngày này
Jo King

Câu trả lời:


6

APL, 21 ký tự

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

Tôi đã sử dụng Dyalog APL cho việc này, với giá trị ⎕IOlà 0, cho phép chúng tôi lập chỉ mục các mảng bắt đầu từ 0 thay vì 1.

Giải thích, từ phải sang trái:

  • cung cấp cho chúng ta đầu vào của người dùng như một vector ký tự.
  • ⍎¨áp dụng hàm thực thi ( ) cho mỗi ( ¨) các ký tự đã nói ở trên, dẫn đến một vectơ của số nguyên 1 và 0.
  • 2⊥ giải mã vector từ cơ sở 2 thành số thập phân.
  • - phủ định số nguyên thập phân kết quả.
  • (16/¯2)⊤mã hóa số nguyên thập phân thành cơ sở ¯2(âm 2). ( 16/¯2sao chép ¯2, 16lần, thu được 16 chữ số trong số âm của chúng tôi.)
  • - phủ định từng phần tử của số được mã hóa mới của chúng tôi (trước đó, nó bao gồm -1 và 0), để chúng ta có thể sử dụng nó để lập chỉ mục cho vectơ ký tự của mình.
  • '01'[ ... ]lập chỉ mục mảng ký tự ( '01') bằng cách sử dụng 0 và 1 của vectơ phủ định phủ định. Điều này là để chúng tôi có được một đầu ra đẹp hơn.

Thí dụ:

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

4

Ruby, 32 31 ký tự

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

Sử dụng phím tắt tính toán negabinary .


Đầu vào không được mã hóa cứng. 0xAAAA không phải là đầu vào, mặt nạ sẽ biến đổi đầu vào. 0xAAAA tương đương với 1010101010101010, được sử dụng trong hoạt động XOR để chuyển đổi nhị phân thành negabinary .. Bản thân đầu vào đến từ từ getskhóa, lấy từ STDIN.
Stefano Diem Benatti

đã thay đổi 0xAAAA thành 43690 (là cùng một số thập phân) để giảm số lượng ký tự xuống 1. Làm cho việc hiểu wtf trở nên khó khăn hơn.
Stefano Diem Benatti

À được rồi. Tôi không ruby ​​tốt vì vậy tôi không chắc chắn. Xin lỗi vì điều đó.
Rɪᴋᴇʀ

3

GolfScript, 34 29 27 ký tự

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

Một cách tiếp cận straigt-về phía trước đơn giản. Điều khá thú vị là phiên bản ngắn nhất là phiên bản đầu tiên chuyển đổi thành số và sau đó trở về cơ sở -2 (ít nhất là phiên bản ngắn nhất tôi có thể tìm thấy cho đến nay). Nhưng điều tuyệt vời ở cái này là nó chứa gần 15% %.

Chỉnh sửa 1: Đối với cơ sở 2, chúng ta có thể lưu một thao tác modulo và cũng có thể tham gia cả hai vòng.

Chỉnh sửa 2: Tôi tìm thấy một mã thậm chí ngắn hơn để chuyển đổi chuỗi nhị phân thành số nguyên.


3

Haskell, 86 83 byte

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

Gọi bằng c và sau đó là một mảng số nguyên cho các chữ số, vd

c [1,1]

PS: Tôi là người mới, tôi đã gửi cái này đúng chưa?

EDIT: Đã lưu một số byte nhờ Laikoni và cũng đã sửa một số lỗi chính tả

EDIT2: Hoặc, c :: Chuỗi -> Chuỗi:

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

Cho 114 byte (nhưng bạn gọi nó bằng một chuỗi: c "11")


Có bạn đã làm! Chào mừng đến với trang web! Hy vọng bạn dính xung quanh!
R

Chào mừng đến với PPCG! Bạn có thể thả dấu ngoặc đơn xung quanh undigits 2 n, vì ứng dụng hàm liên kết mạnh hơn +m. Bạn cũng có thể lưu một số byte bằng cách ràng buộc mtrong một bảo vệ : c n|m<-0xAAAAAAAA= ....
Laikoni

2

Python (2.x), 77 ký tự

(không ngắn như các giải pháp khác do cần phải chuyển đổi thủ công cơ sở ...) Nên đáp ứng các yêu cầu.

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

Đề xuất cải tiến hơn nữa được chào đón!

Cho nó ăn với các giá trị bắt đầu như thế này: 0b1001001


2

JavaScript, 68 byte

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

Sẽ là 52 byte trong ES6, nhưng đó là ngày thử thách:

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

2

Jelly , 4 byte, thách thức ngôn ngữ

Ḅb-2

Hãy thử trực tuyến!

Lấy đầu vào và tạo đầu ra, như một danh sách các chữ số.

Giải trình

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

Đây là khá nhiều chỉ là một bản dịch trực tiếp của đặc điểm kỹ thuật.


Đây không phải là không cạnh tranh? Thử thách này là từ '11 ...
NoOneIsHere 22/03/2017

Tôi đã bỏ lỡ nó. Tôi sẽ đặt một ghi chú trong tiêu đề.

1

k, 17 byte không biên dịch

Một số tính năng được sử dụng có thể hoãn lại thử thách.

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

Đầu vào là danh sách 1 và 0, và đầu ra cũng là danh sách 1 và 0.

Ví dụ về chương trình làm việc.





0

Japt , 4 byte

Đầu vào dưới dạng một chuỗi nhị phân, đầu ra dưới dạng một mảng chữ số negabinary.

Íì2n

Thử nó

Hoặc, lấy đầu vào là một mảng chữ số nhị phân:

ì2JÉ

Thử nó

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.