Écrivez un programme ou une fonction qui, étant donné deux entiers a, b, émet une chaîne contenant un nombre décimal représentant exactement la fraction a / b .
Si a / b est un entier, affichez simplement la valeur, sans point décimal ni zéros non significatifs:
123562375921304812375087183597 / 2777 -> 44494913907563850333124661
81 / 3 -> 27
-6 / 2 -> -3
Si a / b n'est pas un entier mais a une représentation finie en base 10, sortez la valeur sans zéros de tête ou de fin (sauf un zéro unique avant le point):
1 / 2 -> 0.5
3289323463 / -250000000 -> -13.157293852
Enfin, si et seulement si (donc non 0.999...
) a / b n'est pas entier et n'a pas de représentation finie, sortez la partie finie suivie de la partie répétitive entre parenthèses. La partie répétée doit être aussi petite que possible et commencer le plus tôt possible.
-1 / 3 -> -0.(3)
235 / 14 -> 16.7(857142)
123 / 321 -> 0.(38317757009345794392523364485981308411214953271028037)
355 / 113 -> 3.(1415929203539823008849557522123893805309734513274336283185840707964601769911504424778761061946902654867256637168)
Votre programme doit fonctionner pour tous les exemples ci-dessus en moins de 10 secondes sur un ordinateur de bureau moderne. Le plus petit programme en octets gagne.
Réponses:
Perl 6 ,
63 5850 octetsEssaye-le
Si vous ne vous souciez pas que cela ne fonctionne qu'avec des dénominateurs qui tiennent dans un entier 64 bits, il peut être raccourci à seulement 43 octets:
Étendu:
la source
Python 2, 174 octets
Je ne suis pas tout à fait convaincu de la validité de cette réponse, mais cela a fonctionné pour les cas de test ci-dessus et d'autres cas de test que j'ai lancés dessus. Cela ressemble à un bon bordel, donc je suis sûr qu'il y a beaucoup de place pour le golf.
La configuration initiale prend les valeurs absolues des deux arguments pour garantir que nous avons affaire à des nombres non négatifs (en enregistrant le calcul du signe pour plus tard) et délègue la partie quotient du résultat à l'arithmétique de précision arbitraire de Python. La partie fractionnaire se fait avec l'algorithme de division scolaire jusqu'à ce que nous obtenions une répétition dans le reste. Nous recherchons ensuite la dernière fois que nous avons vu cette répétition afin d'obtenir le point et construisons la chaîne en conséquence.
Notez que l'algorithme est en fait assez lent en raison de l'opération O (n)
in
, mais il est assez rapide pour les exemples.la source
Lot,
349344 octetsModifier: enregistré 5 octets en supprimant les caractères inutiles. "Non golfé":
la source
set /a
.Java,
625605Code golf:
Remarque: Je compte l'importation statique comme faisant partie de la fonction à des fins de golf.
Cette fonction commence par obtenir le résultat de la division. Il ajoute la partie intégrale et le signe, si nécessaire. S'il reste, il effectue une division longue en base 10. À chaque étape, effectuez la division. Stockez le chiffre calculé et le reste dans deux listes. Si nous rencontrons le même chiffre et le reste à nouveau, il y a une partie répétée et nous savons à quel indice il commence. Le code ajoute les chiffres (pas de répétition) ou les chiffres de pré-répétition, puis les chiffres répétés entre parenthèses.
C'est un peu gros principalement à cause de
BigInteger
. Si les entrées ne débordaient même pas,long
cela pourrait être un peu plus court. Pourtant, je m'attends à ce qu'il existe des moyens d'améliorer cette entrée.Code non golfé avec méthode principale de test:
Sortie du programme:
la source
a, BigInteger
. Je pense aussi que vous pourriez aliasBigInteger.TEN
etBigInteger.ZERO
.while (true)
->for (;;)
qui m'a également permis de mettre des choses dans l'for
initialiseur, en économisant un autre octet.BigInteger
dans mon code, et je ne vois pas comment l'ajout de plus de code pour les réduire à un nom de classe de caractère unique sera payant. Et certainement ajouter du code à traiterint[]
(ce que BigInteger fait déjà en interne) ne fera que gonfler ma réponse.BigInteger
méthodes que j'appelle pour renvoyer une instance de la sous-classe, je devrai ajouter plusieurs transtypages qui alourdissent encore le code. En plus des octets gaspillés pour la surcharge d'une sous-classe, cela augmenterait certainement la taille du code.PHP, 277 octets
la source
Mathematica 198 octets
UnGolfed
Les tests
{"27", "-27", "0,25", "-4. (3)", "2. (714285)", "131572.93852", "16,7 (857142)", "94,6 (428571)"}
la source