27
8
Challenge
Given a (floating-point/decimal) number, return its reciprocal, i.e. 1 divided by the number. The output must be a floating-point/decimal number, not just an integer.
Detailed specification
- You must receive input in the form of a floating-point/decimal number...
- ...which has at least 4 significant digits of precision (if needed).
- More is better, but does not count in the score.
- You must output, with any acceptable output method...
- ...the reciprocal of the number.
- This can be defined as 1/x, x⁻¹.
- You must output with at least 4 significant digits of precision (if needed).
Input will be positive or negative, with absolute value in the range [0.0001, 9999] inclusive. You will never be given more than 4 digits past the decimal point, nor more than 4 starting from the first non-zero digit. Output needs to be accurate up to the 4th digit from the first non-zero one.
(Thanks @MartinEnder)
Here are some sample inputs:
0.5134
0.5
2
2.0
0.2
51.2
113.7
1.337
-2.533
-244.1
-0.1
-5
Note that you will never be given inputs which have above 4 digits of precision.
Here is a sample function in Ruby:
def reciprocal(i)
return 1.0 / i
end
Rules
- All accepted forms of output are allowed
- Standard loopholes banned
- This is code-golf, shortest answer in bytes wins, but will not be selected.
Clarifications
- You will never receive the input
0
.
Bounties
This challenge is obviously trivial in most languages, but it can offer a fun challenge in more esoteric and unusual languages, so some users are willing to award points for doing this in unusually difficult languages.
@DJMcMayhem will award a +150 points bounty to the shortest brain-flak answer, since brain-flak is notoriously difficult for floating-point numbers@L3viathan will award a +150 points bounty to the shortest OIL answer. OIL has no native floating point type, nor does it have division.
@Riley will award a +100 points bounty to the shortest sed answer.
@EriktheOutgolfer will award a +100 points bounty to the shortest Sesos answer. Division in brainfuck derivatives such as Sesos is very difficult, let alone floating-point division.
I (@Mendeleev) will award a bounty of +100 points to the shortest Retina answer.
If there's a language you think would be fun to see an answer in, and you're willing to pay the rep, feel free to add your name into this list (sorted by bounty amount)
Leaderboard
Here is a Stack Snippet to generate an overview of winners by language.
To make sure that your answer shows up, please start your answer with a headline, using the following Markdown template:
# Language Name, N bytes
where N
is the size of your submission. If you improve your score, you can keep old scores in the headline, by striking them through. For instance:
# Ruby, <s>104</s> <s>101</s> 96 bytes
If there you want to include multiple numbers in your header (e.g. because your score is the sum of two files or you want to list interpreter flag penalties separately), make sure that the actual score is the last number in the header:
# Perl, 43 + 2 (-p flag) = 45 bytes
You can also make the language name a link which will then show up in the leaderboard snippet:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=114544,OVERRIDE_USER=62393;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={};e.forEach(function(e){var o=e.language;/<a/.test(o)&&(o=jQuery(o).text().toLowerCase()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link,uniq:o}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.uniq>s.uniq?1:e.uniq<s.uniq?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=617d0685f6f3"> <div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td><a href="{{LINK}}">{{SIZE}}</a></td></tr></tbody> </table>
23
Please stop upvoting trivial answers
– user41805 – 2017-03-30T18:04:01.26315@KritixiLithos People can vote as they see fit. Given the simplicity of this challenge, most, if not all answers are something like
1/x
. – NoOneIsHere – 2017-03-30T18:08:22.2503@NoOneIsHere ...until people have had enough time to implement the reciprocal in languages without floating point numbers and/or division. – Martin Ender – 2017-03-30T18:10:09.840
9This isn't objectively specified without very clear detail on accuracy and precision. – Peter Taylor – 2017-03-30T18:10:43.873
@PeterTaylor Different languages implement floating point numbers very differently. I can't think of a good way to write a spec. I would really appreciate help. – dkudriavtsev – 2017-03-30T18:11:46.873
1Related – Adnan – 2017-03-30T18:15:42.237
Regarding sed and Retina, there is a meta consensus that the input can be in unary. For floating point input I guess '3.5' can be given as '000.00000'. Do you allow it?
– seshoumara – 2017-03-30T18:47:02.830@MartinEnder What I am saying is using most languages make the answer "uninteresting", but in any other language, the answer is bounty-worthy. – NoOneIsHere – 2017-03-30T18:57:52.540
@seshoumara How would you enter 3.1415 in unary? – Digital Trauma – 2017-03-30T19:02:49.777
@DigitalTrauma
000.<1415 zeroes>
– Pavel – 2017-03-30T19:06:51.737@seshoumara I guess... Would make it uninteresting though. I would prefer the (much harder) decimal alternative – dkudriavtsev – 2017-03-30T19:07:57.420
What about
3.05
then? That needs to be distinguishable for3.5
, they can’t both be000.00000
. – Lynn – 2017-03-30T19:15:13.957@Lynn idea: the part after the decimal is reversed. So
3.5
is000.00000
,1.15
is0.0<51 zeroes>
,3.05
is000.<50 zeroes>
– Pavel – 2017-03-30T19:50:14.417@ГригорийПерельман That is interesting, but now the point of saving bytes is defeated, so I might as well take the input in decimal, as the OP prefers. – seshoumara – 2017-03-30T20:03:40.460
1So how exactly does the input format work for very large or small numbers? Do we assume that there's always a
.
somewhere, at least one digit before and one digit after, and we ignore the exact value of all digits past the fourth from the first non-zero one? So input123400.0
would be treated identically to123456.78
? – Martin Ender – 2017-03-30T20:19:48.153And then can we assume that we'll always do get 4 significant digits? I.e. can we assume that
12.3
won't be given as input, but at least12.30
instead? – Martin Ender – 2017-03-30T20:21:05.073@MartinEnder No – dkudriavtsev – 2017-03-30T20:24:57.073
@MartinEnder All numbers you will be given are 4 significant or less. they can be given in
0.x
,x
,x.y
, but notx.0
or.x
– dkudriavtsev – 2017-03-30T20:26:50.7636
What about accuracy? Presumably you want 4 sf of accuracy too, but then there's the issue of rounding. Floating point questions are hard to get right and very worth sandboxing.
– Peter Taylor – 2017-03-30T20:27:48.5671@MendeleevLemon Don't be so stringent on input format. A language can have different data types, making
x
an integer, andx.0
a decimal/float. A language should be able to use its native representation of a floating point number, if it has one. – mbomb007 – 2017-03-30T20:29:25.6102This is still really underspecified and shouldn't have been re-opened. – AdmBorkBork – 2017-03-30T20:47:05.160
2@MendeleevLemon Can we choose how to round? – Martin Ender – 2017-03-30T21:34:49.950
@MendeleevLemon May the output have leading zeroes? (e.g.
000.3333
or024.424
) – L3viathan – 2017-03-30T21:52:28.850@MartinEnder Please clarify. – dkudriavtsev – 2017-03-30T23:03:45.093
@L3viathan Yes. – dkudriavtsev – 2017-03-30T23:03:53.437
@MendeleevLemon Can we e.g. choose to round 0.12345 as 0.1234? – L3viathan – 2017-03-30T23:19:03.023
Can we have our input padded with extra zeros. E.g. instead of 5 we take 5.00000 as input? – Post Rock Garf Hunter – 2017-03-30T23:53:10.830
@L3viathan Sure, I guess – dkudriavtsev – 2017-03-31T01:39:09.453
@WheatWizard Yeah – dkudriavtsev – 2017-03-31T01:39:18.290
10-1, this is a poor challenge because using a builtin is the ONLY way to do it and know you have satisfied the "specification". If you have a standard floating point implementation, you can use it and tell yourself this is standard floating point, it must be ok. If you have to implement it yourself, there is no specification so you can't sensibly try to golf it. – feersum – 2017-03-31T05:12:31.190
Can we output results below
1
as.123
(i.e. without the leading zero)? – Martin Ender – 2017-03-31T07:04:07.260Can scientific notation be used for output? – Poke – 2017-03-31T13:46:42.387
As a bonus, your title contains a huge part of the solution for dozens of languages. – Eric Duminil – 2017-03-31T21:48:49.537
Can we round the answer? Say for input
11
we output.090909091
– user41805 – 2017-04-01T06:21:33.987@KritixiLithos Sure... – dkudriavtsev – 2017-04-01T07:36:41.487
2Those bounties are not able to be given. You cannot do arbitrary amounts repeatedly. You can do 50, 100, 200, 400 then 500 – Tim – 2017-04-01T09:06:06.023
Can we output with trailing zeroes? For example, outputting
.5000000000
for input2
– user41805 – 2017-04-01T16:42:37.2532@Tim I believe that is only the case for a single user. Separate users can bounty how they see fit. – Post Rock Garf Hunter – 2017-04-01T17:22:13.167
@MartinEnder Yes – dkudriavtsev – 2017-04-01T20:05:52.713
Argh, all the languages on bounty has no division at all! – Matthew Roh – 2017-04-02T04:51:08.727
4@SIGSEGV That's precisely why there are bounties for these languages – user41805 – 2017-04-02T07:30:56.903
@DJMcMayhem Your bounty can now be assigned – dkudriavtsev – 2017-04-08T20:37:30.107
And what has to happen with input 0.0000001? – RosLuP – 2017-04-17T19:54:20.997
@RosLuP 4 significant digits, that input will never occur because it is basically 0 – dkudriavtsev – 2017-04-17T22:08:48.693
I'm assuming that fraction number formats cannot be outputted? – Value Ink – 2017-07-11T20:12:59.433