Mở rộng nhị phân nhị phân


9

Thông thường, chúng tôi phân tách một số thành các chữ số nhị phân bằng cách gán nó với lũy thừa là 2, với hệ số 0hoặc 1cho mỗi số hạng:

25 = 1*16 + 1*8 + 0*4 + 0*2 + 1*1

Sự lựa chọn 01... không phải là nhị phân. Chúng ta sẽ thực hiện mở rộng nhị phân thực sự bằng cách mở rộng với lũy thừa bằng 2, nhưng với hệ số 1hoặc -1thay vào đó:

25 = 1*16 + 1*8 + 1*4 - 1*2 - 1*1

Bây giờ này vẻ nhị phân.

Với bất kỳ số dương nào, sẽ rất tầm thường khi thấy rằng:

  • Mỗi số lẻ có vô số lần mở rộng nhị phân thực
  • Mỗi số chẵn không có mở rộng nhị phân thực sự

Do đó, để mở rộng nhị phân thực sự được xác định rõ, chúng tôi yêu cầu mở rộng phải nhỏ nhất , tức là với độ dài ngắn nhất.


Cho bất kỳ số nguyên dương, lẻ n , trả về khai triển nhị phân thực của nó, từ chữ số có nghĩa nhất đến chữ số có nghĩa nhỏ nhất (hoặc theo thứ tự đảo ngược).

Quy tắc:

  • Vì đây là , bạn nên cố gắng làm điều này với số byte ngắn nhất có thể.Nội tích được cho phép.
  • Bất kỳ đầu ra nào có thể biểu diễn và liệt kê các hệ số đều được chấp nhận: một mảng, một chuỗi các hệ số có dấu phân cách, v.v ...
  • Tiêu chuẩn chơi golf áp dụng.
  • Chương trình của bạn sẽ hoạt động cho các giá trị trong kích thước số nguyên tiêu chuẩn của ngôn ngữ của bạn.

Các trường hợp thử nghiệm

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]

Liên quan nhưng khá khác nhau.
Giuseppe

4
Thuật toán đơn giản: Chuyển đổi sang cơ sở 2, thay thế 0 bằng -1, đặt LSD ở phía trước.
Josiah Winslow

Voile: Tôi không giải thích về các downvote, tôi chỉ phác thảo một thuật toán cho những người có các lệnh chuyển đổi cơ sở trong ngôn ngữ của họ.
Josiah Winslow

Vì bạn rất muốn trở thành nhị phân thực sự, chúng ta có thể trả về giá trị dưới dạng các bit được đóng gói với giá trị theo vị trí thông thường nhưng cách hiểu mới về hai trạng thái không? tức là về mặt điện, nó chỉ là điện áp cao hoặc thấp (hoặc bất cứ thứ gì), và đó không phải là lỗi của tôi nếu trình gỡ lỗi tiêu chuẩn in 0thay vì -1cho trạng thái điện áp thấp. Người gọi nhận được các bit biết ý nghĩa của chúng. (Đây vẫn là một bài tập thao tác bit không tầm thường, vì quyền xoay chỉ hoạt động nếu nó có 32 bit đáng kể. Ví dụ: số 5 bit cần độ rộng xoay là 5.)
Peter Cordes

Có đầu ra cần bao gồm các dải phân cách? Là 111-1-1một đầu ra hợp lệ cho 25?
Oliver

Câu trả lời:


7

Japt , 6 byte

¤é r0J

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

Giải trình:

¤é r0J  // Test input:                  25
¤       // Binary the input:            11001
 é      // Rotate 1 chars to the right: 11100
   r0J  // Replace 0s with -1:          111-1-1

1
Ah, vòng quay; đó là lý do tại sao nó không làm việc cho tôi
Xù xì

2
Quay??? dagnmus.
Giuseppe

3

Bình thường ,  12  11 byte

|R_1.>jQ2 1

Hãy thử nó ở đây!


Làm sao?

| R_1.> JQ2 1 Chương trình đầy đủ.

      jQ2 Chuyển đổi đầu vào thành một danh sách nhị phân.
     .> 1 Xoay vòng theo danh sách trên 1 vị trí bên phải.
