Contexte
La plupart des gens ici devraient être familiers avec quelques systèmes de base entiers: décimal, binaire, hexadécimal, octal. Par exemple, dans le système hexadécimal, un nombre abc.de 16 représenterait
a*16^2 + b*16^1 + c*16^0 + d*16^-1 + e*16^-2
Cependant, on peut également utiliser des bases non entières, comme des nombres irrationnels. Une fois que cette base utilise le nombre d' or φ = (1 + √5) / 2 ≈ 1,618 ... . Celles-ci sont définies de manière analogue aux bases entières. Ainsi, un nombre abc.de φ (où a à e sont des chiffres entiers) représenterait
a*φ^2 + b*φ^1 + c*φ^0 + d*φ^-1 + e*φ^-2
Notez qu'en principe, n'importe lequel des chiffres peut être négatif (bien que nous n'y soyons pas habitués) - nous représenterons un chiffre négatif avec un interligne ~
. Aux fins de cette question, nous nous limitons aux chiffres de ~9
à 9
, afin que nous puissions écrire sans ambiguïté un nombre sous la forme d'une chaîne (avec des tildes entre les deux). Alors
-2*φ^2 + 9*φ^1 + 0*φ^0 + -4*φ^-1 + 3*φ^-2
serait écrit comme ~290.~43
. Nous appelons un tel numéro un numéro phinaire .
Un nombre phinaire peut toujours être représenté sous une forme standard , ce qui signifie que la représentation n'utilise que des chiffres 1
et 0
, sans contenir 11
nulle part, et avec un signe moins facultatif pour indiquer que le nombre entier est négatif. (Fait intéressant, chaque entier a une représentation finie unique sous forme standard.)
Les représentations qui ne sont pas sous forme standard peuvent toujours être converties en forme standard en utilisant les observations suivantes:
- 011 φ = 100 φ (car φ 2 = φ + 1)
- 0200 φ = 1001 φ (car φ 2 + 1 / φ = 2φ)
- 0 ~ 10 φ = ~ 101 φ (car φ - 1 / φ = 1)
En plus:
- Si le chiffre le plus significatif est
~1
(avec le reste du nombre sous forme standard), le nombre est négatif, et nous pouvons le convertir en forme standard en échangeant tous1
et~1
en ajoutant un signe moins et en appliquant à nouveau les trois règles ci-dessus jusqu'à ce que nous obtenir le formulaire standard.
Voici un exemple d'une telle normalisation de (j'utilise des espaces supplémentaires pour les chiffres positifs, pour garder chaque position de chiffre alignée):
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)
Céder .-0.0101φ
Pour une lecture plus approfondie, Wikipedia a un article très informatif sur le sujet.
Le défi
Par conséquent, ou autrement, écrivez un programme ou une fonction qui, étant donné une chaîne représentant un nombre phinaire (comme décrit ci-dessus), sort sa forme standard, sans zéros de début ou de fin. L'entrée ne contient pas nécessairement le point phinaire, mais contiendra toujours le chiffre restant (donc non .123
). La sortie doit toujours inclure le point phinaire et au moins un chiffre à sa gauche.
Vous pouvez saisir des données via STDIN, ARGV ou un argument de fonction et renvoyer le résultat ou l'imprimer dans STDOUT.
Vous pouvez utiliser un algorithme différent de la procédure ci-dessus tant qu'il est en principe correct et exact pour des entrées arbitraires (valides) - c'est-à-dire que les seules limites qui pourraient potentiellement casser votre implémentation devraient être des limitations techniques comme la taille de la fonction intégrée types de données ou la mémoire RAM disponible. Par exemple, l'évaluation de l'entrée en tant que nombre à virgule flottante, puis la sélection goulue de chiffres n'est pas autorisée, car on pourrait trouver des entrées pour lesquelles des inexactitudes en virgule flottante conduiraient à des résultats incorrects.
C'est le golf de code, la réponse la plus courte (en octets) l'emporte.
Cas de test
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