Escreva uma função que pegue (x, y) e retorne x à potência de y SEM Loops [fechado]

14

Este é um desafio curto realmente interessante.

Adicione uma função ou um procedimento que tem dois parâmetros, xe ye devolve o resultado de SEM utilizando laços, ou construído em funções de energia.xy

O vencedor é a solução mais criativa e será escolhido com base no maior número de votos após 3 dias.

CodyBugstein
fonte
1
Que tipo de desafio é esse?
VisioN
22
Que tal exp(log(x)*y)?
ossifrage escrúpulos
2
Uma resposta para números inteiros é aceitável apenas? Uma vez que estas são as primeiras respostas.
mmumboss
4
Parece que as respostas até agora usam recursão ou listas de 'x' repetidos. Estou destruindo meu cérebro tentando pensar em outra maneira (particularmente algo que permita um y não inteiro).
219 BenM Ben14
1
Infelizmente, a proibição de loops exclui soluções matemáticas divertidas, como a expansão de Taylor.
shadowtalker

Respostas:

27

APL (7)

{×/⍵/⍺}

O argumento esquerdo é base, o argumento direito é expoente, por exemplo:

     5 {×/⍵/⍺} 6
15625

Explicação:

  • ⍵/⍺replica vezes, por exemplo 5 {⍵/⍺} 6- ->5 5 5 5 5 5
  • ×/leva o produto, por exemplo ×/5 5 5 5 5 5- -> 5×5×5×5×5×5->15625
marinus
fonte
2
Hum .. Isso pode ser escrito em 5 caracteres em J, exatamente o mesmo método. */@$~
see 30/07/2014
@ Sii 4 mesmo, se você permitir expoente à esquerda, base à direita.
ɐɔıʇǝɥʇuʎs
Eu tive o advérbio flip porque achei que não era permitido.
see
@Seeq 4 em Dyalog APL :×/⍴⍨
Adám
27

C #: Expoentes de ponto flutuante

OK, esta solução é bastante frágil. Você pode facilmente quebrá-lo jogando números ridiculamente enormes como 6 nele. Mas funciona lindamente para coisas como DoublePower(1.5, 3.4)e não usa recursão!

    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
fonte
43
"números ridiculamente grandes como 6" Eu gostei disso.
DavidC
Certamente, o uso de funções Enumerable é dependente de loop que foi proibido na pergunta ou está ok porque o loop está dentro dos métodos da estrutura?
31714 Chris
16

C ++

Que tal alguma meta-programação de modelos? Dobra as pequenas regras que existiam, mas vale a pena tentar:

#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
fonte
1
mas isso não é uma função, é um valor em tempo de compilação, não é? : O
PaperBirdMaster
Bem, um construtor é uma função, e os parâmetros do modelo são quase como argumentos de função ... certo? =)
erlc
@PaperBirdMaster Sim ... é por isso que eu admiti algumas flexões de regras. Eu pensei em enviar algo além da recursão da cauda, ​​mas acabei de enviar a recursão da cauda do tempo de compilação, haha. Perto o suficiente, certo?
precisa saber é o seguinte
@ astephens4 perto o suficiente, eu adoro: 3 #
PaperBirdMaster 7/14
15

Pitão

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

Não funciona para poderes não-íntegros.

Hovercouch
fonte
Eu gosto deste.
CodyBugstein
1
Por que você está adicionando um separador sem usar join? eval('*'.join([str(x)] * y)).
Bakuriu
1
Isso era trollagem de código?
gerrit
Gostaria também de observar que o python possui o **operador, para que você possa eval () d.
Riking
3
@ Vikings: isso seria um desafio, no entanto.
Hovercouch
10

Haskell - 25 caracteres

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

Após a versão APL de Marinus:

f x y = product $ take y $ repeat x

Com o comentário e o espaço em branco do mniip removidos, 27 caracteres:

f x y=product$replicate y x
intx13
fonte
use em replicate y xvez detake y $ repeat x
mniip
4
Eu estava convencido de que você poderia salvar caracteres escrevendo sua segunda função sem pontos. Como se vê, f=(product.).flip replicateé exatamente o mesmo número de caracteres.
Kaya
@ mniip Não importa, isso não é código de golfe.
nyuszika7h
10

