Eleve o número inteiro x à potência x, sem embutidos de exponenciação


16

Tarefa - O título resume muito bem: aumente um número inteiro x ao poder x , onde 0<x.

Restrições:

  • Use de exponenciação, exp(), ln(), língua e quaisquer outros poderes-relacionados built-ins, como pow(), x^x, x**xé proibido.
  • Você pode supor que o número inteiro ajustado se enquadre nos limites da linguagem de programação de sua escolha.

Casos de teste:

Input | Output
---------------
2     | 4
3     | 27
5     | 3125
6     | 46656
10    | 10000000000

Isso é , então o programa mais curto em bytes vence.


Podemos aceitar entrada como uma string?
Shaggy

Fiz uma edição para isso, esperando que seja reaberto. Eu apaguei regra 3 e, em vez afirmou que ele deve ser um programa completo, como o OP provavelmente pretendia
Mr. Xcoder

Muito melhor, @ Mr.Xcoder, mas sugiro remover (ou reformular) a segunda restrição. "Not a function" exclui JS da participação? Eu também sugerem, para os efeitos do desafio, que deve ter a alça 0e que a saída esperada ser especificado ( 0ou 1ou qualquer um). Finalmente, ter que lidar com números inteiros negativos seria uma boa adição ao desafio.
Shaggy

O @Shaggy adicionou js de volta ... calculado 0 ^ 0 na calculadora da apple e retornou 1. Talvez 1 deva ser o valor escolhido, porque o Python também retorna 1para 0^0. No entanto, Foundation+ Swift retorna 0
Mr. Xcoder 10/10

1
@ Mr.Xcoder, removi a "restrição" que não precisamos tratar 0e, em vez disso, especifiquei isso 0<xno lead-in. Também removi a restrição de que o código não deve gerar erros; Isso deve ser feito sem dizer. Sinta-se à vontade para reverter, se necessário.
Shaggy

Respostas:


15

APL (Dyalog) , 4 bytes

Para x x , leva x como argumento esquerda e x como argumento direita.

×/⍴⍨

Experimente todos os casos online!

×/ produto de

⍴⍨ arg copia arg

E aqui está um que também lida com números inteiros negativos:

×/|⍴|*×

Experimente todos os casos!

×/ o produto de

| valor absoluto

r epetições de

| o valor absoluto

* ao poder de

× o signum

A primitiva Power integrada é:

x*y


9

Mathematica, 16 bytes

Eu tenho duas soluções nessa contagem de bytes:

1##&@@#~Table~#&

Aqui, #~Table~#cria uma lista de ncópias de n. Em seguida, a Listcabeça é substituída pela 1##&que multiplica todos os seus argumentos.

Nest[n#&,1,n=#]&

Isto simplesmente armazena a entrada em ne se multiplica então 1por n, nvezes.


1
#~Product~{#}&
Alephalpha #

1
@ ahfalphapha, bom ponto. Você pode postar isso como uma resposta separada.
Martin Ender

5

JavaScript (ES6), 33 28 25 24 bytes

n=>g=(x=n)=>--x?n*g(x):n

Tente

f=
n=>g=(x=n)=>--x?n*g(x):n
o.innerText=f(i.value=3)()
i.oninput=_=>o.innerText=f(+i.value)()
<input id=i min=1 type=number><pre id=o>


História

25 bytes

f=(n,x=n)=>--x?n*f(n,x):n

28 bytes

n=>eval(1+("*"+n).repeat(n))

33 bytes

n=>eval(Array(n).fill(n).join`*`)

4

Pure bash, 43

echo $[$1<2?1:$[$1<2?2:$1]#`printf 1%0$1d`]

Experimente online .

Não tenho certeza se isso está dobrando muito as regras - não estou usando nenhum dos builtins proibidos listados, mas estou usando a conversão de base.

  • printf 1%0$1dgera a 1seguido de n0 s
  • $[b#a]é uma expansão aritmética a ser tratada acomo um bnúmero base , que fornece o resultado necessário. Infelizmente, a base <2 não funciona, então o extra?: bits manipulam a entrada n = 1.

A entrada máxima é 15, porque o bash usa números inteiros assinados de 64 bits (até 2 31 -1).


Mesmo problema que eu tive, isso não funciona para x = 1. No entanto, abordagem muito interessante.
Maxim Mikhaylov

@ MaxLawnboy Obrigado por apontar isso - que tristemente inchado minha resposta. Talvez eu possa descobrir uma outra versão mais curta ...
Trauma Digital

Coisas legais. Sempre quis aprender bash, mas sempre fui muito preguiçoso para isso =)

4

Alice , 13 bytes

/o
\i@/.&.t&*

Experimente online!

Explicação

/o
\i@/...

Essa é uma estrutura para programas que lêem e escrevem números inteiros decimais e operam inteiramente no modo Cardinal (portanto, programas para a maioria dos problemas aritméticos).

.    Duplicate n.
&.   Make n copies of n.
t    Decrement the top copy to n-1.
&*   Multiply the top two values on the stack n-1 times, computing n^n.


3

Gelatina , 3 bytes

ẋ⁸P

Experimente online!

Quão?

ẋ⁸P - Main link: x             e.g. 4
 ⁸  - link's left argument, x       4
ẋ   - repeat left right times       [4,4,4,4]
  P - product                       256

Droga, eu queria fazer isso. : P
HyperNeutrino

@ Jonathan Allan são 3 bytes ou 3 caracteres largos? vamos ver o código-fonte hex dump, por favor, para tomar a decisão correta sobre o tamanho real do bytes do código. ;-) e faça as correções

1
@ xakepp35 Jelly usa um SBCS e o link de bytes no cabeçalho aponta para ele. O programa com hexdump F7 88 50funciona conforme o esperado .
Dennis

@ Dennis obrigado pela resposta! Eu não poderia imaginar tal linguagem um antes =)

