这是一个非常简洁的挑战。
编写一个带有两个参数的函数或过程,x
并使用循环或内置的幂函数y
返回WITHOUT 的结果。xy
获胜者是最具创造力的解决方案,将在3天后根据最高投票数选出。
exp(log(x)*y)
样
这是一个非常简洁的挑战。
编写一个带有两个参数的函数或过程,x
并使用循环或内置的幂函数y
返回WITHOUT 的结果。xy
获胜者是最具创造力的解决方案,将在3天后根据最高投票数选出。
exp(log(x)*y)
样
Answers:
{×/⍵/⍺}
左参数为基,右参数为指数,例如:
5 {×/⍵/⍺} 6
15625
说明:
⍵/⍺
复制⍺
⍵
时间,例如5 {⍵/⍺} 6
->5 5 5 5 5 5
×/
拿产品,例如×/5 5 5 5 5 5
-> 5×5×5×5×5×5
->15625
*/@$~
×/⍴⍨
好的,此解决方案非常脆弱。您可以通过向其抛出可笑的巨大数字(例如6)来轻松打破它。但是它对于诸如DoublePower(1.5, 3.4)
,并且不使用递归!
static double IntPower(double x, int y)
{
return Enumerable.Repeat(x, y).Aggregate((product, next) => product * next);
}
static double Factorial(int x)
{
return Enumerable.Range(1, x).Aggregate<int, double>(1.0, (factorial, next) => factorial * next);
}
static double Exp(double x)
{
return Enumerable.Range(1, 100).
Aggregate<int, double>(1.0, (sum, next) => sum + IntPower(x, next) / Factorial(next));
}
static double Log(double x)
{
if (x > -1.0 && x < 1.0)
{
return Enumerable.Range(1, 100).
Aggregate<int, double>(0.0, (sum, next) =>
sum + ((next % 2 == 0 ? -1.0 : 1.0) / next * IntPower(x - 1.0, next)));
}
else
{
return Enumerable.Range(1, 100).
Aggregate<int, double>(0.0, (sum, next) =>
sum + 1.0 / next * IntPower((x - 1) / x, next));
}
}
static double DoublePower(double x, double y)
{
return Exp(y * Log(x));
}
模板元编程怎么样?它弯弯曲曲了一些小规则,但是值得一试:
#include <iostream>
template <int pow>
class tmp_pow {
public:
constexpr tmp_pow(float base) :
value(base * tmp_pow<pow-1>(base).value)
{
}
const float value;
};
template <>
class tmp_pow<0> {
public:
constexpr tmp_pow(float base) :
value(1)
{
}
const float value;
};
int main(void)
{
tmp_pow<5> power_thirst(2.0f);
std::cout << power_thirst.value << std::endl;
return 0;
}
def power(x,y):
return eval(((str(x)+"*")*y)[:-1])
对于非整数幂不起作用。
join
?eval('*'.join([str(x)] * y))
。
**
运算符,因此您可以eval()d。
f _ 0=1
f x y=x*f x (y-1)
遵循Marinus的APL版本:
f x y = product $ take y $ repeat x
移除mniip的注释和空格后,共有27个字符:
f x y=product$replicate y x
replicate y x
代替take y $ repeat x
f=(product.).flip replicate
,字符数完全相同。
I'm surprised to see that nobody wrote a solution with the Y Combinator, yet... thus:
Y = lambda f: (lambda x: x(x))(lambda y: f(lambda v: y(y)(v)))
pow = Y(lambda r: lambda (n,c): 1 if not c else n*r((n, c-1)))
No loops, No vector/list operations and No (explicit) recursion!
>>> pow((2,0))
1
>>> pow((2,3))
8
>>> pow((3,3))
27
fix
, upvoting him...
Works for integers only:
int P(int x,int y){return y==1?x:x*P(x,y-1);}
return --y?x:x*P(x,y);
instead
No numbers, no loops, just an embarrasingly dangerous glob abuse. Preferably run in an empty directory to be safe. Shell script:
#!/bin/bash
rm -f xxxxx*
eval touch $(printf xxxxx%$2s | sed "s/ /{1..$1}/g")
ls xxxxx* | wc -l
rm -f xxxxx*
function f(x,y){return ("1"+Array(y+1)).match(/[\,1]/g).reduce(function(l,c){return l*x;});}
Uses regular expressions to create an array of size y+1 whose first element is 1. Then, reduce the array with multiplication to compute power. When y=0, the result is the first element of the array, which is 1.
Admittedly, my goal was i) not use recursion, ii) make it obscure.
f[x_, y_] := Root[x, 1/y]
Probably cheating to use the fact that x^(1/y) = y√x
function f(x,y){return y--?x*f(x,y):1;}
~])*{*}*
Explanation:
TLDR: another "product of repeated array" solution.
The expected input is two numbers, e.g. 2 5
. The stack starts with one item, the string "2 5"
.
Code - Explanation - stack
- "2 5"
~ - pop "2 5" and eval into the integers 2 5 - 2 5
] - put all elements on stack into an array - [2 5]
) - uncons from the right - [2] 5
* - repeat array - [2 2 2 2 2]
{*} - create a block that multiplies two elements - [2 2 2 2 2] {*}
* - fold the array using the block - 32
class Symbol
define_method(:**) {|x| eval x }
end
p(:****[$*[0]].*(:****$*[1]).*('*'))
Sample use:
$ ruby exp.rb 5 3
125
$ ruby exp.rb 0.5 3
0.125
This ultimately is the same as several previous answers: creates a y-length array every element of which is x, then takes the product. It's just gratuitously obfuscated to make it look like it's using the forbidden **
operator.
int power(int a, int b){
if (b==0) return 1;
if (b==1) return a;
if (b%2==0) return power (a*a,b/2);
return a*power(a*a,(b-1)/2);
}
golfed version in 46 bytes (thanks ugoren!)
p(a,b){return b<2?b?a:1:p(a*a,b/2)*(b&1?a:1);}
should be faster than all the other recursive answers so far o.O
slightly slower version in 45 bytes
p(a,b){return b<2?b?a:1:p(a*a,b/2)*p(a,b&1);}
b
, ~-b/2 == b/2
.
pow(n, x)
better than O(n)?"
pow x y=fix(\r a i->if i>=y then a else r(a*x)(i+1))1 0
There's already a shorter Haskell entry, but I thought it would be interesting to write one that takes advantage of the fix
function, as defined in Data.Function
. Used as follows (in the Repl for the sake of ease):
ghci> let pow x y=fix(\r a i->if i>=y then a else r(a*x)(i+1))1 0
ghci> pow 5 3
125
Similar logic as many others, in PHP:
<?=array_product(array_fill(0,$argv[2],$argv[1]));
Run it with php file.php 5 3
to get 5^3
I'm not sure how many upvotes I can expect for this, but I found it somewhat peculiar that I actually had to write that very function today. And I'm pretty sure this is the first time any .SE site sees this language (website doesn't seem very helpful atm).
def Rat pow(Rat x, Int y) =
if y < 0 then
1 / pow(x, -y)
else case y {
0 => 1;
_ => x * pow(x, y-1);
};
Works for negative exponents and rational bases.
I highlighted it in Java syntax, because that's what I'm currently doing when I'm working with this language. Looks alright.
The challenge did not specify the type or range of x and y, therefore I figure the following Pascal function follows all the given rules:
{ data type for a single bit: can only be 0 or 1 }
type
bit = 0..1;
{ calculate the power of two bits, using the convention that 0^0 = 1 }
function bitpower(bit x, bit y): bit;
begin
if y = 0
then bitpower := 1
else bitpower := x
end;
No loop, no built-in power or exponentiation function, not even recursion or arithmetics!
Exactly the same as marinus' APL answer.
For x^y
:
*/@$~
For y^x
:
*/@$
For example:
5 */@$~ 6
15625
6 */@$ 5
15625
x $~ y
creates a list of x
repeated y
times (same as y $ x
*/ x
is the product function, */ 1 2 3
-> 1 * 2 * 3
from math import sqrt
def pow(x, y):
if y == 0:
return 1
elif y >= 1:
return x * pow(x, y - 1)
elif y > 0:
y *= 2
if y >= 1:
return sqrt(x) * sqrt(pow(x, y % 1))
else:
return sqrt(pow(x, y % 1))
else:
return 1.0 / pow(x, -y)
=/=
function
With tail recursion, works if y
is a positive integer
function P(x,y,z){z=z||1;return y?P(x,y-1,x*z):z}
Everyone knows bash
can do whizzy map-reduce type stuff ;-)
#!/bin/bash
x=$1
reduce () {
((a*=$x))
}
a=1
mapfile -n$2 -c1 -Creduce < <(yes)
echo $a
If thats too trolly for you then there's this:
#!/bin/bash
echo $(( $( yes $1 | head -n$2 | paste -s -d'*' ) ))
Like most of the other answers here, it uses recursion.
@echo off
set y=%2
:p
if %y%==1 (
set z=%1
goto :eof
) else (
set/a"y-=1"
call :p %1
set/a"z*=%1"
goto :eof
)
x^y is stored in the environment variable z
.
Here's a tail recursive perl entry. Usage is echo $X,$Y | foo.pl:
($x,$y) = split/,/, <>;
sub a{$_*=$x;--$y?a():$_}
$_=1;
print a
Or for a more functional-type approach, how about:
($x,$y) = split/,/, <>;
$t=1; map { $t *= $x } (1..$y);
print $t
def getRootOfY(x,y):
return x**y
def printAnswer():
print "answer is ",getRootOfY(5,3)
printAnswer()
answer =125
I am not sure if this is against the requirements, but if not here is my attempt.