(x、y)を取り、xのy乗を返す関数を書くWITHOUT Loops [closed]


14

これは本当にすてきな短い挑戦です。

関数又は2つのパラメータを取り、手順書き込みxyの結果を返すループを使用せずに、または電力機能に内蔵されています。xy

勝者は最も創造的なソリューションであり、3日後の最高票数に基づいて選択されます。


1
これはどんな課題ですか?
VisioN 14年

22
どうexp(log(x)*y)
squeamish ossifrage 14年

2
整数の答えは受け入れられますか?これらが最初の返信であるため。
mmumboss 14年

4
これまでの答えのように、再帰または繰り返し「x」のリストを使用しています。私は別の方法(特に整数以外のyを許可するもの)を考えようとして頭を悩ませています。
BenM 14年

1
残念なことに、ループの禁止は、テイラー展開のような楽しい数学的な解決策を排除しています。
シャドウトーカー14

回答:


27

APL(7)

{×/⍵/⍺}

左の引数は底、右の引数は指数です。例:

     5 {×/⍵/⍺} 6
15625

説明:

  • ⍵/⍺ 時間を複製します、例えば5 {⍵/⍺} 6->5 5 5 5 5 5
  • ×/製品を取得します。例×/5 5 5 5 5 5-> 5×5×5×5×5×5->15625

2
Hm ..これは、Jで5文字で書くことができ、まったく同じ方法です。*/@$~
seequ 14

@Sieg 4でも、左側に指数、右側に基数を許可する場合。
ɐɔıʇǝɥʇuʎs

私はそれが許可されていないと思ったので、私はフリップ副詞を持っていました。
seequ

Dyalog APLの @Seeq 4 :×/⍴⍨
アダム

27

C#:浮動小数点指数

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));
    } 

43
「6のような途方もなく大きな数字」それを楽しんだ。
DavidC 14年

Enumerable関数の使用は、質問で禁止されているループに依存しているのでしょうか、それともループがフレームワークメソッド内にあるので大丈夫ですか?
クリス14年

16

C ++

テンプレートメタプログラミングはどうですか?それは小さな規則があったものを曲げますが、一撃の価値があります:

#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;
}

1
しかし、これは関数ではなく、コンパイル時の値ではありませんか?:O
PaperBirdMaster 14年

まあ、コンストラクターは関数であり、テンプレートパラメーターはほとんど関数の引数に似ています...そうですか?=)
erlc 14年

@PaperBirdMasterええ...だからこそ、いくつかのルールを曲げることを認めました。末尾再帰以外の何かを送信するつもりだったのですが、コンパイル時の末尾再帰を送信しただけです(笑)。でも十分に近いでしょう?
astephens4 14年

@ astephens4十分に近い、私はそれが大好きです:3
PaperBirdMaster 14年

15

Python

def power(x,y):
    return eval(((str(x)+"*")*y)[:-1])

非整数の力に対しては機能しません。


私はこれが好きです。
CodyBugstein

1
使用せずにセパレータを追加するのはなぜjoinですか?eval('*'.join([str(x)] * y))
バクリウ14年

1
これはコードトローリングでしたか?
ヘリット・

pythonには**演算子があるため、それをeval()dすることもできます。
ライキング

3
@Riking:しかし、それは作り付けになります。
ホバーカウチ14年

10

Haskell-25文字

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
mniip

4
2番目の関数をポイントフリーで記述することで、文字を保存できると確信しました。結局のところf=(product.).flip replicate、正確に文字の数が同じです。
カヤ14年

@mniip問題ではありません。これはコードゴルフではありません。
nyuszika7h


7

JavaScript(ES6)、31

// Testable in Firefox 28
f=(x,y)=>eval('x*'.repeat(y)+1)

使用法:

> f(2, 0)
1
> f(2, 16)
65536

説明:

上記の関数は、x y時間を掛けて評価する式を作成します。


6

Y Combinatorで解決策を書いた人が誰もいなかったことに驚きました。

Python2

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

ええと、私はちょうど今、その用途KChalouxのHaskellのソリューションを見てきましたfix、彼をupvoting ...
berdario

5

C#:45

整数のみで動作します:

int P(int x,int y){return y==1?x:x*P(x,y-1);}

それを私にビート:-)私は、あなたが書き込むことによって、いくつかのバイトを救うことができると思うreturn --y?x:x*P(x,y);の代わりに
うるさいossifrage

1
しかし、これではありません、コードゴルフ ...
オベロン

1
@oberonの受賞基準は、掲載された時点では明確ではありませんでした。物事は進んでいます。
レベルリバーセント14年

@steveverrillごめんなさい。
オベロン14年

また、C#では--yはintであり、他の言語のようなboolとは異なります。
クリス14年

5

bash&sed

数字もループもありません。恥ずかしいほど危険なグロブ乱用です。安全のために空のディレクトリで実行することをお勧めします。シェルスクリプト:

#!/bin/bash
rm -f xxxxx*
eval touch $(printf xxxxx%$2s | sed "s/ /{1..$1}/g")
ls xxxxx* | wc -l
rm -f xxxxx*

「安全のために空のディレクトリで実行することをお勧めします。」:D
アルモ14年

5

Javascript

function f(x,y){return ("1"+Array(y+1)).match(/[\,1]/g).reduce(function(l,c){return l*x;});}