3

Cubix , 19 bytes

..@OI:1*s;pu!vqW|($

Experimente online!

Passo a passo

Expande para um cubo com comprimento lateral 2

    . .
    @ O
I : 1 * s ; p u
! v q W | ( $ .
    . .
    . .
  • I:1 Pega a entrada, duplica e pressiona 1. Isso configura a pilha com um contador, multiplicador e resultado.
  • *s; Multiplica os TOS, troca o resultado por anterior e remove anterior.
  • puTraga o item do contador para os Termos de Serviço. Sua vez. Isso costumava ser uma alteração de faixa, mas precisava raspar um byte.
  • |($Isso foi feito para salvar um byte. Quando atingido, pula o decremento. reflete, diminui o contador e ignora o invólucro sem operação ao redor do cubo.
  • !vqWTeste o contador. Se realmente pular o redirecionamento, coloque o contador no BOS e mude a faixa novamente para o multiplicador. Caso contrário, redirecione.
  • |sO@essa é a sequência final redirecionada para o contra-teste. Vai além da reflexão horizontal, troca os TOS, trazendo o resultado para os TOS, saída e parada.

3

R, 22 bytes

xde stdin.

prod(rep(x<-scan(),x))

gera uma lista de xcópias de xe calcula o produto dos elementos dessa lista. Quando x=0, o repretorno numeric(0), que é um vetor numérico de comprimento 0, mas o valor prodé 1, é 0^0=1por esse método, que é consistente com a exponenciação interna de R, então é bem legal.

Experimente online!


3

linguagem de máquina x86_64 para Linux, 14 11 10 bytes

0:   6a 01                   pushq  $0x1
2:   58                      pop    %rax
3:   89 f9                   mov    %edi,%ecx
5:   f7 ef                   imul   %edi
7:   e2 fc                   loop   5
9:   c3                      retq

Para experimentá-lo online! , compile e execute o seguinte programa C.

const char h[]="\x6a\1\x58\x89\xf9\xf7\xef\xe2\xfc\xc3";

int main(){
  for( int i = 1; i < 4; i++ ) {
    printf( "%d %d\n", i, ((int(*)())h)(i) );
  }
}




2

05AB1E , 3 bytes

.DP

Experimente online! ou Experimente todos os exemplos

.D  # pop a,b    push b copies of a 
    # 05AB1E implicitly takes from input if there aren't enough values on the stack
    # For input 5, this gives us the array: [5,5,5,5,5]
  P # Take the product of that array
    # Implicit print

Parece que você gostou .D. Primeira vez que o vi usado.
Magic Octopus Urn

ah, eu não entendo o que está acontecendo aqui .. parece ser muito exótico e nenhuma explicação sobre como isso funciona. = (

@ xakepp35 Isso ajuda?
Riley


2

Japt , 4 bytes

ÆUÃ×

Experimente online!

Explicação

ÆUÃ×       // implicit: U = input integer
Uo{U} r*1  // ungolfed

Uo{ }      // create array [0, U) and map each value to...
   U       //   the input value
      r*1  // reduce with multiplication, starting at 1          
           // implicit output of result

2

código de máquina x86 (Linux), 18 bytes

31 c0 ff c0 31 db 39 df 74 07 0f af c7 ff c3 eb f5 c3

Ele espera uma declaração C da seguinte maneira extern int XpowX(int).

Desmontado

XpowX:
  # edi : input register
  # ebx : counter
  # eax : result register
  xor  %eax, %eax    # result  = 0
  inc  %eax          # result += 1
  xor  %ebx, %ebx    # counter = 0
  loop:
    cmp  %ebx, %edi  # if (counter == input)
    je   done        #   return result
    imul %edi, %eax  # result  *= input
    inc        %ebx  # counter += 1
    jmp   loop
  done:
    ret



1

Perl 6 , 13 bytes

{[*] $_ xx$_}

$_ xx $_avalia para uma lista de $_cópias de $_( $_sendo o argumento para a função anônima) e [*]reduz a lista com multiplicação.


1

CJam , 6 bytes

ri_m*,

Experimente online!

ri       e# Read integer
  _      e# Duplicate
   m*    e# Cartesian power. The first argument is interpreted as a range
     ,   e# Number of elements. Implicitly display


1

Röda , 17 bytes

{product([_]*_1)}

Experimente online!

É uma função anônima que recebe sua entrada do fluxo.

Explicação:

{product([_]*_1)}
{               } /* An anonymous function */
         [_]      /* An array containing the input value */
            *_1   /* repeated times the input value */
 product(      )  /* Product of all values in the array */

1

dc , 24 23 26 22 bytes

Esta é minha primeira tentativa de escrever uma macro recursiva em dc. Estou certo de que é uma solução subótima que pode ser melhorada bastante.

dsr1+[lrr1-d1<F*]dsFxp

Experimente online!

Edit: Obrigado eush77 ! -4 bytes.


1
Não funciona para x=1.
eush77

Você pode cortar dois bytes substituindo lrsequências no final por dois ds no início.
Eush77

Na verdade, você não precisa disso. Apenas incremente a parte superior da pilha antes de ligar pela primeira vez. Dessa forma, você terminará com xcópias da xpilha (e, é 1claro), e xmultiplicações a partir de então. Portanto, o final pode ser simples dsFxp.
Eush77 # 10/17

@ eush77 Eu estava prestes a dizer que remover o segundo lrnão funcionaria aqui. É a minha primeira vez jogando golfe em um idioma baseado em pilha, por isso parece muito incomum. Obrigado pela ajuda!
Maxim Mikhaylov

1

Lote, 58 bytes

@set n=1
@for /l %%i in (1,1,%1)do @set/an*=%1
@echo %n%

Funciona apenas para entradas de um dígito devido à aritmética de 32 bits.


1

brainf * ck , 148 bytes

,[->+>+<<]>>[-<<+>>]++++++++[<------<------>>-]<[->>+>>+<<<<]>>[-<<+>>]>>-[-<<<<<[>[>+>+<<-]>>[<<+>>-]<<<-]>>[-<<+>>]>>>]<<<++++++++[-<<++++++>>]<<.

Experimente online!

Sem built-ins;)

Como funciona

,                                       - get ascii input
[->+>+<<]                               - duplicate input
>>[-<<+>>]                              - shift inputs left to start
++++++++[<------<------>>-]             - convert ascii into input numbers
<[->>+>>+<<<<]                          - get loop intervals (same as input #)
>>[-<<+>>]                              - shift input back again
>>-[-<<<<<[>[>+>+<<-]>>[<<+>>-]<<<-]>>  - iterated addition (multiplication)
[-<<+>>]>>>                             - Shift output back into input
]<<<++++++++[-<<++++++>>]<<.            - convert final output to ascii

Em poucas palavras, isso funciona multiplicando x(a entrada) por si próprio xvezes. (aka iterando adição iterada). O resultado líquido é x ^ x.

I / O

O programa pega uma única entrada ASCII e a processa como seu índice ASCII menos 48 . O menos 48 é para normalizar as entradas dos números reais ( 4torna 52- se -> 52-48-> 4). Para inserir um número maior que 9, use o próximo caractere ASCII de corrosão ( :-> 58-48-> 10). O programa sai de maneira semelhante.

E / S de teste

INPUT > PROCESSED INPUT >> OUTPUT > TRANSLATED OUTPUT
1 > 1 >> 1 > 1
2 > 2 >> 4 > 4
3 > 3 >> K > 27

Como não há caracteres ASCII imprimíveis após uma entrada de 3, ele só pode imprimir números em teoria . No entanto, você pode verificar se todas as entradas funcionam de fato em visualizadores como esse .



1

Python, 32 bytes

f=lambda g,z=1:z>g or g*f(g,z+1)

Experimente online!


Bem-vindo ao PPCG! Você não precisa contar a f=parte, para encurtar o envio para 30 bytes .
Steadybox 9/07

@Steadybox A f=parte não precisa ser contada, porque é recursiva, por isso depende da função que está sendo chamado f, a fim de funcionar corretamente
musicman523

@ musicman523 Sim, você está certo.
Steadybox

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.