Vous vous souviendrez peut-être en première ou en deuxième année en utilisant une forme développée pour en savoir plus sur la valeur de position des nombres. C'est plus facile à expliquer avec un exemple, alors considérez le nombre 123
. Sous forme développée, il est représenté comme 100 + 20 + 3
ce qui aide un jeune esprit à visualiser la valeur de position. Cela rappelle comment vous le dites: cent (plus) vingt (plus) trois.
Nous pouvons prolonger ce passé la place des unités avec des décimales: 2.718 => 2 + 0.7 + 0.01 + 0.008
Votre défi consiste à écrire un programme ou une fonction prenant un nombre à virgule flottante positif ou zéro (supposons qu'il soit aussi grand ou précis que votre langage peut le gérer; il ne s'agira pas de notation scientifique) ou chaîne et l'affiche / le renvoie sous forme développée. comme expliqué ci-dessus.
Vous n'avez besoin ni d'espaces entre le +
's ni du zéro avant le point décimal, ainsi l'exemple ci-dessus pourrait l'être 2+.7+.01+.008
. Les valeurs qui seraient égales à zéro doivent être omises ( 101.01 => 100 + 1 + 0.01
) sauf si l'entrée est zéro (voir ci-dessous).
Les valeurs ne doivent pas avoir plus d'un zéro avant le point décimal, ni de zéros à la fin (non-non:) 0060, 0000.2, 30., 30.000, .0400
. L'entrée sera conforme à cela aussi.
Étant donné que les élèves de première année ont une capacité d'attention limitée, votre code devra être aussi court que possible.
Cas de test
0 => 0
6 => 6
0.99 => 0.9 + 0.09
24601 => 20000 + 4000 + 600 + 1
6.283 => 6 + 0.2 + 0.08 + 0.003
9000000.0000009 => 9000000 + 0.0000009
la source
Réponses:
CJam,
3326 octetsCela ne fonctionnera pas avec l'interpréteur Java. elle imprime différemment. Essayez-le avec l' interprète CJam .
Le dernier cas de test est imprimé
9000000+9e-7
et validé par @NinjaBearMonkey .Merci à @ jimmy23013 pour le golf de 7 octets!
Comment ça fonctionne
la source
r_ee\'0fe<f{\~t~}{},'+*0e|
.JavaScript (ES7), 102 octets
Explication
Requiert que le nombre soit saisi sous forme de chaîne sans zéros non majuscules (sauf s’il s’agit
0
bien entendu du nombre ).Remarque: en raison de l'étrangeté en virgule flottante, certains nombres (comme
.3
) ne sont pas corrects, mais théoriquement, cela fonctionne pour n'importe quel nombre.Tester
Testez utilise
Math.pow
au lieu de**
pour la compatibilité du navigateur.Afficher l'extrait de code
la source
Math.floor
=>0|
...?1
ilMath.log10(n)
renverrait un nombre négatif et|0
arrondit à zéro au lieu du revêtement de sol.0|Math.log10(n),p-=p<0
au lieu deMath.floor(Math.log10(n))
?n<1
parce que le0|
ferap
égale0
pour les deux0.1
et-0.1
. Le moyen le plus courtp=Math.log10(n),p=p-(p<0)|0
auquel je puisse penser est celui qui a la même longueur que l’utilisationMath.floor
. :(n=0.1
.Retina ,
867775 octetsLe nombre d'octets suppose que la source est codée en tant qu'ISO 8859-1.
Le retour à la ligne est important.
Essayez-le en ligne.
Explication
Nous commençons par transformer l'entrée en une liste de composants séparée par saut de ligne, bien que seul le premier chiffre (ou le dernier chiffre) soit correct. Cela se fait en abusant d'une étape fractionnée. Au lieu de scinder l’entrée, nous faisons correspondre toutes les entrées, les segments restants sont donc tous vides. Nous supprimons ces segments vides avec l'
_
option. Le problème est que les étapes fractionnées renvoient également les valeurs de tous les groupes de capture. Nous utilisons donc un lookahead à chaque correspondance pour capturer la partie correcte de la chaîne: nous essayons d’abord de trouver une partie.
gauche de la correspondance. Si tel est le cas, nous capturons tout de la.
jusqu'à et y compris le chiffre que nous correspondons actuellement. Sinon, nous devons être dans la partie entière de l’entrée, nous allons donc capturer tous les nombres après la correspondance (y compris la correspondance). Nous devons également supprimer le point décimal lui-même, la deuxième capture est donc facultative. S'il n'y a aucune\d
capture à faire, cela supprimera simplement la correspondance de l'entrée.Nous utilisons maintenant une étape de translittération pour convertir tous les chiffres sauf les premiers / derniers en zéros. Nous correspondre soit à un composant qui est inférieur à 1 avec
\..+\B
lequel les\B
assure que nous nous arrêtons le match un chiffre avant la fin, ou nous correspond à une partie entière avec(?<=^\d).+
laquelle les assure que nous arrières , commencent un chiffre dans le numéro. L'étape de translittération remplacera alors les chiffres (d
) par des zéros à l'intérieur des correspondances.Maintenant, le format de sortie actuel ne devrait
+
pas utiliser de sauts de ligne comme séparateurs. Le¶
correspond à un saut de ligne pour faire la substitution. Pendant que nous y sommes, nous supprimons également les lignes qui ne contiennent que0
s et.
s.L'étape précédente ne supprime pas les caractères d'avance ou de fin
0
(car ceux-ci n'ont pas de saut de ligne avant et après eux), nous les supprimons donc explicitement.la source
Python 2,
216210196175 octetsVoici quelques codes légèrement golfés que je jouerai plus loin quand j'aurai le temps. Il utilise une analyse de chaîne.
Explication
Ainsi, l’entrée est séparée en une partie entière et décimale. Ensuite, il y a une compréhension pour la liste de boucle. Sur la partie entière, la longueur de la chaîne après un caractère dans la décimale est multipliée par "0" pour obtenir autant de zéros à la fin de ce caractère.
Pour la partie décimale, l'index du caractère en cours est le nombre de zéros qui le précède et cette partie est donc simple.
L'essai et l'exception est utilisé pour déterminer s'il a une partie décimale ou non (en utilisant une erreur).
Le résultat final est associé à des signes plus.
Essayez-le ici!
la source
o if o else ["0"]
peut êtreo or["0"]
.o=[(...)] for
,e(I) if
,e(i[1]) if
,print "+"
et la parenthèse extérieure danso=[(...)
aussi bien, en fait. Enfin, vous pouvez supprimer la condition finale de la fonction de jointure de la manière suivante:print"+".join(o)or"0"
parce que join retournera une liste vide sio
est vide, la conditionnelle sera évaluée de la même manière, ce qui vous permettra d'économiser un octet.Pyth, 30 octets
Suite de tests
La solution de base consiste à remplacer tous les chiffres de l’entrée par
0
, à insérer chaque chiffre à l’emplacement approprié, à évaluer, à filtrer les zéros et à se joindre au plus. Malheureusement, la fonction eval de Pyth n'accepte pas les zéros non significatifs pour le moment. Je vais travailler pour résoudre ce problème.Pour résoudre ce problème, j'ai ajouté une fonction d'assistance
y
, qui relance récursivement l'évaluation jusqu'à ce qu'aucune erreur ne soit générée, en supprimant le premier chiffre à chaque fois. Notez que cette fonction sera bouclée indéfiniment sur une entrée invalide.En outre, un cas spécial était nécessaire pour la saisie
0
.Globalement, je pense que le code est plutôt bon, mais les installations linguistiques pourraient être meilleures. Qui veut des erreurs?
la source
Python 3, 138
Ceci est vaguement basé sur l’approche de TanMath / Ogaday consistant à lire le nombre sous forme de chaîne et à l’analyser de cette façon. Je dois utiliser l’affectation des étoiles
i
pour qu’elle gère correctement les entiers.la source
Python,
141132128 octetsCelui-ci est encore relativement lisible. Convertissez en chaîne et gérez les
>1
chiffres séparément des<1
chiffres. Nous avons également un cas particulier pour zéro. Je pourrais supprimer deux autres espaces en-dessous, mais j'aime bien le garder.L'inconvénient est qu'il sera ventilé pour les flotteurs avec plus de 9 décimales.
Ci-dessous est l'original. La première modification consistait à raccourcir le cas spécial zéro, la deuxième à supprimer le 0 avant la virgule, la troisième à supprimer certaines parenthèses et espaces.
Explication:
la source
Mathematica, 81 octets
Cas de test:
la source
CJam, 44 octets
Essayez ici.
Il échoue le dernier cas de test et génère les éléments suivants:
Mais disons que c'est trop précis que CJam ne peut pas le gérer.
Explication
la source
Python 3,
187180173154 octetsGéré au golf à un bon 19 octets grâce aux suggestions de @Thomas Kwa à propos de la
result or['0']
réorganisation de l'algèbre ( 154 octets ):Ma meilleure tentative jusqu'ici( 173 octets ). Basé sur une nouvelle approche, voir le bas de l'article:J'ai joué mon original à 180 octets :
J'ai appris une nouvelle fonctionnalité de langue aujourd'hui en faisant cela! Conditions conditionnelles via indexation booléenne. J'ai peut-être un peu exagéré.
J'ai essayé de résumer les compréhensions, mais je ne pouvais pas la raccourcir ( 196 octets ):
(Inverser les séquences coûte cher!)
Bien que le mien soit plus court pour l’instant, je pense que TanMath peut jouer comme il le souhaite: utiliser
e=enumerate
, remplacerpass
par0
et utiliser'0'
à la place de['0']
la déclaration doit faire économiser 4 + 3 + 2 = 9 octets! Je suis sûr que quelques octets supplémentaires peuvent être supprimés quelque part ...edit Nouvelle approche ( 156 octets ). Cependant, il ne peut gérer qu'une précision allant jusqu'à 6dp, similaire à l'entrée CJam de @ jimmy23013, de sorte qu'il échoue au test final. Je ne pouvais pas le contraindre à imprimer plus de 0, peut-être que quelqu'un d'autre peut le faire. Au lieu de cela, je l'ai utilisé comme base de ma meilleure tentative pour le moment, voir ci-dessus (De plus, cette approche affiche le 0 avant la décimale, mais cela semble également valable.). A pris l'
try:... except:...
approche de TanMath:la source
pure bash, 210
ou
Tester:
la source
Python, 131 octets
Une fonction récursive vraiment très compliquée, probablement pas la meilleure façon de procéder. Entrée comme
f("10.0203")
.la source
C,
155153161 octets+2 à lier dans la bibliothèque mathématique (la source elle-même est 159).
Ungolfed
la source
Dyalog APL , 47 octets
Prend nombre sous forme de vecteur de caractères, par exemple
'123'
.Exemples:
Remarques:
○ La raison du dernier exemple modifié est que APL, comme certaines des autres soumissions, passera par défaut à la notation scientifique pour des nombres aussi extrêmes.
○ La phrase
↑⍕¨f¨,¨
n'est nécessaire que pour traiter tous les exemples à la fois.la source
Rétine, 113 octets
Actuellement beaucoup plus long que la solution de Martin mais utilise une méthode différente, j'ai donc décidé de l'afficher.
Essayez-le en ligne ici.
la source
perl, 132 octets
131 +1 pour le
-p
commutateur.Ceci est basé sur ma
sed
réponse précédente :Suite de tests:
la source
Powershell -
172166193 octetsTous sur une seule ligne:
Ungolfed:
Cas de test, plus un supplémentaire:
la source
$args = 0
. Voici une correction de bogue simple qui économise également 3 octetsPerl, 248 octets
Eh bien, je suis noobish au golf Perl.
Essayez ici.
la source
5
ce retour50
.Java,
284244243 octetsMalheureusement, je ne pouvais pas trouver un moyen plus court de créer des chaînes répétitives que:construire unchar[]
de la longueur requiseutiliserArrays.fill
pour définir les caractèresutilisernew String
afin qu'il puisse être concaténéInspiré par @Khaled A Khunaifer, je pouvais me débarrasser de 40 octets.
Edit:
indexOf
prend un int, je pourrais donc le remplacer'.'
par46
. Malheureusement, cela ne semble pas être possible avecreplace
.la source
.replace('\0','0')
fonction remplacerString
nechar
devrait pas , il devrait être.replace("\0","0")
Python, 125 octets
Après avoir supprimé ma première réponse (sry!) Qui ne pouvait pas gérer de petits nombres en raison de problèmes de machine epsilon, j'ai trouvé une solution différente. Il gère les flottants ainsi que les entiers, les zéros de fin (!) Et est écrit en tant que fonction.
Merci à @ogaday pour les astuces utiles et pour le compact '0'-fix!
Golfé:
Ungolfed:
Usage:
la source
f('0')
Cela échoue cependant, et quand je copie / colle directement dans mon interprète, je reçois la notation scientifique (ce qui me semble bien). Aussi,list(c)
est plus courte. Si vous concaténez le'.'
avant de le transformer en une liste, vous n'avez pas besoin de l'ajouter[]
non plus. Utiliserfind
au lieu d'index sur la chaîne avant de la transformer en liste, après l'ajout'.'
vous enregistre également un octet. Réordonner l'inégalité vous permet également de supprimer un espace supplémentaire:def f(x):x+='.';i=x.find('.');z=list(x);del z[i];return"+".join([str(int(o)*10**(i-j-1))for j,o in enumerate(z)if"0"<o])or'0'
CoffeeScript, 144 octets
Solution simple:
Exécutable:
Afficher l'extrait de code
la source
Stax , 18 octets
Exécuter et déboguer
Déballé, non golfé et commenté, cela ressemble à ceci.
Exécuter celui-ci
Comme beaucoup d'autres solutions publiées, il produit
9000000+9e-7
pour le dernier cas de test. Selon les précédents établis, cela est autorisé car le test élémentaire est trop précis pour la langue.la source
Lua, 350 octets
Je pense qu'il y a deux façons de jouer plus bas:
Je pourrais utiliser
macro.define
pour remplacer certaines expressions communes ( je ne peux pas tester pour le moment, et je ne suis pas sûr que cela me ferait gagner des octets)Utilisez split sur le point au lieu d'itérer sur toute la chaîne. Encore une fois, je ne suis pas sûr que cela réduirait la taille de cette fonction, car la manipulation de ficelle dans Lua est assez pénible.
Des explications
Vous pouvez tester lua en ligne et utiliser le code source suivant pour l'exécuter avec certains cas de test.
la source
C, 253 octets
Remarque:
putchar(8)
devrait effectuer un retour arrière.Détaillé , essayez ici
la source
sed,
136128 octetsRéduit de 8 caractères en laissant tomber des espaces et inutile
0
.Cas de test:
la source
JavaScript (ES7), 114 octets
Fonctionne avec des nombres de longueur arbitraires car il utilise une manipulation de chaîne.
Sans la compréhension du tableau (122 octets):
Ungolfed:
la source
R - 133 octets
Robuste, ignore Machine Epsilon et fonctionne également avec des zéros à la fin.
a) Golfé:
Ungolfed:
Usage:
la source