GNU sed, 236 바이트
/^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/!/-/
온라인으로 사용해보십시오!
설명
코드의 첫 번째 절반 (첫 번째 줄 이하)은 십진수를 단항으로 변환하고 " sed에서의 골프 팁 "에서 바로 나온 것 입니다. 그런 다음 한 번에 하나의 trit로 단항을 균형 잡힌 삼항으로 변환합니다. 이는 수동으로 예제를 작업하여 보여줍니다.
최종 출력하기 전에, 원 숫자는 -
, 0
및 +
에 의해 표현되고 !
, :
그리고 +
각각.
흥미로운 결과를 위해,로 시작 -48
하여 단항으로 변환했습니다 -
. 첫 번째 (가장 오른쪽) 트릿을 계산하려면 나머지 48 ÷ 3을 계산해야합니다. 111
s를 3
s 로 바꾸면됩니다 :
-111111111111111111111111111111111111111111111111 │ s/111/3/g
# => -3333333333333333
48 ÷ 3에는 나머지가 없으므로 1
s가 남아 있지 않으며 첫 번째 trit가 :
(0) 임을 알고 있으므로 대체합니다.
-3333333333333333 │ s/3\b/3:/
# => -3333333333333333:
이제 우리는 "한 곳"을 가지고 나머지 3
는 세 곳을 나타냅니다. 수학을 계속 작동 시키려면 3으로 나누어야합니다. 즉, 1
s로 바꿔야합니다 .
-3333333333333333: │ y/3/1/
# => -1111111111111111:
수학을 다시 확인해 봅시다. 우리는 1111111111111111
3 자리에 16 (단항 )이 있고 1에 0 ( :
)이 있습니다. 3✕16 + 1✕0 = 48입니다. 지금까지는 좋았습니다.
이제 다시 시작합니다. 교체 111
로들 3
의 :
-1111111111111111: │ s/111/3/g
# => -333331:
이번에 우리의 나머지는입니다 1
. 그래서 우리는 세 +
자리에 넣고 나머지를 3
s로 1
바꿉니다 :
-333331: │ s/31/3+/; y/3/1/
# => -11111+:
위생 검사 시간 : 우리는 11111
9 위에 5 (단항 ) +
, 3 위에 1 ( ) , 1 위에 0 ( :
)이 있습니다 : 9✕5 + 3✕1 + 1✕0 = 48. 훌륭합니다! 다시 111
s를 3
s 로 바꿉니다.
-11111+: │ s/111/3/g
# => -311+:
이번에는 나머지가 2 ( 11
)입니다. 그것은 두 개의 삼지창 ( +!
)을 차지합니다 . 십진 산술에서와 같이, 우리는 가장 오른쪽 숫자를 취하고 나머지는 왼쪽 열에 추가합니다. 우리의 시스템에서, 그것은 우리가 !
아홉 자리에 놓고 또 다른 세 개를 왼쪽에 추가 한 다음, 모든을 3
s로 바꾸어 1
27의 자리를 나타냅니다.
-311+: │ s/311/33!/; y/3/1/
# => -11!+:
이제 3이 남지 않았으므로 나머지 단항 자릿수를 해당하는 트라이 트로 바꿀 수 있습니다. 두 ( 11
)이다 +!
:
-11!+: │ s/11/+!/
# => -+!!+:
실제 코드에서이 두 단계로 수행된다 s/1/+/
및 y/1:/!0/
바이트를 저장하려면. 두 번째 단계는 또한 :
s를 0
s로 바꾸므로 실제로는 다음과 같이합니다.
-11!+: │ s/1/+/; y/1:/+0/
# => -+!!+0
이제 음수가 있는지 확인합니다. 우리는 표시를 없애고 각 삼지창을 뒤집어 야합니다.
-+!!+0 │ /-/ { s/-//; y/+!/!+/; }
# => !++!0
마지막으로 !
s를 -
s 로 바꿉니다.
!++!0 │ y/!/-/
# => -++-0
그게 다야!