GNU sed, 236 byte
/^0/bV
:
s/\b9/;8/
s/\b8/;7/
s/\b7/;6/
s/\b6/;5/
s/\b5/;4/
s/\b4/;3/
s/\b3/;2/
s/\b2/;1/
s/\b1/;0/
s/\b0//
/[^;-]/s/;/&&&&&&&&&&/g
t
y/;/1/
:V
s/111/3/g
s/3\b/3:/
s/311/33!/
s/31/3+/
y/3/1/
tV
s/1/+/
y/1:/!0/
/-/{s/-//
y/+!/!+/
}
y/!/-/
Hãy thử trực tuyến!
Giải trình
Nửa đầu của mã (trừ dòng đầu tiên) dịch thập phân sang unary và xuất phát trực tiếp từ " Mẹo chơi golf trong sed ". Sau đó, nó dịch unary sang ternary một trit tại một thời điểm, mà tôi sẽ chứng minh bằng cách làm một ví dụ bằng tay.
Trước khi kết quả cuối cùng, các chữ số ternary -
, 0
và +
được đại diện bởi !
, :
và +
, tương ứng.
Để có một kết quả thú vị, chúng tôi bắt đầu với -48
, đã được chuyển đổi thành unary (với -
nguyên vẹn). Để tính trit đầu tiên (phải nhất), chúng ta phải tính phần còn lại là 48 3. Chúng ta có thể làm điều này bằng cách thay thế 111
s bằng 3
s:
-111111111111111111111111111111111111111111111111 │ s/111/3/g
# => -3333333333333333
48 3 không có phần còn lại, vì vậy không 1
còn tồn tại và chúng tôi biết điểm đầu tiên của chúng tôi là :
(cho 0), vì vậy chúng tôi thay thế nó:
-3333333333333333 │ s/3\b/3:/
# => -3333333333333333:
Bây giờ chúng ta có "vị trí của chúng ta", vì vậy chúng ta biết các 3
s còn lại đại diện cho vị trí thứ ba. Để giữ cho toán học hoạt động, chúng ta phải chia chúng cho 3, tức là thay thế chúng bằng 1
s:
-3333333333333333: │ y/3/1/
# => -1111111111111111:
Hãy kiểm tra kỹ toán học của chúng tôi: Chúng tôi có 16 (đơn nguyên 1111111111111111
) ở vị trí thứ ba và số 0 ( :
) ở vị trí thứ nhất. Đó là 3 Khăn16 + 1 Khăn0 = 48. Cho đến nay rất tốt.
Bây giờ chúng ta bắt đầu lại. Thay 111
s bằng 3
s:
-1111111111111111: │ s/111/3/g
# => -333331:
Lần này phần còn lại của chúng tôi là 1
, vì vậy chúng tôi đặt +
vào vị trí thứ ba và thay thế các 3
s còn lại bằng 1
s:
-333331: │ s/31/3+/; y/3/1/
# => -11111+:
Thời gian kiểm tra trạng thái: Chúng tôi có 5 (đơn vị 11111
) ở vị trí số 9, 1 ( +
) ở vị trí số ba và 0 ( :
) ở vị trí số: 9 Đ5 + 3 Đọ1 + 1 Đọ = 48. Tuyệt vời! Một lần nữa chúng ta thay 111
s bằng 3
s:
-11111+: │ s/111/3/g
# => -311+:
Lần này phần còn lại của chúng tôi là 2 ( 11
). Điều đó chiếm hai trits ( +!
), có nghĩa là chúng ta có một carry. Giống như trong số học thập phân có nghĩa là chúng ta lấy chữ số ngoài cùng bên phải và thêm phần còn lại vào cột bên trái. Trong hệ thống của chúng tôi, điều đó có nghĩa chúng ta đặt !
ở nơi nines và thêm ba khác sang bên trái của nó, sau đó thay thế tất cả các 3
s với 1
s để đại diện cho nơi 27s:
-311+: │ s/311/33!/; y/3/1/
# => -11!+:
Bây giờ chúng tôi không còn 3 số nào nữa, vì vậy chúng tôi có thể thay thế bất kỳ chữ số đơn nguyên nào còn lại bằng các dấu tương ứng của chúng. Hai ( 11
) là +!
:
-11!+: │ s/11/+!/
# => -+!!+:
Trong mã thực tế, điều này được thực hiện theo hai bước s/1/+/
và y/1:/!0/
để lưu byte. Bước thứ hai cũng thay thế :
s bằng 0
s, vì vậy nó thực sự làm điều này:
-11!+: │ s/1/+/; y/1:/+0/
# => -+!!+0
Bây giờ chúng tôi kiểm tra nếu chúng tôi có một số âm. Chúng tôi làm, vì vậy chúng tôi phải loại bỏ các dấu hiệu và sau đó đảo ngược từng trit:
-+!!+0 │ /-/ { s/-//; y/+!/!+/; }
# => !++!0
Cuối cùng, chúng ta thay !
s bằng -
s:
!++!0 │ y/!/-/
# => -++-0
Đó là nó!