Lý lịch
Hầu hết mọi người ở đây nên làm quen với một vài hệ thống cơ sở số nguyên: thập phân, nhị phân, thập lục phân, bát phân. Ví dụ: trong hệ thập lục phân, một số abc.de 16 sẽ đại diện cho
a*16^2 + b*16^1 + c*16^0 + d*16^-1 + e*16^-2
Tuy nhiên, người ta cũng có thể sử dụng các cơ sở không nguyên, như các số vô tỷ. Một khi cơ sở này sử dụng tỷ lệ vàng φ = (1 + √5) / 2 ≈ 1.618 ... . Chúng được định nghĩa tương tự với các cơ sở số nguyên. Vì vậy, một số abc.de φ (nơi một để e là số nguyên chữ số) sẽ đại diện
a*φ^2 + b*φ^1 + c*φ^0 + d*φ^-1 + e*φ^-2
Lưu ý rằng về nguyên tắc, bất kỳ chữ số nào cũng có thể âm (mặc dù chúng tôi không quen với điều đó) - chúng tôi sẽ đại diện cho một chữ số âm có chữ số đứng đầu ~
. Với mục đích của câu hỏi này, chúng tôi giới hạn bản thân thành các chữ số từ ~9
đến 9
, vì vậy chúng tôi có thể viết rõ ràng một số dưới dạng một chuỗi (có dấu ngã ở giữa). Vì thế
-2*φ^2 + 9*φ^1 + 0*φ^0 + -4*φ^-1 + 3*φ^-2
sẽ được viết là ~290.~43
. Chúng tôi gọi một số như vậy là một số nhị phân .
Một số phinary luôn có thể được biểu diễn ở dạng tiêu chuẩn , có nghĩa là biểu diễn chỉ sử dụng các chữ số 1
và 0
không chứa 11
bất cứ nơi nào và có dấu trừ tùy chọn để chỉ ra rằng toàn bộ số là âm. (Thật thú vị, mỗi số nguyên có một biểu diễn hữu hạn duy nhất ở dạng tiêu chuẩn.)
Các đại diện không ở dạng chuẩn luôn có thể được chuyển đổi thành dạng chuẩn bằng các quan sát sau:
- 011 φ = 100 φ (vì φ 2 = φ + 1)
- 0200 φ = 1001 φ (vì φ 2 + 1 / φ = 2φ)
- 0 ~ 10 φ = ~ 101 φ (vì φ - 1 / φ = 1)
Ngoài ra:
- Nếu chữ số có nghĩa nhất là
~1
(với phần còn lại của số là dạng chuẩn), số đó là số âm và chúng ta có thể chuyển đổi nó thành dạng chuẩn bằng cách hoán đổi tất cả1
và~1
, thêm một dấu trừ và áp dụng lại ba quy tắc trên cho đến khi chúng ta có được hình thức tiêu chuẩn.
Dưới đây là một ví dụ về việc chuẩn hóa như vậy (Tôi đang sử dụng khoảng trắng bổ sung cho các chữ số dương, để giữ cho mỗi vị trí chữ số được căn chỉnh):
1~3.2~1φ
1~3. 2~1φ Rule:
= 0~2. 3~1φ (3)
= ~1~1. 4~1φ (3)
= ~1 0 0. 4~1φ (3)
= ~1 0 0. 3 0 1φ (3)
= ~1 0 1. 1 0 2φ (2)
= ~1 1 0. 0 0 2φ (1)
= ~1 1 0. 0 1 0 0 1φ (2)
= - 1~1 0. 0~1 0 0~1φ (4)
= - 0 0 1. 0~1 0 0~1φ (3)
= - 0 0 1.~1 0 1 0~1φ (3)
= - 0 0 0. 0 1 1 0~1φ (3)
= - 0 0 0. 0 1 1~1 0 1φ (3)
= - 0 0 0. 0 1 0 0 1 1φ (3)
= - 0 0 0. 0 1 0 1 0 0φ (1)
Năng suất .-0.0101φ
Để đọc thêm, Wikipedia có một bài viết rất nhiều thông tin về chủ đề này.
Các thách thức
Do đó, hoặc nói cách khác, viết một chương trình hoặc hàm, được đưa ra một chuỗi đại diện cho một số nhị phân (như được mô tả ở trên), đưa ra dạng chuẩn của nó, mà không có các số 0 đầu hoặc cuối. Đầu vào không nhất thiết phải chứa điểm nhị phân, nhưng sẽ luôn chứa chữ số còn lại của nó (vì vậy không .123
). Đầu ra phải luôn bao gồm điểm phinary và ít nhất một chữ số ở bên trái của nó.
Bạn có thể nhận đầu vào thông qua STDIN, ARGV hoặc đối số hàm và trả về kết quả hoặc in ra STDOUT.
Bạn có thể sử dụng một thuật toán khác với quy trình trên miễn là về nguyên tắc chính xác và chính xác cho các đầu vào tùy ý (hợp lệ) - đó là các giới hạn duy nhất có khả năng phá vỡ triển khai của bạn phải là các giới hạn kỹ thuật như kích thước tích hợp loại dữ liệu hoặc RAM có sẵn. Chẳng hạn, việc đánh giá đầu vào là một số dấu phẩy động và sau đó chọn các chữ số một cách tham lam là không được phép, vì người ta có thể tìm thấy các đầu vào mà sự không chính xác của dấu phẩy động sẽ dẫn đến kết quả không chính xác.
Đây là mã golf, câu trả lời ngắn nhất (tính bằng byte) sẽ thắng.
Các trường hợp thử nghiệm
Input Output
1 1.
9 10010.0101
1.618 10000.0000101
1~3.2~1 -0.0101
0.~1021 0. (or -0.)
105.~2 1010.0101
~31~5.~1 -100000.1001