| R_1 Thay thế 0 bằng -1.
               Ngẫu nhiên đầu ra.

Trước hết, chúng tôi nhận thấy rằng tác vụ chỉ là "thay thế 0s trong cách viết nhị phân bằng -1s và dịch sang phải 1 vị trí." - Đó chính xác là những gì chúng ta nên làm! Việc chuyển đổi nhị phân cho chúng ta một danh sách 0s và 1s. Tất cả chúng ta nên làm ở đây là tìm một cách chơi golf để chuyển đổi 0sang -1. Toán tử bitwise |(bitwise OR) là bạn của chúng tôi. Bản đồ trên biểu diễn nhị phân thay đổi với |-1. Nếu số hiện tại là 0, nó được chuyển đổi thành -1.


Tôi không nghĩ có một cách tốt hơn. ;)
Josiah Winslow

@JosiahWinslow Tôi làm ... Cố gắng tìm nó
Ông Xcoder

Hửm Thuật toán có vẻ tối ưu, có thể đó là vì tôi không biết Pyth.
Josiah Winslow

@JosiahWinslow Tìm thấy cách tốt hơn. Cách tốt hơn theo cách tốt hơn, không phải là thuật toán tốt hơn.
Ông Xcoder

@ Mr.Xcoder Và bây giờ thực sự không có ít nhất là với tôi.
Erik the Outgolfer



2

Perl 6 , 72 byte

Chắc chắn có một cách tốt hơn, nhưng đây là những gì tôi có ...

->$a {grep {$a==[+] @^a.reverse Z+< ^∞},[X] (1,-1)xx $a.base(2).chars}

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

Giải thích : Đây là một hàm lấy một đối số ( ->$a). Trước tiên, chúng tôi nhận được số lượng hệ số cần thiết ( $a.base(2).chars= số lượng ký tự trong biểu diễn cơ sở 2), sau đó tạo một sản phẩm Cartesian ( X) của nhiều cặp đó (1,-1). (Có [X]nghĩa là: giảm danh sách sau với X.) Vì vậy, chúng tôi nhận được một danh sách tất cả các kết hợp có thể có của 1s và -1. Sau đó, chúng tôi chỉ lọc ( grep) các danh sách mã hóa số đã cho $a. Chỉ có một, vì vậy chúng tôi nhận được một danh sách một danh sách với các hệ số.

Khối grep thực hiện điều này: lấy đối số của nó làm danh sách ( @^a), đảo ngược nó và nén nó với một danh sách vô hạn 0,1,2,...bằng cách sử dụng toán tử "shift bit trái" +<. Nén dừng ngay khi danh sách ngắn hơn đã hết (tốt cho chúng tôi!) Sau đó chúng tôi tổng hợp tất cả các kết quả và so sánh nó với số đã cho. Chúng tôi phải sử dụng .reversevì OP yêu cầu các hệ số theo thứ tự từ quan trọng nhất đến ít quan trọng nhất.




1

J, 11 byte

1-~2*_1|.#:

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

Cảm ơn @JosiahWinslow cho thuật toán.

Bất kỳ suy nghĩ về việc làm cho việc chuyển đổi ngắn hơn? Suy nghĩ của tôi là sử dụng !.-fit (nvm, nó chỉ thay đổi dung sai của chuyển đổi).

