Implémentez une fonction divide(int a, int b, int c)
qui imprime la valeur de base 10 de a/b
. sans utiliser de mathématiques en virgule flottante ni BigInteger
/ BigDecimal
ou de bibliothèques équivalentes. Au moins c
des caractères précis dans l'ensemble de 0123456789.
doivent être imprimés, à l'exception de l'exception (possible) du point 4 ci-dessous.
a
etb
peut être n'importe quel entier 32 bits. Mise à jour: si, à des fins de golf, vous souhaitez que les entrées soient des primitives 64 bits, cela est correct, mais vous n'avez pas besoin de prendre en charge toute la plage de données 64 bits.- Vous n'avez pas besoin de vérifier que
c
c'est positif (bien que nous espérons que votre programme ne plante pas) si ce n'est pas le cas. - La borne supérieure minimale prise en charge pour
c
est500
. Ce n'est pas grave si votre programme ne prend pas en charge les valeursc
ci500
- dessus , mais c'est également correct si c'est le cas. - Pour les nombres qui se divisent uniformément, vous avez le choix d'imprimer des zéros supplémentaires (basés sur la valeur de
c
) ou rien. - Vous n'avez pas besoin de pouvoir utiliser la fonction pour effectuer d'autres tâches avec le quotient, le seul objectif est l'impression.
- Pour les nombres entre
-1
et1
, vous avez le choix d'imprimer ou non un interligne0
. Cependant, c'est le seul scénario où l'impression d'un zéro de tête est acceptable et vous ne pouvez imprimer qu'un seul de ces zéro. - Vous pouvez utiliser n'importe quelle logique d'arrondi / plancher / plafond que vous préférez pour la dernière décimale.
- Pour une réponse négative, vous devez imprimer un interligne
-
. Cela ne compte pasc
. Cependant, il est de votre choix si vous souhaitez imprimer,
+
ou rien pour une réponse positive. - La division entière et le module entier sont tous deux autorisés. Cependant, gardez à l'esprit que vous êtes limité aux primitives, à moins que vous ne choisissiez d'implémenter votre propre
BigInteger
/BigDecimal
bibliothèque qui compte contre votre longueur de code. - Vous n'avez pas besoin de gérer l'
b
être0
, bien que vous puissiez le faire si vous le souhaitez. Votre programme peut entrer dans une boucle infinie, ou se bloquer, sib=0
, et vous ne serez pas pénalisé. - Léger changement de règle par commentaire. Pour vous assurer que le terrain de jeu est de niveau, alors que
a
etb
sont garantis comme étant des entiers 32 bits, vous pouvez utiliser des entiers longs 64 bits. Si votre langue choisie va au-delà des entiers 64 bits en tant que primitive, vous ne pouvez à aucun moment utiliser cette fonctionnalité (prétendre qu'elle est limitée à 64 bits). - Un autre point qui n'est pas clair (cependant, cela ne devrait changer aucune des réponses valides actuelles): bien qu'il
c
puisse être interprété comme le nombre de caractères imprimés ou le nombre d'espaces après la décimale, votre programme doit utiliserc
d'une manière pertinente d'une manière pertinente pour décider du nombre de caractères à imprimer. En d'autres termes, ladivide(2,3,2)
sortie devrait être beaucoup plus courte quedivide(2,3,500)
; il n'est pas correct d'imprimer 500 caractères sans tenir compte dec
. - En fait, je me fiche du nom de la fonction.
d
est correct pour le golf.
Contribution
Un appel de fonction et une lecture stdin
sont acceptés. Si vous lisez stdin
, tout caractère ne figurant pas dans l'ensemble [-0123456789]
est considéré comme un délimiteur d'argument.
Production
Caractères stdout
comme décrit ci-dessus.
Exemple
pour divide(2,3,5)
, toutes les sorties suivantes sont acceptables:
0.666
0.667
.6666
.6667
0.666
0.667
.6666
.6667
+0.666
+0.667
+.6666
+.6667
Un autre exemple: pour divide(371,3,5)
ce qui suit sont toutes les sorties acceptables:
123.6
123.7
123.6
123.7
+123.6
+123.7
123.66666
123.66667
123.66666
123.66667
+123.66666
+123.66667
Et pour divide(371,-3,5)
ce qui suit sont tous acceptables:
-123.6
-123.7
-123.66666
-123.66667
92,3,5
la réponse serait, par exemple,30.67
Réponses:
Java, 92/128
J'ai dû improviser pour que
a
oub
puisse être -2147483648 car les entiers 32 bits positifs ne comptent que pour 2147483647, c'est pourquoia
est devenu unlong
. Il pourrait y avoir une meilleure façon de gérer les résultats négatifs, mais je n'en connais aucun (ildouble
est probable que cela fonctionneraabs(a) < abs(b)
comme ils l'ont fait,-0
mais seul le complément conservera la précision).Pourquoi deux nombres d'octets? J'avais besoin de 92 octets pour le calcul et de 36 pour l'assistant d'impression (
System.out.print
ça craint; généralement Java n'est pas si golfique).La méthode utilise essentiellement ce que la plupart d'entre nous avons appris à l'école pour générer les chiffres décimaux demandés.
la source
Integer.MIN_VALUE
n'est pas acceptable, mais qu'enlong
tant qu'entrée, c'est bien.System.out
rend Java volumineux ;-) Toujours un bon sentiment, qu'il existe déjà des réponses plus longues.C,
989589imprime des
c
chiffres après.
exemple de sortie:
devrait fonctionner pour -2147483647 <= a <= 2147483647, idem pour b. manipuler le
-
était une douleur.version en ligne: ideone
la source
a=-a
.printf("-")
renvoie 1.PHP, 108
Il fonctionne simplement en sortant le quotient de
a
/b
pendant une boucle d'c
étapes,a
devenant le reste multiplié par 10 à chaque itération.DEMO
la source
function d($a,$b,$c){if($a*$b<0)$a*=-print'-';for($p='.';$c--;$a*=10,$p=''){$a-=$b*$i=($a-$a%$b)/$b;echo$i.$p;}}
voir valeur de retourPython 111
Cette solution ne viole aucune des règles énoncées.
la source
C: 72 caractères
Il fait presque entièrement ce qu'il est censé faire. Cependant, comme certaines des autres réponses ici donneront des valeurs bancales ou échoueront
d(-2147483648,b,c)
etd(a,-2147483648,c)
puisque la valeur absolue de -2147483648 est hors limites pour un mot de 32 bits.la source
Perl, pas d'arithmétique, 274 octets
Il s'agit d'une longue division euclidienne , susceptible de consommer une quantité inhabituelle de mémoire. Le plus proche des mathématiques sur les nombres à virgule flottante est d'utiliser des opérations binaires pour les analyser.
Exemples:
Production:
la source
Rubis, 178
Version en ligne pour les tests.
L'astuce consiste à multiplier un par un nombre assez élevé, donc le résultat n'est qu'un multiple entier de l'opération à virgule flottante. Ensuite, le point et les zéros doivent être insérés au bon endroit dans la chaîne résultante.
la source
g
au-delà de 64 bits pour les grandsc
? Edit: Je pense que vous utilisez implicitementBigInteger
icig
est une chaîne, mais avant d'appeler,to_s
vous avez créé un numéro en mémoire d'une taille supérieure à 64 bitspython 92 octets:
je pense que plus de golf est possible .....
la source
e
au-delà de 64 bits pour les grands c? Edit: Je pense que vous utilisez implicitementBigInteger
ici.a=5
etc=400
ensuite aprèse=10**c
, en hexadécimal, le nombre comporte 333 chiffres. Il démarre8889e7dd7f43fc2f7900bc2eac756d1c4927a5b8e56bbcfc97d39bac6936e648180f47d1396bc905a47cc481617c7...
c'est plus de 64 bits.C 83
Même idée que j'ai utilisée dans mon implémentation python
la source
d(-2147483648,-1,10)