これは本当にすてきな短い挑戦です。
関数又は2つのパラメータを取り、手順書き込みx
とy
の結果を返すループを使用せずに、または電力機能に内蔵されています。xy
勝者は最も創造的なソリューションであり、3日後の最高票数に基づいて選択されます。
exp(log(x)*y)
?
これは本当にすてきな短い挑戦です。
関数又は2つのパラメータを取り、手順書き込みx
とy
の結果を返すループを使用せずに、または電力機能に内蔵されています。xy
勝者は最も創造的なソリューションであり、3日後の最高票数に基づいて選択されます。
exp(log(x)*y)
?
回答:
{×/⍵/⍺}
左の引数は底、右の引数は指数です。例:
5 {×/⍵/⍺} 6
15625
説明:
⍵/⍺
⍺
⍵
時間を複製します、例えば5 {⍵/⍺} 6
->5 5 5 5 5 5
×/
製品を取得します。例×/5 5 5 5 5 5
-> 5×5×5×5×5×5
->15625
*/@$~
×/⍴⍨
OK、このソリューションは非常に脆弱です。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;
}
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
、正確に文字の数が同じです。
Y Combinatorで解決策を書いた人が誰もいなかったことに驚きました。
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)))
ループなし、ベクター/リスト操作なし、(明示的な)再帰なし!
>>> pow((2,0))
1
>>> pow((2,3))
8
>>> pow((3,3))
27
fix
、彼をupvoting ...
整数のみで動作します:
int P(int x,int y){return y==1?x:x*P(x,y-1);}
return --y?x:x*P(x,y);
の代わりに
f[x_, y_] := Root[x, 1/y]
おそらくx ^(1 / y)=y√xという事実を使用するために不正行為を行う
function f(x,y){return y--?x*f(x,y):1;}
~])*{*}*
説明:
TLDR:別の「繰り返し配列の製品」ソリューション。
予想される入力は、2つの数値2 5
です。スタックは1つのアイテム、文字列で始まります"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
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);
}
46バイトのゴルフバージョン(ugorenに感謝!)
p(a,b){return b<2?b?a:1:p(a*a,b/2)*(b&1?a:1);}
これまでの他のすべての再帰的回答よりも高速でなければなりませんo
45バイトのわずかに遅いバージョン
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)
O(N)よりも良いです?」
他の多くのPHPと同様のロジック:
<?=array_product(array_fill(0,$argv[2],$argv[1]));
で実行してphp file.php 5 3
5 ^ 3を取得します
これにどれだけの賛成票を投じることができるかはわかりませんが、今日その機能を実際に記述しなければならなかったというのはやや奇妙です。そして.SEサイトがこの言語を見るのはこれが初めてだと確信しています(Webサイトはあまり役に立ちません)。
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);
};
負の指数および有理数の基底に対して機能します。
Java構文で強調表示したのは、この言語で作業しているときにそれが現在行っていることだからです。よさそうだ。
チャレンジでは、xとyのタイプまたは範囲が指定されていなかったため、次のPascal関数はすべての所定の規則に従うと考えられます。
{ 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;
ループ、組み込みの累乗または累乗関数、再帰や算術すらありません!
marinusのAPL answerとまったく同じです。
のためにx^y
:
*/@$~
のためにy^x
:
*/@$
例えば:
5 */@$~ 6
15625
6 */@$ 5
15625
x $~ y
x
繰り返しy
回数のリストを作成します(と同じy $ x
*/ x
製品の関数です*/ 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)
=/=
機能
これが末尾再帰perlエントリです。使用法はecho $ X、$ Y |です foo.pl:
($x,$y) = split/,/, <>;
sub a{$_*=$x;--$y?a():$_}
$_=1;
print a
または、より機能的なタイプのアプローチの場合は、次の方法について:
($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
これが要件に反するかどうかはわかりませんが、そうでない場合は私の試みです。