Sử dụng {-take dài hơn 1 ký tự.

_1 1{~_1|.#:

1

Java 8, 101 byte

n->{String s=n.toString(n,2);return(s.charAt(s.length()-1)+s.replaceAll(".$","")).replace("0","-1");}

Cảng @Oliver Japt câu trả lời 's , với một vài byte nữa ..;)

Chắc chắn có thể được đánh golf bằng cách sử dụng một cách tiếp cận toán học thay vì cách tiếp cận Chuỗi này.

Giải trình:

Hãy thử nó ở đây.

n->{                             // Method with Integer parameter and String return-type
  String s=n.toString(n,2);      //  Convert the Integer to a binary String
  return(s.charAt(s.length()-1)  //  Get the last character of the binary String
    +s.replaceAll(".$","")       //   + everything except the last character
   ).replace("0","-1");          //  Then replace all zeroes with -1, and return the result
}                                // End of method

1

R , 90 88 46 byte

function(n)c((n%/%2^(0:log2(n))%%2)[-1],1)*2-1

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

Thực hiện thuật toán của Oliver , nhưng trả về các chữ số theo thứ tự ngược lại. Vì chúng tôi được đảm bảo nlà không bao giờ, nên bit luôn ít nhất (đầu tiên) luôn luôn tồn tại 1, vì vậy chúng tôi xóa nó và nối thêm 1vào cuối để mô phỏng phép quay trong R. Cảm ơn Shaggy đã giúp tôi sửa lỗi toán học của mình .

Đơn giản chỉ cần đặt rev( ) xung quanh các lệnh gọi hàm ở chân trang sẽ trả về các giá trị theo cùng một thứ tự.

câu trả lời gốc, 88 byte:

function(n,b=2^(0:log2(n)))(m=t(t(expand.grid(rep(list(c(-1,1)),sum(b|1))))))[m%*%b==n,]

Chức năng ẩn danh; trả về các giá trị theo thứ tự ngược với tên cột được đính kèm.

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

Giải trình:

function(n){
 b <- 2^(0:log2(n))         # powers of 2 less than n
 m <- expand.grid(rep(list(c(-1,1)),sum(b|1))) # all combinations of -1,1 at each position in b, as data frame
 m <- t(t(m))               # convert to matrix
 idx <- m%*%b==n            # rows where the matrix product is `n`
 m[idx,]                    # return those rows
}

Tôi sẽ không coi đầu ra đó là hợp lệ; đề nghị yêu cầu tác giả thách thức xác nhận.
Xù xì

Thứ tự đảo ngược @Shaggy được cho phép rõ ràng: from the most significant digit to the least significant digit (or in reversed order).do đó điều này nên được chấp nhận hoàn toàn.
Giuseppe

1
Đảo ngược trật tự , không đảo ngược dấu hiệu. Có nghĩa là đầu ra hợp lệ 25, ví dụ, sẽ là [1,1,1,-1,-1]hoặc [-1,-1,1,1,1].
Xù xì

1
@Shaggy ah, bạn nói đúng, tôi vừa làm toán sai! nên 2*bits - 1thay vì 1-2*bits. Cảm ơn bạn.
Giuseppe


0

CJam, 12 byte

Một cổng của câu trả lời Golfscript của tôi.

qi2b{_+(}%)\


0

Golf, 14 13 14 byte

-1 byte vì tôi quên %tồn tại. +1 byte vì tôi cũng quên đầu vào là một chuỗi.

~2base{.+(}%)\

1
Nếu bạn cho rằng đầu vào là một số nguyên, bạn nên bọc mã {}để biến nó thành một khối. Các chương trình đầy đủ chỉ có thể nhận đầu vào dưới dạng chuỗi.
Peter Taylor

Ừm ... cái gì? Ý tôi là, số đang được đẩy dưới dạng một số nguyên, thay vì một chuỗi chứa một số.
Josiah Winslow

Trong trường hợp đó, câu trả lời của bạn không phải là một chương trình đầy đủ và do đó phải là một "hàm" hoặc trong trường hợp GolfScript là một khối. Do đó, nó {2base{.+(}%\}cho 15 byte. Tương tự như câu trả lời của bạn.
Peter Taylor

Đây là một chương trình đầy đủ. Đầu vào trong Golfscript được đẩy ngầm vào ngăn xếp ở đầu chương trình và đầu vào trong CJam được chỉ định trước khi thực hiện và được truy cập bằng lệnh q.
Josiah Winslow

Tôi có một số quen thuộc với GolfScript . ( Và CJam ). Nếu bạn muốn khẳng định rằng đó là một chương trình đầy đủ, bạn cần phải thêm tiền tố vào đó ~.
Peter Taylor
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.