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の残りを計算する必要があります。これを行うには、111
sを3
sに置き換えます。
-111111111111111111111111111111111111111111111111 │ s/111/3/g
# => -3333333333333333
48÷3には残りがないので、1
sは残りません。最初のトリットが:
(0の場合)であることがわかっているので、それを置き換えます。
-3333333333333333 │ s/3\b/3:/
# => -3333333333333333:
これで「1つの場所」ができたので、残り3
のが3の場所を表していることがわかります。数学を機能させるには、それらを3で割る、つまり1
sで置き換える必要があります。
-3333333333333333: │ y/3/1/
# => -1111111111111111:
数学を再確認しましょう1111111111111111
。3の位に16(単項)があり、ゼロ(:
)があります。それは3✕16+1✕0= 48です。
もう一度始めましょう。111
sを3
sに置き換えます。
-1111111111111111: │ s/111/3/g
# => -333331:
今回は残りがな1
ので+
、3桁に置き、残り3
のsを1
sに置き換えます。
-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
)です。それには2つのトリット(+!
)が必要です。つまり、キャリーがあります。10進算術のように、右端の数字を取得し、残りを左の列に追加します。私たちのシステムで!
は、9の場所に置き、その左にさらに3を追加してから、すべての3
sを1
sに置き換えて27の場所を表します。
-311+: │ s/311/33!/; y/3/1/
# => -11!+:
今は3が残っていないので、残りの単項数字を対応するトリットで置き換えることができます。2(11
)は+!
次のとおりです。
-11!+: │ s/11/+!/
# => -+!!+:
実際のコードでは、これは2つの段階で行われ、さs/1/+/
とy/1:/!0/
バイトを保存するために、。2番目のステップも:
sを0
sに置き換えるため、実際には次のようになります。
-11!+: │ s/1/+/; y/1:/+0/
# => -+!!+0
次に、負の数があるかどうかを確認します。そのため、記号を取り除き、各トリットを反転する必要があります。
-+!!+0 │ /-/ { s/-//; y/+!/!+/; }
# => !++!0
最後に、!
sを-
s に置き換えます。
!++!0 │ y/!/-/
# => -++-0
それでおしまい!