Viết hàm lấy (x, y) và trả x về sức mạnh của y KHÔNG CÓ Vòng lặp [đã đóng]


14

Đây là một thử thách ngắn thực sự gọn gàng.

Viết một hàm hoặc một thủ tục mà phải mất hai tham số, xyvà trả kết quả của KHÔNG sử dụng các vòng lặp, hoặc xây dựng trong các chức năng điện.xy

Người chiến thắng là giải pháp sáng tạo nhất và sẽ được chọn dựa trên số phiếu bầu cao nhất sau 3 ngày.


1
Đây là loại thách thức gì?
VisioN

22
Thế còn exp(log(x)*y)?
squossish ossifrage

2
Là một câu trả lời cho số nguyên chỉ được chấp nhận? Vì đây là những câu trả lời đầu tiên.
mmumboss

4
Có vẻ như các câu trả lời cho đến nay đều sử dụng đệ quy hoặc danh sách lặp lại 'x'. Tôi đang suy nghĩ về bộ não của mình khi cố gắng nghĩ về một cách khác (đặc biệt là thứ gì đó cho phép y không nguyên).
BenM

1
Thật không may, việc cấm các vòng lặp loại trừ các giải pháp toán học thú vị như mở rộng Taylor.
Shadowtalker

Câu trả lời:


27

APL (7)

{×/⍵/⍺}

Đối số bên trái là cơ sở, đối số bên phải là số mũ, ví dụ:

     5 {×/⍵/⍺} 6
15625

Giải trình:

  • ⍵/⍺nhân rộng thời gian, ví dụ 5 {⍵/⍺} 6->5 5 5 5 5 5
  • ×/lấy sản phẩm, ví dụ ×/5 5 5 5 5 5-> 5×5×5×5×5×5->15625

2
Hừm .. Điều này có thể được viết bằng 5 ký tự trong J, chính xác cùng một phương thức. */@$~
xem

@Sieg 4 chẵn, nếu bạn cho phép số mũ ở bên trái, căn cứ ở bên phải.
ɐɔıʇǝɥʇuʎs

Tôi đã có trạng từ lật vì tôi nghĩ nó không được phép.
Seequ 20/2/2015

@Seeq 4 trong DyL APL :×/⍴⍨
Adám

27

C #: Số mũ điểm nổi

OK, giải pháp này khá dễ vỡ. Bạn có thể dễ dàng phá vỡ nó bằng cách ném những con số khổng lồ như 6 vào nó. Nhưng nó hoạt động rất tốt cho những thứ như DoublePower(1.5, 3.4), và không sử dụng đệ quy!

    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
"Những con số khổng lồ như 6" tôi rất thích điều đó.
DavidC

Chắc chắn việc sử dụng các hàm Vô số đang dựa vào vòng lặp bị cấm trong câu hỏi hoặc nó có ổn không vì vòng lặp nằm trong các phương thức khung?
Chris

16

C ++

Làm thế nào về một số lập trình meta mẫu? Nó bẻ cong những quy tắc nhỏ đã có, nhưng nó đáng để thử:

#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
Nhưng đây không phải là một hàm, là một giá trị thời gian biên dịch, phải không? : O
PaperBirdMaster

Chà, một hàm tạo là một hàm và các tham số mẫu gần giống như các đối số của hàm ... phải không? =)
erlc

@PaperBirdMaster Vâng ... đó là lý do tại sao tôi thừa nhận một số quy tắc uốn cong. Tôi nghĩ rằng tôi sẽ gửi một cái gì đó ngoài đệ quy đuôi, nhưng tôi chỉ gửi đệ quy thời gian biên dịch đuôi, haha. Đủ gần, phải không?
astephens4

@ astephens4 đủ gần, tôi thích nó: 3
PaperBirdMaster

15

Con trăn

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

Không làm việc cho các quyền lực noninteger.


Tôi thích cái này.
CodyBugstein

1
Tại sao bạn thêm một dấu phân cách mà không sử dụng join? eval('*'.join([str(x)] * y)).
Bakuriu

1
Đây có phải là mã trolling?
gerrit

Cũng muốn lưu ý rằng python có **toán tử, vì vậy bạn có thể eval () d đó.
Đi xe đạp

3
@ Đi xe đạp: đó là một inbuilt, mặc dù.
Hovercouch

10

Haskell - 25 ký tự

f _ 0=1
f x y=x*f x (y-1)

Theo phiên bản APL của Marinus:

f x y = product $ take y $ repeat x

Với nhận xét và khoảng trắng của mniip đã bị xóa, 27 ký tự:

f x y=product$replicate y x

