0
\$\begingroup\$

Your function must accept three numbers in any order:

  • A signed real number (or ±Infinity) - The number (N) for which you have to generate a number from the range
  • A signed integer - Minimum of the range
  • A signed integer - Maximum of the range

Input:

  • The minimum of the range will always be less than the maximum of the range, so don't worry about it
  • N can be any real (if it is possible Infinity and -Infinity also can be passed)

Requirements:

  • Your function must output same result each time for same inputs
  • Your function must output different result each time for different N (except when it's due to a floating point error)
  • The output must be in the given range
  • The outputs of your function for all numbers N must cover the entire range (except when missing outputs are due to floating point error)

Please specify:

  • The order of the input
  • Is it possible to pass ±Infinity as a N?
  • Are the minimum and maximum of the range inclusive or exclusive?

Unable to provide test cases because there are many ways to solve this problem, so please provide your test cases.

The shortest code in each programming language wins!

\$\endgroup\$
28
  • 4
    \$\begingroup\$ This question just seems to be "find a mapping between a value from (-inf, inf) to (a,b)? \$\endgroup\$ Mar 6 at 15:59
  • 2
    \$\begingroup\$ You also said distribution was linear even though you can't linearly map to infinity \$\endgroup\$
    – mousetail
    Mar 6 at 16:31
  • 1
    \$\begingroup\$ Do -0 and +0 have to return different results? \$\endgroup\$ Mar 7 at 6:58
  • 2
    \$\begingroup\$ Do answers get to decide if ±Infinity are valid inputs, or is it dependent on whether the language allows them? \$\endgroup\$ Mar 7 at 7:08
  • 2
    \$\begingroup\$ You could simply add: “The outputs of your function for all numbers N must cover the entire range (except when missing outputs are due to floating point error).” \$\endgroup\$ Mar 9 at 20:17

6 Answers 6

6
\$\begingroup\$

Python, 29 bytes

lambda a,b,c:a+(b-a)/(1+2**c)

Attempt This Online!

Does not include the upper bound.

Uses the mapping $$f(c) = \frac{a-b}{1+2^c}+a$$

An interactive graph of what this looks like:

graph of the above function

\$\endgroup\$
0
4
\$\begingroup\$

Wolfram Language (Mathematica), 33 bytes

N@Rescale[#1,{-∞,∞},{#2,#3}]&

Try it online!

Mathematica easily operates with infinities both signs, so here it is. For input infinite values you can use \[Infinity] or with sign.

\$\endgroup\$
3
\$\begingroup\$

R, 31 bytes

\(w,a,b)(.5+atan(w)/pi)*(b-a)+a

Attempt This Online! or Try it at rdrr.io with graphical output

\$\endgroup\$
3
\$\begingroup\$

Thunno, \$ 10 \log_{256}(96) \approx \$ 8.21 bytes

-s2@1+/A$+

Port of 97.100.97.109's Python answer

Attempt This Online!

-s2@1+/A$+ # stack is min, max, wind
-          # subtract
 s         # swap, wind is on top
  2@       # 2 ^ wind
    1+     # add one
      /    # divide (max-min) by (1 + 2^wind)
       A$+ # add the first input

Thunno, \$ 6 \log_{256}(96) \approx \$ 4.93 bytes

-DZs*$

Attempt This Online!

This uses the formula ((b - a) * c) % (b - a), where a is the minimum of the range, b is the maximum of the range, and c is the wind. I noticed after posting this that the formula doesn't really work though.

-DZs*$ # stack is min, max, wind
-      # subtract
 D     # duplicate
  Zs   # swap bottom two
    *  # multiply
     $ # swapped modulus
\$\endgroup\$
6
  • \$\begingroup\$ It's not going to be different for any values if a = 0, b = 1, e.g. \$\endgroup\$ Mar 6 at 15:55
  • \$\begingroup\$ @97.100.97.109 Thanks, not sure what I can change this to \$\endgroup\$
    – noodle man
    Mar 6 at 15:58
  • \$\begingroup\$ You could, e.g. use a logistic function which is scaled to range between the given values? \$\endgroup\$ Mar 6 at 15:58
  • \$\begingroup\$ Value -100 produce output out of range. This general problem, it's not possible to do rescale without information about min and max of input \$\endgroup\$
    – lesobrod
    Mar 6 at 16:07
  • \$\begingroup\$ @lesobrod I'm working on a new way that will work better \$\endgroup\$
    – noodle man
    Mar 6 at 16:10
2
\$\begingroup\$

Pyt, 14 bytes

Ť←←Đ3Ș⇹-⇹↔⁺₂*+

Try it online!

Takes inputs as c b a (each on their own line)

Uses tanh as the mapping function

Ť                       implicit input (c); Ťanh(c)
 ←←                     get input twice (b, then a)
   Đ                    Đuplicate a
    3Ș                  Șwap top three items of stack
      ⇹                 swap top two on stack
       -                subtract (b-a)
        ⇹               swap top two on stack
         ↔              flip the stack
          ⁺             increment [tanh(c)+1]
           ₂            halve [(tanh(c)+1)/2]
            *           multiply [(b-a)*(tanh(c)+1)/2]
             +          add [a+(b-a)*(tanh(c)+1)/2]; implicit print
\$\endgroup\$
1
\$\begingroup\$

Charcoal, 13 bytes

NθI⁺θ∕⁻Nθ⊕X²N

Try it online! Link is to verbose version of code. Explanation: Another port of @adam's Python answer.

Nθ              First input as a number
       N        Second input as a number
      ⁻         Minus
        θ       First input
     ∕          Divided by
           ²    Literal integer `2`
          X     Raised to power
            N   Third input as a number
         ⊕      Incremented
   ⁺            Plus
    θ           First input
  I             Cast to string
                Implicitly print

Originally this was meant to be based on @KiptheMalamute's answer, so I started with:

$$ f(c) = a + \frac {2(b - a)} {1 + \tanh c} $$

Charcoal doesn't have hyperbolic (or indeed trigonometric) functions, so I rewrote this in terms of the exponential function:

$$ f(c) = a + \frac {b - a} {1 + e ^ {-2 c}} $$

But there's no particular reason to use \$ e^{-2} \$; any base will do, such as \$ 2 \$, which is much golfier:

$$ f(c) = a + \frac {b - a} {1 + 2 ^ c} $$

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.