(x, y)를 취하고 x를 y WITHOUT 루프의 거듭 제곱으로 되 돌리는 함수를 작성하십시오.


14

이것은 정말 깔끔한 짧은 도전입니다.

함수 또는 두 개의 매개 변수, 프로 시저 작성 xy및 결과를 반환 루프를 사용하지 않고, 또는 전원 기능 내장을.xy

우승자는 가장 독창적 인 솔루션이며 3 일 후 가장 많은 투표 수에 따라 선택됩니다.


1
이것은 어떤 종류의 도전입니까?
VisioN

22
어때요 exp(log(x)*y)?
r3mainer

2
정수에 대한 답변 만 허용됩니까? 이들은 첫 번째 답변이므로.
mmumboss

4
지금까지의 대답은 재귀 또는 반복되는 'x'목록을 사용하는 것 같습니다. 나는 다른 방법 (특히 정수가 아닌 y를 허용하는 것)을 생각하려고 내 두뇌를 깨뜨리고있다.
BenM

1
불행히도 루프 금지는 Taylor 확장과 같은 재미있는 수학 솔루션을 배제합니다.
shadowtalker

답변:


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
흠. 이것은 J와 정확히 같은 방법으로 5 자로 쓸 수 있습니다. */@$~
seequ

@Sieg 4에서도 왼쪽에 지수를 허용하면 오른쪽을 기준으로합니다.
ɐɔıʇǝɥʇuʎs

나는 그것이 허용되지 않는다고 생각했기 때문에 플립 부사를 가지고있었습니다.
seequ

Dyalog APL의 @Seeq 4 :×/⍴⍨
Adám

27

C # : 부동 소수점 지수

이 솔루션은 매우 약합니다. 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

열거 형 함수의 사용은 문제에서 금지 된 루핑에 의존하거나 루프가 프레임 워크 메서드 내부에 있기 때문에 괜찮습니까?
Chris

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

음, 생성자는 함수이고 템플릿 매개 변수는 함수 인수와 거의 같습니다 ... 맞습니까? =)
erlc

@PaperBirdMaster 그래 ... 그래서 나는 규칙 굽힘을 인정했다. 꼬리 재귀 이외의 것을 제출하려고 생각했지만 컴파일 타임 꼬리 재귀를 제출했습니다. 그래도 충분히 가까이?
astephens4

@ astephens4 가까이, 나는 그것을 사랑 해요 : 3
PaperBirdMaster

15

파이썬

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

정수가 아닌 제곱에는 작동하지 않습니다.


난이게 좋아.
CodyBugstein

1
왜 사용 하지 않고 구분 기호를 추가 join합니까? eval('*'.join([str(x)] * y)).
Bakuriu

1
이 코드 트롤링입니까?
gerrit

파이썬에는 **연산자가 있으므로 eval () 할 수 있습니다.
Riking

3
@Riking : 그것은 내장되어있을 것입니다.
Hovercouch

10

하스켈-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
나는 당신이 두 번째 함수를 free로 작성하여 문자를 저장할 수 있다고 확신했습니다. 밝혀 졌 듯이 f=(product.).flip replicate정확히 동일한 수의 문자입니다.
Kaya

@mniip 중요하지 않습니다. 이것은 코드 골프가 아닙니다.
nyuszika7h

10

파이썬

경우 y양의 정수이다

def P(x,y):
    return reduce(lambda a,b:a*b,[x]*y)

7

자바 스크립트 (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 컴비 네이터로 솔루션을 작성하지 않았다는 사실에 놀랐습니다.

파이썬 2

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그를
찬성

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);대신 작성하여 몇 바이트를 절약 할 수 있다고 생각합니다
r3mainer

1
그러나 이것은 코드 골프 가 아닙니다 ...
Oberon

1
이것이 게시되었을 때 @oberon의 당첨 기준이 명확하지 않았습니다. 일이 계속되었습니다.
Level River St

@steveverrill 죄송합니다.
Oberon

또한 C #에서 --y는 다른 언어와 마찬가지로 bool과 동일하지 않은 int입니다.
Chris

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
Almo

5

자바 스크립트

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) 그것을 모호하게 만드는 것이었다.


5

매스 매 티카

f[x_, y_] := Root[x, 1/y]

아마도 x ^ (1 / y) = y√x


부정 행위하지 않습니다. 똑똑한.
Michael Stern

훌륭합니다. 내 R 게시물에 대해 생각했으면 좋겠다.
shadowtalker


4

골프 스크립트, 8 자 (I / O 포함)

~])*{*}*

설명:

TLDR : 또 다른 "반복 어레이 제품"솔루션.

예상되는 입력은 두 개의 숫자입니다 (예 :) 2 5. 스택은 하나의 항목 (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

Golfscript는 항상가는 길입니다.
Nit

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, 제곱에 의한 지수화

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 바이트의 골프 버전 (고마워!)

p(a,b){return b<2?b?a:1:p(a*a,b/2)*(b&1?a:1);}

지금까지 다른 모든 재귀 응답보다 빠릅니다.

45 바이트 에서 약간 느린 버전

p(a,b){return b<2?b?a:1:p(a*a,b/2)*p(a,b&1);}

1
For odd b, ~-b/2 == b/2.
ugoren

@ugoren oh sure, you're right
izabera

This is a popular interview question :) "How can you write pow(n, x) better than O(n)?"
Jordan Scales

3

Haskell - 55

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

2

Q

9 chars. Generates array with y instances of x and takes the product.

{prd y#x}

Can explicitly cast to float for larger range given int/long x:

{prd y#9h$x}

1
Matching Golfscript in length is a feat to achieve.
Nit

2

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


2

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).

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

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.


2

Pascal

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!


2

J - 5 or 4 bytes

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


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
** is built-in operator imo.
Silviu Burcea

@SilviuBurcea True, editing.
Oberon

@SilviuBurcea operator =/= function
VisioN

@VisioN true, but the idea was about built-ins. I don't think the OP knows about all these built-in operators ...
Silviu Burcea

1

Javascript

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}

1

Bash

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'*' ) ))

1

C

Yet another recursive exponentiation by squaring answer in C, but they do differ (this uses a shift instead of division, is slightly shorter and recurses one more time than the other):

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

1

Mathematica

This works for integers.

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

Example

f[5,3]

125


How it works

Table makes a list of y x's. Times takes the product of all of them.`


Another way to achieve the same end:

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

Example

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

125


1

Windows Batch

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.


1

perl

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

"a: stuff goto a if something" looks like a loop.
Glenn Randers-Pehrson

Yep, the goto version is a loop, but isn't tail recursion also essentially a loop?
skibrianski

1

Python

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.


Welcome to PPCG! When you do your language header you can leave out the "language=" since by custom everyone puts the language in the header so that's understood. You may indeed have run afoul of the rules here, but we'll let the voters decide. Glad to have a new member at the country club.
Jonathan Van Matre
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.