sử dụng replicate y xthay vìtake y $ repeat x
mniip

4
Tôi đã bị thuyết phục rằng bạn có thể lưu các ký tự bằng cách viết hàm thứ hai của bạn. Hóa ra f=(product.).flip replicatelà chính xác cùng số lượng ký tự.
Kaya

@mniip Không thành vấn đề, đây không phải là mã golf.
nyuszika7h

10

Con trăn

Nếu ylà số nguyên dương

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

7

JavaScript (ES6), 31

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

Sử dụng:

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

Giải trình:

Hàm trên xây dựng một biểu thức nhân số x ylần sau đó đánh giá nó.


6

Tôi ngạc nhiên khi thấy rằng không ai viết một giải pháp với Bộ kết hợp Y, tuy nhiên ... do đó:

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

Không có vòng lặp, Không có hoạt động véc tơ / danh sách và Không đệ quy (rõ ràng)!

>>> pow((2,0))
1
>>> pow((2,3))
8
>>> pow((3,3))
27

Uh, tôi vừa thấy ngay giải pháp Haskell của KChaloux sử dụng fix, nâng cấp anh ta ...
berdario

5

C #: 45

Chỉ hoạt động cho số nguyên:

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

Hãy đánh bại tôi :-) Tôi nghĩ rằng bạn có thể tiết kiệm một vài byte bằng cách viết return --y?x:x*P(x,y);thay vào đó
squossish ossifrage

1
Nhưng đây không phải là môn đánh gôn ...
Oberon

1
@oberon tiêu chí chiến thắng không rõ ràng khi điều này được đăng. Mọi thứ đã chuyển sang.
Cấp sông St

@steveverrill Xin lỗi.
Oberon

Ngoài ra trong C # --y sẽ là một int không giống như một bool như trong các ngôn ngữ khác.
Chris

5

bash & sed

Không có số, không có vòng lặp, chỉ là một sự lạm dụng toàn cầu nguy hiểm. Tốt nhất là chạy trong một thư mục trống để được an toàn. Kịch bản Shell:

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

"Tốt nhất là chạy trong một thư mục trống để được an toàn." : D
Almo

5

Javascript

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

Sử dụng các biểu thức chính quy để tạo ra một mảng có kích thước y + 1 có phần tử đầu tiên là 1. Sau đó, giảm mảng với phép nhân để tính công suất. Khi y = 0, kết quả là phần tử đầu tiên của mảng, là 1.

Phải thừa nhận rằng, mục tiêu của tôi là i) không sử dụng đệ quy, ii) làm cho nó tối nghĩa.


5

Toán học

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

Có lẽ gian lận để sử dụng thực tế là x ^ (1 / y) = y√x


Không gian lận. Thông minh.
Michael Stern

Điều này thật tuyệt vời. Ước gì tôi nghĩ về nó cho bài viết R của tôi.
Shadowtalker


4

Golfscript, 8 ký tự (bao gồm cả I / O)

~])*{*}*

Giải trình:

TLDR: một giải pháp "sản phẩm của mảng lặp lại" khác.

Đầu vào dự kiến ​​là hai số, ví dụ 2 5. Ngăn xếp bắt đầu với một mục, chuỗi "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 luôn luôn là con đường để đi.
Nit

3

Hồng ngọc

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

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

Sử dụng mẫu:

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

Điều này cuối cùng cũng giống như một số câu trả lời trước: tạo một mảng có độ dài y mỗi phần tử trong đó là x, sau đó lấy sản phẩm. Nó chỉ bị che khuất một cách vô cớ để làm cho nó trông giống như nó đang sử dụng **toán tử bị cấm .


3

C, lũy thừa bằng bình phương

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

phiên bản golf trong 46 byte (cảm ơn ugoren!)

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

nên nhanh hơn tất cả các câu trả lời đệ quy khác cho đến nay oO

phiên bản chậm hơn một chút trong 45 byte

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

1
Đối với lẻ b, ~-b/2 == b/2.
ugoren

@ugoren oh chắc chắn, bạn đã đúng
izabera

Đây là một câu hỏi phỏng vấn phổ biến :) "Làm thế nào bạn có thể viết pow(n, x)tốt hơn 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

Đã có một mục Haskell ngắn hơn, nhưng tôi nghĩ sẽ rất thú vị khi viết một mục tận dụng fixchức năng, như được định nghĩa trong Data.Function. Được sử dụng như sau (trong phần Thay thế để dễ sử dụng):

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 ký tự. Tạo mảng với các ythể hiện xvà lấy sản phẩm.