正規表現を使用して、最初の要素が1であるサイズy + 1の配列を作成します。次に、乗算で配列を縮小し、電力を計算します。y = 0の場合、結果は配列の最初の要素、つまり1です。

確かに、私の目標はi)再帰を使用しないこと、ii)再帰を曖昧にすることでした。




4

Golfscript、8文字(I / Oを含む)

~])*{*}*

説明:

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

Golfscriptが常に道です。
Nit 14年

3

ルビー

class Symbol
  define_method(:**) {|x| eval x }
end

p(:****[$*[0]].*(:****$*[1]).*('*'))

使用例:

$ ruby exp.rb 5 3
125
$ ruby exp.rb 0.5 3
0.125

これは、最終的には以前のいくつかの回答と同じです。すべての要素がxであるy長の配列を作成し、製品を取得します。禁じられた**演算子を使用しているように見えるようにするために、不便に難読化されています。


3

C、2乗によるべき乗

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);}

1
奇妙なことb~-b/2 == b/2
ウゴレン14年

ああ@ugoren必ず、あなたがしている権利
izabera

これは、人気の面接の質問:)で「どのように書くことができますpow(n, x)O(N)よりも良いです?」
ジョーダンスケール14年

3

ハスケル-55

pow x y=fix(\r a i->if i>=y then a else r(a*x)(i+1))1 0

短いHaskellエントリはすでにありfixますが、で定義されてData.Functionいるように、関数を利用するエントリを作成することは興味深いと思いました。次のように使用します(簡単にするためにReplで)。

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

2

Q

9文字。のyインスタンスを持つ配列を生成しx、製品を取得します。

{prd y#x}

int / long xを指定すると、明示的に大きな範囲のfloatにキャストできます。

{prd y#9h$x}

1
長さでGolfscriptを一致させることは達成する偉業です。
Nit 14年

2

他の多くのPHPと同様のロジック:

<?=array_product(array_fill(0,$argv[2],$argv[1]));

で実行してphp file.php 5 35 ^ 3を取得します


2

これにどれだけの賛成票を投じることができるかはわかりませんが、今日その機能を実際に記述しなければならなかったというのはやや奇妙です。そして.SEサイトがこの言語を見るのはこれが初めてだと確信しいます(Webサイトはあまり役に立ちません)。

ABS

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構文で強調表示したのは、この言語で作業しているときにそれが現在行っていることだからです。よさそうだ。


2

パスカル

チャレンジでは、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;

ループ、組み込みの累乗または累乗関数、再帰や算術すらありません!


2

J-5または4バイト

marinusのAPL answerとまったく同じです。

のためにx^y

*/@$~

のためにy^x

*/@$

例えば:

   5 */@$~ 6
15625
   6 */@$ 5
15625

x $~ yx繰り返しy回数のリストを作成します(と同じy $ x

*/ x製品の関数です*/ 1 2 3->1 * 2 * 3


1

Python

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)

1
**は組み込み演算子imoです。
シルビウブルシア14年

@SilviuBurcea本当、編集。
オベロン14年

@SilviuBurcea演算子=/=機能
ビジョン

@VisioNは真ですが、アイデアは組み込みに関するものでした。私はOPはすべてを知っているとは思わないこれらの組み込み演算子...
Silviu Burcea


1

バッシュ

bashもが奇抜なマップリデュースタイプの作業を行えることを知っています;-)

#!/bin/bash

x=$1
reduce () {
    ((a*=$x))
}
a=1
mapfile -n$2 -c1 -Creduce < <(yes)
echo $a

それがあなたにとってあまりにもトロリーなら、これがあります:

#!/bin/bash

echo $(( $( yes $1 | head -n$2 | paste -s -d'*' ) ))

1

C

Cの2乗解答によるさらに別の再帰的累乗ですが、それらは異なります(これは除算の代わりにシフトを使用し、わずかに短く、もう1回再帰します)。

e(x,y){return y?(y&1?x:1)*e(x*x,y>>1):1;}

1

Mathematica

これは整数に対して機能します。

f[x_, y_] := Times@@Table[x, {y}]

f[5,3]

125


使い方

Tableのリストを作成しますy xTimesそれらすべての積を取ります。


同じ目的を達成する別の方法

#~Product~{i,1,#2}&

#~Product~{i, 1, #2} & @@ {5, 3}

125


1

Windowsバッチ

ここでの他のほとんどの回答と同様に、再帰を使用します。

@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は環境変数に保存されますz


1

perl

これが末尾再帰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

「a:何かがif if goto」はループのように見えます。
グレンランダース-パーソン14年

はい、gotoバージョンはループですが、末尾再帰も本質的にループではありませんか?
skibrianski 14年

1

Python

def getRootOfY(x,y):
   return x**y 

def printAnswer():
   print "answer is ",getRootOfY(5,3)
printAnswer()

answer =125

これが要件に反するかどうかはわかりませんが、そうでない場合は私の試みです。


PPCGへようこそ!言語ヘッダーを作成するときは、「language =」を省くことができます。カスタムで誰もが理解できるようにヘッダーに言語を配置するからです。あなたは確かにここで規則に違反しているかもしれませんが、私たちは有権者に決定させます。カントリークラブに新しいメンバーができてうれしいです。
ジョナサンヴァンマトレ14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.