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.


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

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

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

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.


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

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)

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.


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

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

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*

"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.


5

Mathematica

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

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


Não é trapaça. Inteligente.
Michael Stern

Isto é brilhante. Gostaria de ter pensado nisso para o meu post R.
Shadowtalker


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

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 .


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

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

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}

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


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.


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!


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


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)

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}

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

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

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


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.


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

"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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.