Pitão

Se yé um número inteiro positivo

def P(x,y):
    return reduce(lambda a,b:a*b,[x]*y)
Julien Ch.
fonte
7

JavaScript (ES6), 31

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

Uso:

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

Explicação:

A função acima cria uma expressão que multiplica x yvezes e depois a avalia.

Florent
fonte
6

Estou surpreso ao ver que ninguém escreveu uma solução com o Y Combinator, ainda ... assim:

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

Sem loops, sem operações de vetor / lista e sem recursão (explícita)!

>>> pow((2,0))
1
>>> pow((2,3))
8
>>> pow((3,3))
27
berdario
fonte
Uh, eu só vi agora solução Haskell de KChaloux que usos fix, upvoting ele ...
berdario
5

C #: 45

Funciona apenas para números inteiros:

int P(int x,int y){return y==1?x:x*P(x,y-1);}
Rik
fonte
Bata-me a ele :-) Eu acho que você poderia economizar alguns bytes por escrito return --y?x:x*P(x,y);em vez
ossifrage escrúpulos
1
Mas este não é o código-golf ...
Oberon
1
Os critérios de vitória do @oberon não estavam claros quando este foi publicado. As coisas mudaram.
Level River St
@steveverrill Desculpe.
Oberon
Também em C # --y seria um int que não é o mesmo que um bool como em outros idiomas.
31714 Chris
5

bash & sed

Sem números, sem loops, apenas um abuso globamente embaraçosamente perigoso. De preferência, execute em um diretório vazio para ser seguro. Script de shell:

#!/bin/bash
rm -f xxxxx*
eval touch $(printf xxxxx%$2s | sed "s/ /{1..$1}/g")
ls xxxxx* | wc -l
rm -f xxxxx*
orion
fonte
"De preferência, execute em um diretório vazio para ser seguro." : D
Almo
5

Javascript

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

Usa expressões regulares para criar uma matriz de tamanho y + 1, cujo primeiro elemento é 1. Em seguida, reduza a matriz com multiplicação para calcular a energia. Quando y = 0, o resultado é o primeiro elemento da matriz, que é 1.

É certo que meu objetivo era: i) não usar recursão, ii) torná-lo obscuro.

topkara
fonte
5

Mathematica

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

Provavelmente trapaça para usar o fato de que x ^ (1 / y) = y√x

Rob Farr
fonte
Não é trapaça. Inteligente.
Michael Stern
Isto é brilhante. Gostaria de ter pensado nisso para o meu post R.
Shadowtalker
4

Javascript

function f(x,y){return y--?x*f(x,y):1;}
Stephen Melvin
fonte
4

Golfscript, 8 caracteres (incluindo E / S)

~])*{*}*

Explicação:

TLDR: outro "produto de matriz repetida" solução.

A entrada esperada é de dois números, por exemplo 2 5. A pilha começa com um item, a sequência "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
fonte
Golfscript é sempre o caminho a percorrer.
Nit
3

Rubi

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

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

Uso da amostra:

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

Em última análise, é o mesmo que várias respostas anteriores: cria uma matriz de comprimento y cujo elemento é x e leva o produto. É ofuscado gratuitamente para parecer que está usando o **operador proibido .

histocrata
fonte
3

C, exponenciação por quadratura

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

versão golfed em 46 bytes (obrigado ugoren!)

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

deve ser mais rápido do que todas as outras respostas recursivas até agora

versão ligeiramente mais lenta em 45 bytes

p(a,b){return b<2?b?a:1:p(a*a,b/2)*p(a,b&1);}
izabera
fonte
1
Por estranho b, ~-b/2 == b/2.
precisa saber é o seguinte
@ugoren Ah, claro, você está certo
izabera
Esta é uma pergunta popular para entrevistas :) "Como você pode escrever pow(n, x)melhor que 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

