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でのゴルフのヒント」から直接来ています。次に、単項式から平衡式3項式に一度に1トリットを変換します。これについては、例を手動で操作して説明します。
最終出力前に、三桁-、0および+で表される!、:および+それぞれ。
興味深い結果を得るために、-48単項に変換された(-そのまま)から始めます。最初の(右端の)トリットを計算するには、48÷3の残りを計算する必要があります。これを行うには、111sを3sに置き換えます。
-111111111111111111111111111111111111111111111111 │ s/111/3/g
# => -3333333333333333
48÷3には残りがないので、1sは残りません。最初のトリットが:(0の場合)であることがわかっているので、それを置き換えます。
-3333333333333333 │ s/3\b/3:/
# => -3333333333333333:
これで「1つの場所」ができたので、残り3のが3の場所を表していることがわかります。数学を機能させるには、それらを3で割る、つまり1sで置き換える必要があります。
-3333333333333333: │ y/3/1/
# => -1111111111111111:
数学を再確認しましょう1111111111111111。3の位に16(単項)があり、ゼロ(:)があります。それは3✕16+1✕0= 48です。
もう一度始めましょう。111sを3sに置き換えます。
-1111111111111111: │ s/111/3/g
# => -333331:
今回は残りがな1ので+、3桁に置き、残り3のsを1sに置き換えます。
-333331: │ s/31/3+/; y/3/1/
# => -11111+:
健全性チェック時間:111119桁に5(単項)+、3桁に1()、1 桁に0(:)があります:9✕5+3✕1+1✕0= 48。再び111sを3sに置き換えます:
-11111+: │ s/111/3/g
# => -311+:
今回は、残りが2(11)です。それには2つのトリット(+!)が必要です。つまり、キャリーがあります。10進算術のように、右端の数字を取得し、残りを左の列に追加します。私たちのシステムで!は、9の場所に置き、その左にさらに3を追加してから、すべての3sを1sに置き換えて27の場所を表します。
-311+: │ s/311/33!/; y/3/1/
# => -11!+:
今は3が残っていないので、残りの単項数字を対応するトリットで置き換えることができます。2(11)は+!次のとおりです。
-11!+: │ s/11/+!/
# => -+!!+:
実際のコードでは、これは2つの段階で行われ、さs/1/+/とy/1:/!0/バイトを保存するために、。2番目のステップも:sを0sに置き換えるため、実際には次のようになります。
-11!+: │ s/1/+/; y/1:/+0/
# => -+!!+0
次に、負の数があるかどうかを確認します。そのため、記号を取り除き、各トリットを反転する必要があります。
-+!!+0 │ /-/ { s/-//; y/+!/!+/; }
# => !++!0
最後に、!sを-s に置き換えます。
!++!0 │ y/!/-/
# => -++-0
それでおしまい!