Tulis fungsi yang mengambil (x, y) dan mengembalikan x ke kekuatan y TANPA Loops [ditutup]


14

Ini adalah tantangan singkat yang sangat rapi.

Tulis fungsi atau prosedur yang mengambil dua parameter, xdan ydan mengembalikan hasil TANPA menggunakan loop, atau fungsi daya bawaan.xy

Pemenangnya adalah solusi paling kreatif, dan akan dipilih berdasarkan jumlah suara tertinggi setelah 3 hari.


1
Tantangan macam apa ini?
VisioN

22
Bagaimana dengan exp(log(x)*y)?
r3mainer

2
Apakah jawaban untuk bilangan bulat hanya dapat diterima? Karena ini adalah balasan pertama.
mmumboss

4
Sepertinya jawabannya sejauh ini baik menggunakan rekursi atau daftar 'x's yang berulang. Saya mencoba otak saya mencoba memikirkan cara lain (terutama sesuatu yang memungkinkan y-integer).
BenM

1
Sayangnya larangan loop mengesampingkan solusi matematika yang menyenangkan seperti ekspansi Taylor.
shadowtalker

Jawaban:


27

APL (7)

{×/⍵/⍺}

Argumen kiri adalah basis, argumen kanan adalah eksponen, misalnya:

     5 {×/⍵/⍺} 6
15625

Penjelasan:

  • ⍵/⍺ulangan kali, misalnya 5 {⍵/⍺} 6->5 5 5 5 5 5
  • ×/mengambil produk, misalnya ×/5 5 5 5 5 5-> 5×5×5×5×5×5->15625

2
Hm .. Ini bisa ditulis dalam 5 karakter dalam J, metode yang persis sama. */@$~
seequ

@Sieg 4 bahkan, jika Anda mengizinkan eksponen di sebelah kiri, pangkalan di sebelah kanan.
Febıʇǝɥʇu

Saya memiliki kata keterangan flip karena saya pikir itu tidak diizinkan.
seequ

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

27

C #: Eksponen titik mengambang

OK, solusi ini cukup rapuh. Anda dapat dengan mudah memecahkannya dengan melemparkan angka yang sangat besar seperti 6 di dalamnya. Tapi itu bekerja dengan baik untuk hal-hal seperti DoublePower(1.5, 3.4), dan tidak menggunakan rekursi!

    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
"Jumlah yang sangat besar seperti 6" Aku menikmatinya.
DavidC

Tentunya penggunaan fungsi Enumerable mengandalkan looping yang dilarang dalam pertanyaan atau apakah itu ok karena loop berada di dalam metode framework?
Chris

16

C ++

Bagaimana dengan beberapa pemrograman meta template? Itu membengkokkan sedikit aturan yang ada, tetapi patut dicoba:

#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
tapi ini bukan fungsi, apakah nilai waktu kompilasi, bukan? : O
PaperBirdMaster

Nah, konstruktor adalah fungsi, dan parameter template hampir seperti argumen fungsi ... kan? =)
erlc

@PaperBirdMaster Ya ... itu sebabnya saya mengakui beberapa aturan lentur. Saya pikir saya akan menyerahkan sesuatu selain rekursi ekor, tetapi saya hanya menyerahkan waktu rekursi ekor, haha. Cukup dekat, kan?
astephens4

@ astephens4 cukup dekat, saya suka: 3
PaperBirdMaster

15

Python

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

Tidak bekerja untuk kekuatan noninteger.


Saya suka yang ini.
CodyBugstein

1
Mengapa Anda menambahkan pemisah tanpa menggunakan join? eval('*'.join([str(x)] * y)).
Bakuriu

1
Apakah ini kode-trolling?
gerrit

Ingin juga mencatat bahwa python memiliki **operator, jadi Anda bisa eval () d itu.
Riking

3
@Riking: itu akan menjadi inbuilt.
Hovercouch

10

Haskell - 25 karakter

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

Mengikuti versi APL Marinus:

f x y = product $ take y $ repeat x

Dengan dihapusnya komentar dan ruang kosong mniip, 27 karakter:

f x y=product$replicate y x

gunakan replicate y xsebagai gantitake y $ repeat x
mniip

4
Saya yakin Anda dapat menyimpan karakter dengan menulis pointfree fungsi kedua Anda. Ternyata f=(product.).flip replicatejumlah chars persis sama.
Kaya

@ mniip Tidak masalah, ini bukan kode golf.
nyuszika7h

10

Python

Jika ybilangan bulat positif

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)

Pemakaian:

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

Penjelasan:

Fungsi di atas membangun ekspresi yang berlipat x ykali kemudian mengevaluasinya.


6

Saya terkejut melihat bahwa tidak ada yang menulis solusi dengan Y Combinator, namun ... dengan demikian:

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

Tanpa loop, Tanpa operasi vektor / daftar dan Tidak ada rekursi (eksplisit)!

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

Eh, saya baru saja melihat sekarang solusi Haskell KChaloux yang menggunakan fix, mendukungnya ...
berdario

5

C #: 45

Hanya berfungsi untuk bilangan bulat:

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

Kalahkan saya :-) Saya pikir Anda bisa menghemat beberapa byte dengan menulis return --y?x:x*P(x,y);sebagai gantinya
r3mainer

1
Tapi ini bukan kode-golf ...
Oberon

1
Kriteria pemenang @oberon tidak jelas kapan ini diposting. Banyak hal telah berubah.
Level River St

@steveverrill Maaf.
Oberon

Juga di C # --y akan menjadi int yang tidak sama dengan bool seperti di bahasa lain.
Chris

5

bash & sed

Tidak ada angka, tidak ada loop, hanya penyalahgunaan bola yang sangat berbahaya. Lebih disukai dijalankan di direktori kosong agar aman. Script shell:

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

"Lebih baik dijalankan di direktori kosong agar aman." : D
Almo

5

Javascript

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

Menggunakan ekspresi reguler untuk membuat array berukuran y + 1 yang elemen pertamanya adalah 1. Kemudian, kurangi array dengan perkalian untuk menghitung daya. Ketika y = 0, hasilnya adalah elemen pertama dari array, yaitu 1.

Memang, tujuan saya adalah saya) tidak menggunakan rekursi, ii) membuatnya tidak jelas.


5

Mathematica

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

Mungkin curang untuk menggunakan fakta bahwa x ^ (1 / y) = y√x


Tidak selingkuh. Pintar.
Michael Stern

Ini brilian. Seandainya aku memikirkannya untuk posting R.
shadowtalker


4

Golfscript, 8 karakter (termasuk I / O)

~])*{*}*

Penjelasan:

TLDR: solusi "produk array berulang lainnya".

Input yang diharapkan adalah dua angka, mis 2 5. Tumpukan dimulai dengan satu item, 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 selalu cara untuk pergi.
Nit

3

Rubi

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

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

Penggunaan sampel:

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

Ini pada akhirnya sama dengan beberapa jawaban sebelumnya: menciptakan array y-length setiap elemen yang x, kemudian mengambil produk. Itu hanya dikaburkan untuk membuatnya terlihat seperti menggunakan **operator terlarang .


3

C, eksponensial dengan mengkuadratkan

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

versi golf dalam 46 byte (terima kasih ugoren!)

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

harus lebih cepat daripada semua jawaban rekursif lainnya sejauh ini

versi sedikit lebih lambat dalam 45 byte

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

1
Untuk aneh b, ~-b/2 == b/2.
ugoren

@ugoren oh tentu, Anda benar
izabera

Ini adalah pertanyaan wawancara populer :) "Bagaimana Anda bisa menulis pow(n, x)lebih baik daripada 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

Sudah ada entri Haskell yang lebih pendek, tetapi saya pikir akan menarik untuk menulis entri yang memanfaatkan fixfungsi, sebagaimana didefinisikan dalam Data.Function. Digunakan sebagai berikut (dalam Repl demi kemudahan):

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 karakter. Menghasilkan array dengan ycontoh xdan mengambil produk.