Já existe uma entrada de Haskell mais curto, mas eu pensei que seria interessante para escrever um que tira proveito da fixfunção, conforme definido no Data.Function. Utilizado da seguinte forma (no Repl, para facilitar):

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
fonte
2

Q

9 caracteres. Gera matriz com yinstâncias xe leva o produto.

{prd y#x}

Pode converter explicitamente para flutuar para um intervalo maior, dado int / long x:

{prd y#9h$x}
skeevey
fonte
1
Combinar Golfscript de comprimento é uma façanha a ser alcançada.
Nit
2

Lógica semelhante a muitas outras, em PHP:

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

Execute-o php file.php 5 3para obter 5 ^ 3

dkasipovic
fonte
2

Não sei ao certo quantas votações posso esperar por isso, mas achei um tanto peculiar que eu realmente tivesse que escrever essa mesma função hoje. E tenho certeza de que é a primeira vez que um site .SE vê esse idioma (o site não parece ser muito útil).

abdômen

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

Trabalha para expoentes negativos e bases racionais.

Eu o destaquei na sintaxe Java, porque é o que estou fazendo atualmente quando estou trabalhando com essa linguagem. Parece bom.

daniero
fonte
2

Pascal

O desafio não especificou o tipo ou o intervalo de xey, portanto, acho que a seguinte função Pascal segue todas as regras fornecidas:

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

Sem loop, sem energia embutida ou função de exponenciação, nem mesmo recursão ou aritmética!

celtschk
fonte
2

J - 5 ou 4 bytes

Exatamente o mesmo que a resposta do APL de marinus .

Para x^y:

*/@$~

Para y^x:

*/@$

Por exemplo:

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

x $~ ycria uma lista de tempos xrepetidos y(o mesmo quey $ x

*/ xé a função do produto, */ 1 2 3->1 * 2 * 3

seequ
fonte
1

Pitão

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
fonte
1
** é um operador interno imo.
Silviu Burcea
@SilviuBurcea True, edição.
Oberon
@SilviuBurcea operador de =/=função
visão
@VisioN verdade, mas a idéia era sobre embutidos. Eu não acho que o OP sabe sobre tudo isso embutido operadores ...
Silviu Burcea
1

Javascript

Com recursão de cauda, ​​funciona se yfor um número inteiro positivo

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

Bater

Todo mundo sabe que bashpode fazer coisas do tipo redutor de mapa;

#!/bin/bash

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

Se isso é demais para você, existe o seguinte:

#!/bin/bash

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

C

Ainda outra exponenciação recursiva ao quadrado da resposta em C, mas elas diferem (isso usa uma mudança em vez de divisão, é um pouco mais curta e se repete mais uma vez que a outra):

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

Mathematica

Isso funciona para números inteiros.

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

Exemplo

f[5,3]

125


Como funciona

Tablefaz uma lista de y x's. Timesleva o produto de todos eles.


Outra maneira de alcançar o mesmo fim :

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

Exemplo

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

125

DavidC
fonte
1

Lote do Windows

Como a maioria das outras respostas aqui, ele usa recursão.

@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 é armazenado na variável de ambiente z.

mackthehobbit
fonte
1

perl

Aqui está uma entrada perl recursiva de cauda. O uso é eco $ X, $ Y | foo.pl:

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

Ou, para uma abordagem mais funcional, que tal:

($x,$y) = split/,/, <>;
$t=1; map { $t *= $x } (1..$y);
print $t
skibrianski
fonte
"a: coisas vão a se algo" parece um loop.
Glenn Randers-Pehrson
Sim, a versão goto é um loop, mas a recursão da cauda também não é essencialmente um loop?
skibrianski
1

Pitão

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

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

answer =125

Não tenho certeza se isso é contra os requisitos, mas se não, aqui está a minha tentativa.

todos
fonte
Bem-vindo ao PPCG! Quando você faz o cabeçalho do seu idioma, pode deixar de fora o "language =", pois, por costume, todos colocam o idioma no cabeçalho para que isso seja entendido. Você pode realmente ter infringido as regras aqui, mas vamos deixar os eleitores decidirem. Fico feliz em ter um novo membro no clube de campo.
Jonathan Van Matre