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.

CodyBugstein
sumber
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
marinus
sumber
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));
    } 
BenM
sumber
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;
}
astephens4
sumber
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.

Hovercouch
sumber
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
intx13
sumber
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)
Julien Ch.
sumber
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.

Florent
sumber
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
berdario
sumber
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);}
Rik
sumber
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*
orion
sumber
"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.

topkara
sumber
5

Mathematica

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

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

Rob Farr
sumber
Tidak selingkuh. Pintar.
Michael Stern
Ini brilian. Seandainya aku memikirkannya untuk posting R.
shadowtalker
4

JavaScript

function f(x,y){return y--?x*f(x,y):1;}
Stephen Melvin
sumber
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
Claudiu
sumber
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 .

histokrat
sumber
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);}
izabera
sumber
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
KChaloux
sumber
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}
skeevey
sumber
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

dkasipovic
sumber
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.

daniero
sumber
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!

celtschk
sumber
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

seequ
sumber
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)
Oberon
sumber
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}
Julien Ch.
sumber
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'*' ) ))
Trauma Digital
sumber
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;}
Untuk S
sumber
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

DavidC
sumber
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.

mackthehobbit
sumber
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
skibrianski
sumber
"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.

ali
sumber
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