{prd y#x}

Có thể truyền rõ ràng để nổi cho phạm vi lớn hơn cho int / long x:

{prd y#9h$x}

1
Phù hợp với Golfscript theo chiều dài là một kỳ công để đạt được.
Nit

2

Logic tương tự như nhiều người khác, trong PHP:

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

Chạy với php file.php 5 3để nhận 5 ^ 3


2

Tôi không chắc có bao nhiêu upvote tôi có thể mong đợi cho điều này, nhưng tôi thấy nó hơi kỳ lạ khi tôi thực sự phải viết chính chức năng đó ngày hôm nay. Và tôi khá chắc chắn rằng đây là lần đầu tiên bất kỳ trang web .SE nào nhìn thấy ngôn ngữ này (trang web có vẻ không hữu ích lắm).

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

Làm việc cho số mũ âm và cơ sở hợp lý.

Tôi đã đánh dấu nó bằng cú pháp Java, vì đó là những gì tôi đang làm khi tôi làm việc với ngôn ngữ này. Có vẻ ổn.


2

Pascal

Thử thách không chỉ định loại hoặc phạm vi của x và y, do đó tôi cho rằng hàm Pascal sau tuân theo tất cả các quy tắc đã cho:

{ 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;

Không có vòng lặp, không có hàm tích hợp hoặc hàm lũy thừa, thậm chí không có đệ quy hoặc số học!


2

J - 5 hoặc 4 byte

Chính xác giống như câu trả lời APL của bến du thuyền .

Dành cho x^y:

*/@$~

Dành cho y^x:

*/@$

Ví dụ:

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

x $~ ytạo một danh sách các xlần lặp lại y(giống nhưy $ x

*/ xlà chức năng của sản phẩm, */ 1 2 3->1 * 2 * 3


1

Con trăn

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
** là imo toán tử tích hợp.
Silviu Burcea

@SilviuBurcea Đúng, chỉnh sửa.
Oberon

=/=Chức năng toán tử @SilviuBurcea
VisioN

@VisioN đúng, nhưng ý tưởng là về tích hợp sẵn. Tôi không nghĩ OP biết về tất cả các nhà khai thác tích hợp này ...
Silviu Burcea

1

Javascript

Với đệ quy đuôi, hoạt động nếu ylà một số nguyên dương

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

1

Bash

Mọi người đều biết bashcó thể thực hiện các công cụ giảm bản đồ điên cuồng ;-)

#!/bin/bash

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

Nếu đó là quá trolly cho bạn thì có điều này:

#!/bin/bash

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

1

C

Tuy nhiên, một phép lũy thừa đệ quy khác bằng câu trả lời bình phương trong C, nhưng chúng khác nhau (điều này sử dụng một sự thay đổi thay vì chia, ngắn hơn một chút và đệ quy nhiều lần hơn lần khác):

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

1

Toán học

Điều này làm việc cho số nguyên.

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

Thí dụ

f[5,3]

125


Làm thế nào nó hoạt động

Tabletạo ra một danh sách các y x's. Timeslấy sản phẩm của tất cả chúng.


Một cách khác để đạt được cùng một kết thúc :

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

Thí dụ

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

125


1

Batch Windows

Giống như hầu hết các câu trả lời khác ở đây, nó sử dụng đệ quy.

@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 được lưu trữ trong biến môi trường z.


1

perl

Đây là một mục nhập đệ quy perl. Cách sử dụng là echo $ X, $ Y | foo.pl:

($x,$y) = split/,/, <>;
sub a{$_*=$x;--$y?a():$_}
$_=1;
print a

Hoặc đối với cách tiếp cận kiểu chức năng hơn, làm thế nào về:

($x,$y) = split/,/, <>;
$t=1; map { $t *= $x } (1..$y);
print $t

"A: Stuff goto a if Something" trông giống như một vòng lặp.
Glenn Randers-Pehrson

Đúng, phiên bản goto là một vòng lặp, nhưng không phải đệ quy đuôi cũng thực chất là một vòng lặp?
skibrianski

1

Con trăn

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

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

answer =125

Tôi không chắc chắn nếu điều này là trái với yêu cầu, nhưng nếu không ở đây là nỗ lực của tôi.


Chào mừng đến với PPCG! Khi bạn thực hiện tiêu đề ngôn ngữ của mình, bạn có thể bỏ qua "ngôn ngữ =" vì tùy chỉnh mọi người sẽ đặt ngôn ngữ vào tiêu đề để điều đó được hiểu. Bạn thực sự có thể đã chạy các quy tắc ở đây, nhưng chúng tôi sẽ để cử tri quyết định. Vui mừng khi có một thành viên mới tại câu lạc bộ quốc gia.
Jonathan Van Matre
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.