Défi
Étant donné un nombre (virgule flottante / décimale), retournez sa réciproque, c'est-à-dire 1 divisé par le nombre. La sortie doit être un nombre à virgule flottante / décimal, pas seulement un entier.
Spécifications détaillées
- Vous devez recevoir une entrée sous la forme d'un nombre à virgule flottante / décimal ...
- ... qui a au moins 4 chiffres significatifs de précision (si nécessaire).
- Plus c'est mieux, mais ne compte pas dans le score.
- Vous devez produire, avec toute méthode de sortie acceptable ...
- ... l'inverse du nombre.
- Cela peut être défini comme 1 / x, x⁻¹.
- Vous devez générer au moins 4 chiffres significatifs de précision (si nécessaire).
L'entrée sera positive ou négative, avec une valeur absolue dans la plage [0,0001, 9999] inclus. Vous ne recevrez jamais plus de 4 chiffres après le point décimal, ni plus de 4 à partir du premier chiffre non nul. La sortie doit être précise jusqu'au 4e chiffre du premier non nul.
(Merci @MartinEnder)
Voici quelques exemples d'entrées:
0.5134
0.5
2
2.0
0.2
51.2
113.7
1.337
-2.533
-244.1
-0.1
-5
Notez que vous ne recevrez jamais d'entrées ayant plus de 4 chiffres de précision.
Voici un exemple de fonction dans Ruby:
def reciprocal(i)
return 1.0 / i
end
Règles
- Toutes les formes de sortie acceptées sont autorisées
- Échappatoires standard interdites
- Il s'agit de code-golf , la réponse la plus courte en octets gagne, mais ne sera pas sélectionnée.
Clarifications
- Vous ne recevrez jamais l'entrée
0
.
Bounties
Ce défi est évidemment trivial dans la plupart des langues, mais il peut offrir un défi amusant dans des langues plus ésotériques et inhabituelles, donc certains utilisateurs sont prêts à attribuer des points pour avoir fait cela dans des langues inhabituellement difficiles.
@DJMcMayhem accordera une prime de +150 points à la réponse de brain-flak la plus courte, car brain-flak est notoirement difficile pour les nombres à virgule flottante@ L3viathan accordera une prime de +150 points à la réponse OIL la plus courte . L'HUILE n'a pas de type natif à virgule flottante, ni de division.
@Riley attribuera une prime de +100 points à la réponse sed la plus courte.
@EriktheOutgolfer attribuera une prime de +100 points à la réponse Sesos la plus courte. La division dans les dérivés de brainfuck tels que Sesos est très difficile, encore moins la division en virgule flottante.
I ( @Mendeleev ) accordera une prime de +100 points à la réponse Retina la plus courte.
S'il y a une langue dans laquelle vous pensez qu'il serait amusant de voir une réponse et que vous êtes prêt à payer le représentant, n'hésitez pas à ajouter votre nom dans cette liste (trié par montant de prime)
Classement
Voici un extrait de pile pour générer un aperçu des gagnants par langue.
Pour vous assurer que votre réponse apparaît, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les rayant. Par exemple:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:
# Perl, 43 + 2 (-p flag) = 45 bytes
Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
la source
1/x
.Réponses:
Brain-Flak ,
772536530482480 + 1 = 481 octetsÉtant donné que Brain-Flak ne prend pas en charge les nombres à virgule flottante, j'ai dû utiliser l'
-c
indicateur dans l'ordre d'entrée et de sortie avec des chaînes, d'où le +1.Essayez-le en ligne!
Explication
La première chose dont nous devons nous occuper est le cas négatif. Étant donné que l'inverse d'un nombre négatif est toujours négatif, nous pouvons simplement conserver le signe négatif jusqu'à la fin. Nous commençons par faire une copie du haut de la pile et en soustrayant 45 (la valeur ASCII de
-
) de celle-ci. Si c'est un, nous mettons un zéro en haut de la pile, sinon nous ne faisons rien. Ensuite, nous ramassons le haut de la pile à déposer à la fin du programme. Si l'entrée a commencé par un-
c'est toujours un-
cependant si ce n'est pas nous finissons par ramasser ce zéro que nous avons placé.Maintenant que c'est hors de propos, nous devons convertir les réalisations ASCII de chaque chiffre en valeurs réelles (0-9). Nous allons également supprimer le point décimal
.
pour faciliter les calculs. Étant donné que nous devons savoir où le point décimal a commencé lorsque nous le réinsérons plus tard, nous stockons un nombre pour garder une trace du nombre de chiffres qui se trouvaient devant le.
sur la pile.Voici comment le code fait cela:
Nous commençons par soustraire 46 (la valeur ASCII de
.
) de chaque élément de la pile (en les déplaçant simultanément sur le hors-pile). Cela fera de chaque chiffre deux de plus que ce qui devrait être, mais fera.
exactement zéro.Maintenant, nous déplaçons tout sur la pile de gauche jusqu'à ce que nous atteignions un zéro (en soustrayant deux de chaque chiffre pendant que nous allons):
Nous enregistrons la hauteur de la pile
Déplacez tout le reste sur la pile de gauche (en soustrayant à nouveau les deux derniers de chaque chiffre lorsque nous les déplaçons)
Et mettez la hauteur de pile que nous avons enregistrée
Maintenant, nous voulons combiner les chiffres en un seul numéro de base 10. Nous voulons également faire une puissance de 10 avec deux fois les chiffres que ce nombre à utiliser dans le calcul.
Nous commençons par mettre en place un 1 sur le dessus de la pile pour faire la puissance de 10 et en poussant la hauteur de pile moins un sur la pile pour l'utilisation de la boucle.
Maintenant, nous bouclons la hauteur de la pile moins 1 fois,
Chaque fois que nous multiplions l'élément supérieur par 100 et en dessous il multiplie l'élément suivant par 10 et l'ajoutons au nombre ci-dessous.
Nous terminons notre boucle
Maintenant, nous avons enfin terminé la configuration et pouvons commencer le calcul réel.
C'était ça...
Nous divisons la puissance de 10 par la version modifiée de l'entrée en utilisant l' algorithme de division entière de 0 tel que trouvé sur le wiki . Cela simule la division de 1 par l'entrée de la seule façon dont Brain-Flak sait comment.
Enfin, nous devons formater notre sortie en ASCII approprié.
Maintenant que nous avons constaté que
ne
nous devons supprimer lee
. La première étape consiste à le convertir en une liste de chiffres. Ce code est une version modifiée de 0 ' l » algorithme de divmod .Maintenant, nous prenons le nombre et ajoutons le point décimal à sa place. Le simple fait de penser à cette partie du code ramène des maux de tête, donc pour l'instant je vais le laisser comme un exercice au lecteur pour comprendre comment et pourquoi cela fonctionne.
Mettez le signe négatif ou un caractère nul s'il n'y a pas de signe négatif.
la source
I don't know what this does or why I need it, but I promise it's important.
1.0
ou10
-c
drapeau soit exécuté avec et hors ASCII. Étant donné que Brain-Flak ne prend pas en charge les nombres flottants, je dois prendre IO comme chaîne.Python 2 , 10 octets
Essayez-le en ligne!
la source
Rétine ,
9991 octetsEssayez-le en ligne!
Woohoo, moins de 100! Ceci est étonnamment efficace, étant donné qu'il crée (et correspond ensuite à) une chaîne avec plus de 10 7 caractères à un moment donné. Je suis sûr que ce n'est pas encore optimal, mais je suis assez satisfait du score pour le moment.
Les résultats avec une valeur absolue inférieure à 1 seront imprimés sans le zéro de tête, par exemple
.123
ou-.456
.Explication
L'idée de base est d'utiliser la division entière (car c'est assez facile avec l'expression régulière et l'arithmétique unaire). Pour garantir que nous obtenons un nombre suffisant de chiffres significatifs, nous divisons l'entrée en 10 7 . De cette façon, toute entrée jusqu'à 9999 donne toujours un nombre à 4 chiffres. En effet, cela signifie que nous multiplions le résultat par 10 7 , nous devons donc garder une trace de cela lors de la réinsertion ultérieure du séparateur décimal.
Nous commençons par remplacer le point décimal, ou la fin de la chaîne s'il n'y a pas de point décimal avec 8 points-virgules. Le premier d'entre eux est essentiellement le point décimal lui-même (mais j'utilise des points-virgules car ils n'ont pas besoin d'être échappés), les 7 autres indiquent que la valeur a été multipliée par 10 7 (ce n'est pas encore le cas, mais nous savons que nous le ferons plus tard).
Nous transformons d'abord l'entrée en un entier. Tant qu'il reste des chiffres après le point décimal, nous déplaçons un chiffre vers l'avant et supprimons l'un des points-virgules. En effet, déplacer le séparateur décimal vers la droite multiplie l'entrée par 10 et divise donc le résultat par 10 . En raison des restrictions d'entrée, nous savons que cela se produira au maximum quatre fois, il y a donc toujours suffisamment de points-virgules à supprimer.
Maintenant que l'entrée est un entier, nous le convertissons en unaire et ajoutons 10 7
1
s (séparés par un,
).Nous divisons l'entier en 10 7 en comptant le nombre de références qui lui correspondent (
$#2
). Ceci est la division unaire standard standarda,b
->b/a
. Il ne nous reste plus qu'à corriger la position du point décimal.Il s'agit essentiellement de l'inverse de la deuxième étape. Si nous avons encore plus d'un point-virgule, cela signifie que nous devons encore diviser le résultat par 10 . Nous faisons cela en déplaçant les points-virgules d'une position vers la gauche et en déposant un point-virgule jusqu'à ce que nous atteignions l'extrémité gauche du nombre, ou que nous nous retrouvions avec un seul point-virgule (qui est le point décimal lui-même).
Il est maintenant un bon moment pour tourner la première (et peut - être seulement) de
;
nouveau dans.
.S'il reste des points-virgules, nous avons atteint l'extrémité gauche du nombre, donc une nouvelle division par 10 insérera des zéros derrière la virgule décimale. Cela se fait facilement en remplaçant chaque reste
;
par un0
, car ils sont de toute façon immédiatement après le point décimal.la source
\B;
par^;
pour économiser 1 octet?-
devant le;
.oui , 5 octets
Essayez-le en ligne! Cela prend l'entrée du haut de la pile et laisse la sortie en haut de la pile. Le lien TIO prend l'entrée des arguments de la ligne de commande, qui est uniquement capable de prendre une entrée entière.
Explication
yup n'a que quelques opérateurs. Ceux utilisés dans cette réponse sont ln (x) (représenté par
|
), 0 () (constant, fonction nilaire renvoyant0
), - (soustraction) et exp (x) (représenté pare
).~
bascule les deux premiers membres de la pile.Cela utilise l'identité
ce qui implique que
la source
LOLCODE ,
63, 56 octets7 octets enregistrés grâce à @devRicher!
Ceci définit une fonction «r», qui peut être appelée avec:
ou tout autre
NUMBAR
.Essayez-le en ligne!
la source
ITZ A NUMBAR
dans l'affectation deI
?HOW DUZ I r YR n VISIBLE QUOSHUNT OF 1 AN n IF U SAY SO
(ajouter des nouvelles lignes) est plus court de quelques octets et peut être appelé avecr d
, le casd
échéantNUMBAR
.IZ
place de àDUZ
cause de la règle de l'interpréteursed , 575 + 1 (
-r
flag) =723718594588576 octetsEssayez-le en ligne!
Remarque: les flottants pour lesquels la valeur absolue est inférieure à 1 devront être écrits sans 0 de tête comme
.5
au lieu de0.5
. De plus, le nombre de décimales est égal à , oùn
est le nombre de décimales dans le nombre (donc donner13.0
en entrée donnera plus de décimales que donner13
en entrée)Ceci est ma première soumission sed sur PPCG. Des idées pour la conversion décimale-unaire ont été tirées de cette réponse étonnante . Merci à @seshoumara de m'avoir guidé à travers sed!
Ce code effectue une longue division répétée pour obtenir le résultat. La division ne prend que ~ 150 octets. Les conversions décimales unaires prennent le plus d'octets, et quelques autres octets servent à prendre en charge les nombres négatifs et les entrées à virgule flottante
Explication
Explication sur TIO
Modifications
s:s/(.)/(.)/g:y/\1/\2/g:g
pour économiser 1 octet à chaque substitution (5 au total)\n
au lieu de;
comme séparateur, j'ai pu raccourcir les substitutions "multiplier par 10" pour économiser 12 octets (merci à @Riley et @seshoumara de me l'avoir montré)la source
JSFuck , 3320 octets
JSFuck est un style de programmation ésotérique et éducatif basé sur les parties atomiques de JavaScript. Il utilise seulement six caractères différents
()[]+!
pour écrire et exécuter du code.Essayez-le en ligne!
la source
return 1/this
serait environ 76 octets de plus quereturn+1/this
.[].fill.constructor('alert(1/prompt())')
2929 octets paste.ubuntu.com/p/5vGTqw4TQQ add()
2931HUILE ,
14281420 octetsTant pis. J'ai pensé que je pourrais aussi bien l'essayer, et j'ai finalement réussi. Il n'y a qu'un seul inconvénient: il faut presque autant de temps pour exécuter que pour écrire.
Le programme est séparé en plusieurs fichiers, qui ont tous les noms de fichiers à 1 octet (et comptent pour un octet supplémentaire dans mon calcul d'octets). Certains fichiers font partie des fichiers d'exemple du langage OIL, mais il n'y a pas vraiment de moyen de les appeler de manière cohérente (il n'y a pas encore de chemin de recherche ou quelque chose comme ça dans OIL, donc je ne les considère pas comme une bibliothèque standard), mais cela signifie également que (au moment de la publication) certains fichiers sont plus verbeux que nécessaire, mais généralement de quelques octets seulement.
Les calculs sont précis à 4 chiffres de précision, mais le calcul d'une simple réciproque (comme l'entrée
3
) prend beaucoup de temps (plus de 5 minutes). À des fins de test, j'ai également fait une variante mineure précise à 2 chiffres, qui ne prend que quelques secondes à exécuter, afin de prouver que cela fonctionne.Je suis désolé pour l'énorme réponse, j'aimerais pouvoir utiliser une sorte de balise de spoiler. Je pourrais également en mettre la majeure partie sur gist.github.com ou quelque chose de similaire, si vous le souhaitez.
C'est
main
parti:, 217 octets (le nom de fichier ne compte pas pour les octets):a
(vérifie si une chaîne donnée est dans une autre chaîne donnée), 74 + 1 = 75 octets:b
(joint deux chaînes données), 20 + 1 = 21 octets:c
(étant donné un symbole, divise la chaîne donnée lors de sa première occurrence), 143 + 1 = 144 octets (celui-ci est évidemment toujours jouable au golf):d
(étant donné une chaîne, obtient les 4 premiers caractères), 22 + 1 = 23 octets:e
(division de haut niveau (mais avec un danger de division zéro)), 138 + 1 = 139 octets:f
(déplace un point de 4 positions vers la droite; "divise" par 10000), 146 + 1 = 147 octets:g
(vérifie si une chaîne commence par un caractère donné), 113 + 1 = 114 octets:h
(retourne tout sauf le premier caractère d'une chaîne donnée), 41 + 1 = 42 octets:i
(soustrait deux nombres), 34 + 1 = 35 octets:j
(division de bas niveau qui ne fonctionne pas dans tous les cas), 134 + 1 = 135 octets:k
(multiplication), 158 + 1 = 159 octets:l
(retourne la valeur absolue), 58 + 1 = 59 octets:m
(ajout), 109 + 1 = 110 octets:la source
J, 1 octet
%
est une fonction donnant l'inverse de son entrée. Vous pouvez l'exécuter comme cecila source
Taxi , 467 octets
Essayez-le en ligne!
Non golfé:
la source
Vim,
108 octets / touchesPuisque V est rétrocompatible, vous pouvez L' essayer en ligne!
la source
=
. S'appuyant uniquement sur d'autres macros, registres pour conserver la mémoire et touches pour parcourir et modifier les données. Ce serait beaucoup plus complexe mais je pense que ce serait tellement cool! Je pensef
que jouerait un rôle énorme en tant que test conditionnel.6431.0
donc il est traité comme un nombre à virgule flottanteLangage machine Linux x86_64, 5 octets
Pour tester cela, vous pouvez compiler et exécuter le programme C suivant
Essayez-le en ligne!
la source
rcpss
calcule uniquement une réciproque approximative (environ 12 bits de précision). +1C,
1512 octetsEssayez-le en ligne!
1613 octets, s'il a besoin de gérer également les entrées entières:Vous pouvez donc l'appeler avec
f(3)
au lieu def(3.0)
.Essayez-le en ligne!
Merci à @hvd pour avoir joué au golf 3 octets!
la source
f(x)
par1/x
. Lorsque la "fonction" est exécutée, ce qui peut arriver aussi tard que lors de l'exécution ou dès que votre compilateur se sent (et peut s'avérer correct), n'est techniquement pas l'étape du préprocesseur.2
et-5
en entrée. Les deux2
et-5
sont des décimales, contenant des chiffres compris entre 0 et 9.#define f 1./
fonction : fonctionne aussi.MATLAB / Octave, 4 octets
Crée un descripteur de fonction (nommé
ans
) pour lainv
fonction intégréeDémo en ligne
la source
05AB1E , 1 octet
Essayez-le en ligne!
la source
GNU sed ,
377362+ 1 (drapeau r) = 363 octetsAttention: le programme va consommer toute la mémoire système essayant de s'exécuter et nécessitera plus de temps pour terminer que vous ne seriez prêt à attendre! Voir ci-dessous pour une explication et une version rapide, mais moins précise.
Ceci est basé sur la réponse Retina de Martin Ender. Je compte à
\t
partir de la ligne 2 comme un onglet littéral (1 octet).Ma principale contribution est à la méthode de conversion de décimal en unaire simple (ligne 2), et vice versa (ligne 5). J'ai réussi à réduire considérablement la taille du code nécessaire pour ce faire (de ~ 40 octets combinés), par rapport aux méthodes indiquées dans un conseil précédent . J'ai créé une astuce distincte avec les détails, où je fournis des extraits prêts à l'emploi. Étant donné que 0 n'est pas autorisé en entrée, quelques octets supplémentaires ont été enregistrés.
Explication: pour mieux comprendre l'algorithme de division, lisez d'abord la réponse Retina
Le programme est théoriquement correct, la raison pour laquelle il consomme autant de ressources de calcul est que l'étape de division est exécutée des centaines de milliers de fois, plus ou moins en fonction de l'entrée, et le regex utilisé donne lieu à un cauchemar de retour en arrière. La version rapide réduit la précision (d'où le nombre d'étapes de division) et modifie l'expression régulière pour réduire le retour en arrière.
Malheureusement, sed n'a pas de méthode pour compter directement combien de fois une rétro-référence s'intègre dans un modèle, comme dans la rétine.
Pour une version rapide et sûre du programme, mais moins précise, vous pouvez l' essayer en ligne .
la source
Japt , 2 octets
La solution évidente serait
qui est, littéralement,
1 / input
. Cependant, nous pouvons faire mieux:Ceci est équivalent à
input ** J
etJ
est défini sur -1 par défaut.Essayez-le en ligne!
Fait amusant: tout comme
p
la fonction de puissance,q
la fonction racine l'est aussi (p2
=**2
,q2
=**(1/2)
); cela signifie queqJ
cela fonctionnera aussi, depuis-1 == 1/-1
, et doncx**(-1) == x**(1/-1)
.la source
Javascript ES6, 6 octets
Essayez-le en ligne!
Javascript par défaut est une division en virgule flottante.
la source
APL, 1 octet
÷
Calcule réciproque lorsqu'il est utilisé comme fonction monadique. Essayez-le en ligne!Utilise le jeu de caractères Dyalog Classic.
la source
Cheddar , 5 octets
Essayez-le en ligne!
Ceci utilise
&
, qui lie un argument à une fonction. Dans ce cas,1
est lié au côté gauche de/
, ce qui nous donne1/x
, pour un argumentx
. C'est plus court que le canoniquex->1/x
d'un octet.Alternativement, dans les versions les plus récentes:
la source
(1:/)
pour le même nombre d'octetsJava 8, 6 octets
Presque la même que la réponse JavaScript .
la source
MATL , 3 octets
Essayez-le sur MATL Online
Explication
la source
Python, 12 octets
Un pour 13 octets:
Un pour 14 octets:
la source
Mathematica, 4 octets
Vous fournit un rationnel exact si vous lui donnez un rationnel exact et un résultat en virgule flottante si vous lui donnez un résultat en virgule flottante.
la source
ZX Spectrum BASIC, 13 octets
Remarques:
SGN PI
au lieu de littéral1
.Version ZX81 pour 17 octets:
la source
LET A=17
et refactoriser votre application sur une ligne1 PRINT SGN PI/A
, vous devrez cependant changer la valeur de A avec plus de frappe à chaque fois que vous souhaitez exécuter votre programme.Haskell , 4 octets
Essayez-le en ligne!
la source
R, 8 octets
Assez simple. Émet directement l'inverse de l'entrée.
Une autre solution, mais d'un octet plus long, peut être:,
scan()^-1
ou mêmescan()**-1
pour un octet supplémentaire. Les deux^
et**
le symbole de puissance.la source
TI-Basic (TI-84 Plus CE),
652 octets-1 octet grâce à Timtech .
-3 octets avec
Ans
remerciements à Григорий Перельман .Ans
et⁻¹
sont des jetons d'un octet .TI-Basic renvoie implicitement la dernière valeur évaluée (
Ans⁻¹
).la source
Ans
, vous pouvez donc le remplacer parAns⁻¹
Gelée , 1 octet
Essayez-le en ligne!
la source
Jelly programs consist of up to 257 different Unicode characters
.¶
et le caractère de saut de ligne peuvent être utilisés de manière interchangeable , donc alors que le mode Unicode "comprend" 257 caractères différents, ils sont mappés à 256 jetons.C, 30 octets
la source
0
pour enregistrer un octet. Avec,1.
il sera toujours compilé en double.1.
est toujours traité comme un entier.echo -e "#include <stdio.h>\nfloat f(x){return 1./x;}main(){printf(\"%f\\\\n\",f(5));}" | gcc -o test -xc -
Output of./test
is0.200000
float f(float x){return 1/x;}
fonctionnerait correctement..
- C sera heureusement implicitement converti(int)1
en en(float)1
raison du type dex
.