Presque l'opposé polaire si ce défi, et je pense que ce sera un peu plus facile.
Votre tâche consiste à prendre deux entiers au format a/b
(Formation d'un nombre rationnel) puis à sortir le nombre en décimal exactement.
Par exemple, si vous deviez entrer 1/3
, cela produirait:
0.33333333333333333
Et continuerait à imprimer des 3 jusqu'à la fin des temps, avec un 0 en tête facultatif. (Vous pouvez également imprimer un caractère par ligne si et seulement si votre langue ne permet pas d'imprimer sur la même ligne.)
Le comportement de x/0
sera indéfini. Pour un nombre qui semble ne pas se répéter (comme, disons 5/4
), il se répète. L'un ou l'autre des deux formulaires suivants serait acceptable pour 5/4
:
1.25000000000000000
1.24999999999999999
(La même chose avec des nombres entiers, 1.9999999
ou 2.000000
)
La fraction peut ne pas être dans sa forme la plus simple, et a
ou b
peut être négatif (Note -a/b = -(a/b)
, -a/-b = a/b
, a/-b = -a/b
et -.6249999
est invalide, mais -0.6249999
est acceptable, mais vous pouvez toujours utiliser.
la source
bc
, ou est-ce de la triche?a
et / oub
être négative?a
ou l' autreb
(ou les deux) peuvent être négatifs)Réponses:
CJam,
3837 octetsComment ça fonctionne
la source
C, 108
79Modifier modifié pour fonctionner avec des nombres négatifs.
Entrée de stdin. Ancien style K&R.
la source
Ruby,
83691029189 octetsImplémentation simple de la division entière manuelle basée sur la division entière de l'ordinateur.
Merci à @blutorange pour son aide au golf.
Modifier: correction de la solution pour inclure des nombres négatifs.
la source
->s{a,b=s.split(?/).map &:to_i;$><<a/b<<?.;loop{a=a%b*10;$><<a/b}}
j'adore ça à propos de ruby.?/
de désigner des caractères, je ne savais pas non plus comment$><<
imprimer ou leloop
mot - clé. Merci beaucoup!!$>
est l'abréviation de$stdout
, et<<
est un opérateur. Vous pouvez enregistrer un octet de plus dans la deuxième ligne en le remplaçant parc*d<0&&$><<?-
; quelques octets en combinant la 3ème / 4ème ligne à$><<a/b<<?.
, et un de plus en supprimant l'espace après<<
dans la dernière ligne. Et voici une idée pour le ramener à 91 octets:->s{a,b=s.scan(/\d+/).map &:to_i;1==s.count(?-)&&$><<?-;$><<a/b<<?.;loop{a=a%b*10;$><<a/b}}
(ruby 2.2.0)$><<a/b
ne fonctionnait pas correctement, c'est pourquoi j'y ai mis de l'espace. Le reste semble bon, merci beaucoup!Rational(2,3) == 2/3r
) depuis ruby 2.1 (que j'ai appris il y a environ 10 minutes) qui peut être utilisé pour raccourcir la deuxième ligne:eval(s+?r)<0&&$><<?-
Java,
177176170L'algorithme est simple; la partie délicate était de faire fonctionner l'impression. Au final, j'ai laissé l'ordinateur en veille une seconde entre chaque étape pour qu'il puisse imprimer.
Version étendue et exécutable
la source
R,
103137109 109103Un peu plus heureux avec ça maintenant. L'utilisation de l'analyse avec un séparateur permet d'économiser beaucoup d'octets. Peut encore avoir des améliorations. Remplacé
<-
par=
. Je n'ai pas toujours eu la meilleure des chances avec ça, mais ça a fonctionné cette fois.Essais
la source
Python 3,
107115 octetsAssez simple:
-1/3
->-0.
)* (Bien que le calcul pour
a
été déplacé à l'intérieur de la boucle pour économiser quelques octets.)Edit: correction d'un bug avec des fractions négatives> -1.
la source
Python 2.7, 209 octets
Éditer:
Sort maintenant tous les caractères sur la même ligne, comme demandé.edit2:
Lit maintenant la fraction de l'argument de ligne de commande, comme demandé :)la source
map
au lieu de la compréhension de la liste permet d'économiser un peu; 2) ne pas besoin des parenthèses autourm*a
de l' un de ses sites, comme*
,%
et/
sont tous la même priorité et gauche associative; 3) la logique 0 ou point sur la ligne 3 peut être simplifiée"0."[m==1]
, puisque vous l'imprimez de toute façon; 4) enregistrera probablement les caractères pour simplement définiro=stdout.write
et convertir les arguments numériques en chaîne avec des raccourcis si nécessaire.1/-3
donne-1.666666666
au lieu de-0.333333333
.