เขียนฟังก์ชั่นที่ใช้ (x, y) และคืนค่า x เป็นพลังของ y โดยไม่มีลูป [ปิด]


14

นี่เป็นความท้าทายที่สั้นมาก ๆ

เขียนฟังก์ชั่นหรือขั้นตอนที่ใช้สองพารามิเตอร์xและyและส่งกลับผลลัพธ์ของโดยไม่ต้องใช้ลูปหรือฟังก์ชั่นพลังงานในตัวxy

ผู้ชนะคือทางออกที่สร้างสรรค์ที่สุดและจะถูกเลือกตามจำนวนโหวตสูงสุดหลังจาก 3 วัน


1
นี่คือความท้าทายอะไร
VisioN

22
แล้วไงexp(log(x)*y)ล่ะ
r3mainer

2
คำตอบสำหรับจำนวนเต็มเป็นที่ยอมรับเท่านั้นหรือไม่ เนื่องจากสิ่งเหล่านี้เป็นคำตอบแรก
mmumboss

4
ดูเหมือนว่าคำตอบจะใช้การเรียกซ้ำหรือรายการ 'x's ซ้ำ ฉันกำลังสมองของฉันพยายามคิดวิธีอื่น (โดยเฉพาะอย่างยิ่งสิ่งที่อนุญาตให้ไม่ใช่จำนวนเต็ม y)
BenM

1
น่าเสียดายที่ข้อห้ามในการวนลูปออกกฎการแก้ปัญหาทางคณิตศาสตร์ที่สนุกสนานเช่นการขยายตัวของเทย์เลอร์
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
หืมม. นี่สามารถเขียนเป็น 5 ตัวอักษรใน J, วิธีการเดียวกันทั้งหมด */@$~
seequ

@ รูปที่ 4 แม้ถ้าคุณอนุญาตให้มีเลขชี้กำลังอยู่ทางซ้ายให้จับทางด้านขวา
Febıʇǝɥʇuʎs

ฉันมีคำวิเศษณ์พลิกเพราะฉันคิดว่ามันไม่ได้รับอนุญาต
seequ

@Seeq 4 ในDyalog APL :×/⍴⍨
2559

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

แน่นอนว่าการใช้ฟังก์ชั่น Enumerable นั้นขึ้นอยู่กับการวนลูปที่ถูกห้ามในคำถามหรือมันก็โอเคเพราะลูปนั้นอยู่ในเมธอดเฟรมเวิร์ก?
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 () d นั้นได้
Riking

3
@Riking: นั่นจะเป็น inbuilt แม้ว่า
Hovercouch

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
ฉันเชื่อว่าคุณสามารถบันทึกตัวละครโดยการเขียนฟังก์ชั่นที่สองของคุณไร้จุด ตามที่ปรากฎf=(product.).flip replicateเป็นจำนวนตัวอักษรที่แน่นอน
Kaya

@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

เอ่อฉันเพิ่งเห็นตอนนี้โซลูชัน Haskell ของ KChaloux ที่ใช้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
แต่นี่ไม่ใช่code-golf ...
Oberon

1
เกณฑ์การชนะของ @oberon ไม่ชัดเจนเมื่อโพสต์สิ่งนี้ สิ่งที่ได้ย้ายไป
เลเวลริเวอร์เซนต์

@steveverrill ขออภัย
Oberon

นอกจากนี้ใน C # - y จะเป็น int ซึ่งไม่เหมือนกับบูลเหมือนในภาษาอื่น
Chris

5

ทุบตี & 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;});}

ใช้นิพจน์ทั่วไปเพื่อสร้างอาร์เรย์ขนาด y + 1 ซึ่งองค์ประกอบแรกคือ 1 จากนั้นลดอาร์เรย์ด้วยการคูณเพื่อคำนวณพลังงาน เมื่อ y = 0 ผลลัพธ์จะเป็นองค์ประกอบแรกของอาร์เรย์ซึ่งก็คือ 1

เป็นที่ยอมรับเป้าหมายของฉันคือ i) ไม่ใช้การเรียกซ้ำ 2) ทำให้มันไม่ชัดเจน


5

มาติกา

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

การโกงอาจใช้ข้อเท็จจริงที่ว่า x ^ (1 / y) = y√x


ไม่โกง ฉลาด.
Michael Stern

อันนี้ยอดเยี่ยม หวังว่าฉันจะคิดว่ามันสำหรับโพสต์ R ของฉัน
shadowtalker


4

Golfscript, 8 ตัวอักษร (รวมถึง I / O)

~])*{*}*

คำอธิบาย:

TLDR: โซลูชัน "ผลิตภัณฑ์ของอาร์เรย์ซ้ำ" อีกรายการหนึ่ง

2 5การป้อนข้อมูลที่คาดว่าเป็นตัวเลขสองเช่น "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 เป็นวิธีที่จะไปเสมอ
นิตย์

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

ในที่สุดนี้ก็เหมือนกับคำตอบก่อนหน้าหลายประการ: สร้างอาร์เรย์ความยาว y ทุกองค์ประกอบที่เป็น x จากนั้นนำผลิตภัณฑ์ มันทำให้งงงวยที่จะทำให้มันดูเหมือนว่ามันกำลังใช้ตัว**ดำเนินการต้องห้าม


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

รุ่นgolfed ใน46 ไบต์ (ขอบคุณ ugoren!)

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

ควรเร็วกว่าคำตอบแบบเรียกซ้ำอื่น ๆ ทั้งหมด oO

รุ่นที่ช้ากว่าเล็กน้อยใน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
ugoren

@ugoren โอ้แน่นอนคุณพูดถูก
izabera

นี่เป็นคำถามสัมภาษณ์ยอดนิยม :) "คุณเขียนได้pow(n, x)ดีกว่า 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

แล้วมีรายการ 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:

{prd y#9h$x}

1
การจับคู่ Golfscript ในความยาวนั้นถือเป็นความสำเร็จ
นิตย์

2

ตรรกะที่คล้ายกันเป็นจำนวนมากใน PHP:

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

รันด้วยphp file.php 5 3เพื่อรับ 5 ^ 3


2

ผมไม่แน่ใจว่าวิธีการหลาย upvotes ฉันสามารถคาดหวังนี้ แต่ผมพบว่ามันค่อนข้างแปลกที่ฉันจริงมีการเขียนฟังก์ชั่นที่มากในวันนี้ และฉันค่อนข้างแน่ใจว่านี่เป็นครั้งแรกที่ไซต์. SE เห็นภาษานี้ (เว็บไซต์ดูเหมือนจะไม่เป็นประโยชน์สำหรับ 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);
    };

ทำงานสำหรับเลขชี้กำลังเชิงลบและฐานเหตุผล

ฉันเน้นในรูปแบบ 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 ไบต์

เหมือนกับคำตอบ APL marinus'

สำหรับx^y:

*/@$~

สำหรับy^x:

*/@$

ตัวอย่างเช่น:

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

x $~ yสร้างรายการเวลาxซ้ำy(เช่นเดียวกับy $ x

*/ xเป็นฟังก์ชั่นผลิตภัณฑ์*/ 1 2 3->1 * 2 * 3


1

หลาม

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 ในตัว
Silviu Burcea

@SilviuBurcea True แก้ไข
Oberon

@SilviuBurcea ประกอบ=/=ฟังก์ชั่น
วิสัยทัศน์

@VisioN จริง แต่ความคิดเกี่ยวกับตัวใน ฉันไม่คิดว่า OP รู้เกี่ยวกับสิ่งเหล่านี้ในตัวผู้ประกอบการ ...
Silviu Burcea


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.