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
la source
Réponses:
Javascript (ES6) -
446418422420 octetsMinifié:
Étendu:
Le code produit une fonction
F
qui effectue la conversion spécifiée.C'est un problème difficile pour le golf. De nombreux cas marginaux surgissent qui empêchent la simplification du code. En particulier, le traitement des négatifs est une douleur, à la fois en termes d'analyse et en termes de gestion logique.
Je dois noter que le code ne gère qu'une "plage raisonnable" d'entrées. Pour étendre le domaine de la fonction sans limite, le nombre de zéros
z
peut être augmenté et la constante délimitant lawhile( c++ < 99 )
boucle peut être augmentée. La gamme actuellement prise en charge est déjà excessive pour les cas de test fournis.Exemples de sorties
Ce
-0.
n'est pas joli, mais la réponse est toujours correcte. Je peux le réparer si nécessaire.la source
n
entrée à -digit serait quelque part entren
etn log(n)
. Dans tous les cas, le nombre de passes peut être augmenté d'un facteur 10 pour chaque personnage ajouté. Le nombre de zéros dans laz
constante est également un problème intéressant. Je soupçonne que 9 est exagéré pour toute entrée possible.$0
, Javascript ne le supporte pas. Ou du moins Firefox ne le fait pas. : Pfor( i = e = 0; i < n-3; i = j )
byfor(; i < n-3; i = j )
et déplacer les déclarations vers le haut, en lesN = t = n = 0;
remplaçant parN = t = n = i = e = 0;
j
n'est pas maintenu constant à une valeur dei+1
. Remarquez dans les troisif
blocs,j
est réinitialisé à0
. Par conséquent, à tout moment après le premierif
bloc, il ne peut pas être utilisé comme proxy pouri+1
. La variablei
elle-même ne peut pas être mise à jour jusqu'à la fin de la boucle (en utilisant la troisième instruction dansfor
) car sa valeur est utilisée jusqu'à la fin de la boucle. Mais cela dit, peut-être que je manque quelque chose. Si vous pouvez raccourcir le code, le tester et vérifier qu'il fonctionne toujours, veuillez en poster une copie sur pastebin.com et un lien ici. Je vous accorderai tout le mérite dans la réponse. :)Haskell, 336 octets
Il s'agit de l'algorithme gourmand, mais avec une représentation exacte
[a,b]
des nombres a + bφ ( a , b ∈ ℤ) pour éviter les erreurs en virgule flottante.g[a,b]
teste si a + bφ <0. Exemple d'utilisation:la source