{prd y#x}

Dapat secara eksplisit dilemparkan ke float untuk rentang yang lebih besar diberikan int / panjang x:

{prd y#9h$x}

1
Panjang naskah pertandingan yang cocok adalah prestasi yang harus diraih.
Nit

2

Logika serupa dengan banyak lainnya, dalam PHP:

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

Jalankan dengan php file.php 5 3untuk mendapatkan 5 ^ 3


2

Saya tidak yakin berapa banyak upvotes yang dapat saya harapkan untuk ini, tetapi saya merasa agak aneh bahwa saya benar - benar harus menulis fungsi itu hari ini. Dan saya cukup yakin ini adalah pertama kalinya situs .SE melihat bahasa ini (situs web sepertinya tidak terlalu membantu 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);
    };

Bekerja untuk eksponen negatif dan pangkalan rasional.

Saya menyorotnya dalam sintaksis Java, karena itulah yang saya lakukan saat ini ketika saya bekerja dengan bahasa ini. Terlihat baik-baik saja.


2

Pascal

Tantangannya tidak menentukan jenis atau rentang x dan y, oleh karena itu saya mencari fungsi Pascal berikut mengikuti semua aturan yang diberikan:

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

Tanpa loop, tidak ada fungsi built-in power atau exponentiation, bahkan rekursi atau aritmatika!


2

J - 5 atau 4 byte

Persis sama dengan jawaban APL marinus .

Untuk x^y:

*/@$~

Untuk y^x:

*/@$

Sebagai contoh:

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

x $~ ymembuat daftar waktu yang xdiulang y(sama dengany $ x

*/ xadalah fungsi produk, */ 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
** adalah operator bawaan.
Silviu Burcea

@ SilviuBurcea Benar, mengedit.
Oberon

@SilviuBurcea Operator =/=fungsi
Visi

@VisioN benar, tetapi idenya adalah tentang built-in. Saya tidak berpikir OP tahu tentang semua operator
bawaan ini

1

Javascript

Dengan rekursi ekor, berfungsi jika ybilangan bulat positif

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

1

Pesta

Semua orang tahu bashdapat melakukan hal-hal yang mengurangi peta tipe whizzy ;-)

#!/bin/bash

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

Jika itu terlalu trolly untuk Anda maka ada ini:

#!/bin/bash

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

1

C

Namun eksponensial rekursif lain dengan mengkuadratkan jawaban dalam C, tetapi mereka berbeda (ini menggunakan pergeseran alih-alih pembagian, sedikit lebih pendek dan berulang sekali lagi daripada yang lain):

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

1

Mathematica

Ini berfungsi untuk bilangan bulat.

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

Contoh

f[5,3]

125


Bagaimana itu bekerja

Tablemembuat daftar y x's. Timesmengambil produk dari semuanya.`


Cara lain untuk mencapai tujuan yang sama :

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

Contoh

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

125


1

Windows Batch

Seperti sebagian besar jawaban lain di sini, ia menggunakan rekursi.

@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 disimpan dalam variabel lingkungan z.


1

perl

Inilah entri perl rekursif ekor. Penggunaannya adalah echo $ X, $ Y | foo.pl:

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

Atau untuk pendekatan tipe yang lebih fungsional, bagaimana:

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

"a: stuff goto a if something" tampak seperti lingkaran.
Glenn Randers-Pehrson

Yap, versi goto adalah sebuah loop, tetapi bukankah rekursi ekor juga pada dasarnya adalah sebuah loop?
skibrianski

1

Python

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

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

answer =125

Saya tidak yakin apakah ini melanggar persyaratan, tetapi jika tidak di sini adalah upaya saya.


Selamat datang di PPCG! Ketika Anda melakukan header bahasa Anda, Anda dapat meninggalkan "bahasa =" karena menurut kebiasaan setiap orang menempatkan bahasa di header sehingga itu dipahami. Anda mungkin memang telah melanggar peraturan di sini, tetapi kami akan membiarkan para pemilih memutuskan. Senang memiliki anggota baru di country club.
Jonathan Van Matre
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.