バックグラウンド
ほとんどの人は、10進数、2進数、16進数、8進数などのいくつかの整数ベースシステムに精通している必要があります。たとえば、16進法では、abc.de 16という数字は次を表します。
a*16^2 + b*16^1 + c*16^0 + d*16^-1 + e*16^-2
ただし、無理数のような非整数ベースも使用できます。そのようなベースは、黄金比φ=(1 +√5)/ 2≈1.618 ...を使用します。これらは、整数ベースと同様に定義されます。数ようabc.deのφは、(ここに、eは桁の整数である)を表すことになります
a*φ^2 + b*φ^1 + c*φ^0 + d*φ^-1 + e*φ^-2
原則として、数字のいずれかが負になる可能性があることに注意してください(私たちはそれに慣れていませんが)-先行する負の数字を表します~
。この質問の目的のために我々はから数字に自分自身を制限~9
する9
ので、我々は明確に(間にチルダ付き)1つの文字列として番号を書くことができます。そう
-2*φ^2 + 9*φ^1 + 0*φ^0 + -4*φ^-1 + 3*φ^-2
と書かれ~290.~43
ます。私たちは、このような番号に電話phinary数。
進数は常に標準形式で表すことができます。これは、数字1
とのみを使用し0
、11
どこにも含まず、オプションのマイナス記号を付けて数字全体が負であることを示すことを意味します。(興味深いことに、すべての整数は標準形式で一意の有限表現を持っています。)
標準形式ではない表現は、次の観察を使用して常に標準形式に変換できます。
- 011 φ = 100 φ(なぜならφ 2 =φ+ 1)
- 0200 φ = 1001 φ(なぜならφ 2 + 1 /φ=2φ)
- 0〜10 φ = 101〜φ(なぜならφ - 1 /φ= 1)
加えて:
- 最上位桁が
~1
(残りの数値が標準形式である)場合、数値は負で1
あり~1
、すべてとを交換してマイナス記号を追加し、上記の3つの規則を再度適用することで標準形式に変換できます。標準フォームを入手します。
このような正規化の例を次に示します(各桁の位置を揃えるために、正の桁に追加のスペースを使用しています)。
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)
降伏 -0.0101φ
。
さらに読むために、ウィキペディアには非常に有益な記事がありますにはトピックがあります。
チャレンジ
したがって、またはそうでなければ、(上記のように)小数を表す文字列が与えられると、先頭または末尾のゼロなしで標準形式を出力するプログラムまたは関数を作成します。入力には必ずしも小数点が含まれるわけではありませんが、常にその左側の数字が含まれます(したがって、.123
)。出力には、常に小数点とその左側の少なくとも1桁が含まれている必要があります。
STDIN、ARGV、または関数引数を介して入力を取得し、結果を返すか、STDOUTに出力できます。
原則として任意の(有効な)入力に対して正確かつ正確である限り、上記の手順とは異なるアルゴリズムを使用できます。つまり、実装を破壊する可能性がある唯一の制限は、組み込みのサイズなどの技術的な制限です。データ型または利用可能なRAM。たとえば、入力を浮動小数点数として評価してから、欲張って数字を選択することはできません。浮動小数点の不正確さが不正確な結果につながる入力を見つける可能性があるためです。
これはコードゴルフで、最短の回答(バイト単位)が勝ちです。
テストケース
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