Implemente hiperexponenciação / tetração sem o uso de '^'


28

O desafio

Implemente a tetração (aka Power Tower ou Hyperexponentiation) com a menor quantidade de caracteres.

As condições

  • Não utilizar o operador 'potência' ou seus equivalentes (tal como pow(x,y), x^y, x**y, etc.)
  • Entrada fornecida como: x y(separada por um espaço)
  • xé exponenciada por si mesma yvezes.
  • Seu método deve ser capaz de calcular pelo menos 4 3(4 exponenciados por ele mesmo 3 vezes)

A pontuação

  • Menor pontuação ganha: (# de caracteres)
  • Dedução de bônus se você não usar o operador de multiplicação (-5 pontos).
  • Não há requisitos de velocidade / memória. Demore o tempo que quiser.

Exemplos

x, 0 -> 1

2, 2 -> 2^2 = 4

2, 4 -> 2^(2^(2^2)) = 65536

4, 3 -> 4^(4^4) = 4^256 = 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096

Aberto a sugestões / alterações / perguntas


4
Uma alteração que eu acho bastante importante é substituir "* operator" por "multiplication operator". Em GolfScript *é a multiplicação em alguns contextos, mas é também o simples looping operador: {block}N*é equivalente a C-style for(i=0;i<N;i++){block}. O caso delicado da borda é a multiplicação de cadeias / matrizes ( 'a'3*doações 'aaa'), mas é improvável que seja um problema, uma vez que uma matriz de 4***3elementos sobrecarregará a RAM.
Peter Taylor

3
Também vale a pena adicionar um teste para o caso de borda x 0=> 1. Minha solução original não lidou com esse caso.
Peter Taylor

3
A penalidade por usar a multiplicação é muito baixa. (: = bônus por não usá-lo). Eu fiz uma solução que não a usou e tive que substituí-la para evitar estouros de pilha e ganhei 7 char char para uma perda de bônus de 5 char.
usuário desconhecido

2
@EngineerToast eu postei este golf 4 anos antes do que você ligados ...
MrZander

2
As condições e a pontuação são meio estranhas. Você não permite o uso de operações de energia? Ou você os permite, mas eles são um bônus de +10 pontos?
Simply Beautiful Art

Respostas:


16

J, a pontuação é 7 (12 caracteres - 5 pontos para evitar a multiplicação)

+/@$/@$~/@$~

uso:

   4 +/@$/@$~/@$~ 3
1.34078e154
t=.+/@$/@$~/@$~  NB. define a function
   4 t 3
1.34078e154
   2 t 2
4

Apenas algumas dobras aninhadas:

  • Usando multiplicação seria */@$~/@$~
  • Usar energia seria ^/@$~onde $~cria array, /é uma função fold.

Bem feito. (pad)
Gareth

@ Gareth Obrigado, mas foi que padsignifica aqui? Desculpe, o inglês não é minha língua materna.
usar o seguinte código

5
Minha mensagem era muito curta, então eu precisava preenchê-la. :-)
Gareth

Você poderia obter pentação apenas fornecendo mais um @$~em conjunto?
Jonas

@ Jonah Você precisaria do /, mas sim. você está apenas dobrando quantas vezes forem necessárias sobre a função de dobra aninhada.
HyperNeutrino

15

Haskell, 87 85 - 5 == 80 82

import Data.List
t x=genericLength.(iterate(sequence.map(const$replicate x[]))[[]]!!)

Não utiliza exponenciação, multiplicação ou adição (!), Apenas lista operações. Demonstração:

Prelude> :m +Data.List
Prelude Data.List> let t x=genericLength.(iterate(sequence.map(const$replicate x[]))[[]]!!)
Prelude Data.List> t 2 2
4
Prelude Data.List> t 2 4
65536
Prelude Data.List> t 4 3

...
ahm ... você não disse nada sobre desempenho ou memória, disse? Mas, considerando bilhões de anos e alguns petabytes de RAM, isso ainda produziria o resultado correto (genericLength pode usar um bigInt para contar o comprimento da lista).


1
Confio que você terá uma resposta para mim até 3012? ;)
MrZander

6
Vou precisar de alguma ajuda da lei de Moore, mas, se eu puder.
deixou de girar no sentido anti-horáriowis

12

GolfScript, 15 18 caracteres

~])*1\+{[]+*{*}*}*

Sim, um dos *s é um operador de multiplicação (exercício: qual?), Por isso não me qualifico para o bônus de 5 caracteres. Ainda assim, é apenas um pouco menor que a solução de Peter .

Caso contrário, esta versão anterior de 15 caracteres é a mesma, mas não produz saída quando o segundo argumento é 0. Obrigado a res por detectar o erro.

~])*{[]+*{*}*}*

Isso produz erros fatais, por exemplo, com "2 3" ~])*{[]+*{*}*}*.
res

@res, produz a resposta correta para mim.
Peter Taylor

@res: assume que não há mais nada na pilha além da entrada. Se você deseja fornecer a entrada em linha, como no seu exemplo, primeiro use ;para remover a sequência de entrada real que o intérprete coloca na pilha na inicialização. Ou apenas adicione um [ao código: ambos ;"2 3" ~])*{[]+*{*}*}*e "2 3" [~])*{[]+*{*}*}*funcione bem para mim.
Ilmari Karonen

(+1) Obrigado! Essas variações funcionam e resolvem um mistério para mim. O tutorial diz "Você não precisa canalizar a entrada, mas, se não o fizer, não solicitará a entrada; em vez disso, assumirá que não há entrada ". Então, eu tenho usado apenas ruby golfscript.rb my_script.gsna linha de comando, sem saber que isso faz com que algo ("", aparentemente) esteja na pilha antes da execução do script - o que às vezes funciona, às vezes não. (Além disso, com echo 2 3 | ruby golfscript.rb my_script.gs, seu programa faz trabalho como-determinado.)
res


10

J, 16 19 12 caracteres

*/@$~/1,~$~/

ou como verbo (17 caracteres):

h=:[:*/@$~/1,~$~/

uso:

   h 2 4
65536

ou recebendo informações do teclado ( 24 27 20 caracteres):

*/@$~/1,~$~/".1!:1]1

com agradecimentos a FUZxxl por apontar minha estupidez. :-)

Explicação:

J é lido da direita para a esquerda, então usando 2 4:

/é usado para inserir o verbo $~entre cada par de itens na lista. $~pega o item da esquerda e forma-o $usando o item da direita ( ~inverte os argumentos) - portanto isso seria equivalente ao 4 $ 2que fornece uma lista de 2s com quatro itens 2 2 2 2.

Agora, anexamos 1 à lista 1,~e fazemos a mesma coisa novamente; /insira um verbo */@$~entre cada par de itens na lista. Esse verbo começa da mesma maneira, $~mas desta vez /insere um *entre cada item da lista recém-gerada. O @just garante que */@$~funciona como um verbo em vez de dois. Isso dá 2multiplicado por si só tempo suficiente para ser equivalente a 2^4.

Página de vocabulário de J - Acho divertido resolver problemas com J apenas por causa da maneira diferente que às vezes faz as coisas.

A adição de mais uma iteração para remover o *operador tem 2 problemas

  • Ele sai com 17 caracteres ( +/@$~/,@$~/1,~$~/) que, mesmo com o bônus -5, é muito longo
  • A memória fica insuficiente se o número for muito grande, por isso não atende ao requisito de poder calcular 4 3

Você poderia fornecer uma explicação? Isso parece interessante.
MrZander

@ MrZander Eu editei minha resposta para adicionar uma explicação.
Gareth

Não tenho certeza se eu tenho uma melhor compreensão ou mais confusão, mas obrigado haha.
perfil completo de MrZander

A explicação implica que a coisa toda está fazendo exponenciação em vez de tetração. Qual de nós está faltando alguma coisa?
Peter Taylor

@ PeterTaylor Suspeito que minha explicação não seja muito clara. Se estivesse fazendo tetração, eu teria usado apenas o ^/]$[que cria a lista 2 2 2 2e coloca o operador de exponenciação entre eles. O que isto está fazendo é dar um passo adiante e fazer a exponenciação por multiplicação repetida.
Gareth

8

GolfScript (24 caracteres - 5 = 19 pontos)

~\1{1{0{+}?}?}{@\+@*}:?~

é incrivelmente lento.

(ou 20 caracteres)

~\1{1{*}?}{@\+@*}:?~

é muito mais rápido.


2
Como o GolfScript é um programa Ruby, podemos testar em ideone :) ideone.com/GTIfP . Também enviei um email para ideone, sugerindo que eles adicionassem suporte ao GolfScript.
precisa saber é o seguinte

@mellamokb, será bom se o adicionarem, mas não estou muito otimista porque a política declarada é adicionar idiomas suportados pela distribuição.
Peter Taylor

Também li isso ... mas, como eles suportam Ruby, e o GolfScript é apenas um programa Ruby, deve ser fácil :) Basta criar um script bash que passe nos parâmetros.
Mellamokb


6

Python, 70

Isso usa evalchamadas aninhadas , eventualmente produzindo uma string "a*a*a*a...*a"que é avaliada. Quase metade da pontuação é desperdiçada em obter os argumentos ... embora eu tenha notado que algumas outras soluções não se incomodam com isso.

a,b=map(int,raw_input().split())
exec"eval('*'.join('a'*"*b+'1'+'))'*b

Se assumirmos os argumentos são vírgula sepearated, você poderia usar input()ou uso eval(raw_input())Felicidades
st0le

1
@ st0le, leia a pergunta
Boothby

Agradável. A segunda linha pode ser jogada ainda mais: exec"eval('a*'*"*b+'1'+"+'1')"*b
flornquake

@flornquake boa captura! obrigado!
Boothby

4

Scala: 110

type B=BigInt
def r(a:B,b:B,f:(B,B)=>B):B=if(b>1)f(a,r(a,b-1,f))else a
def h(a:B,b:B)=r(a,b,r(_,_,r(_,_,(_+_))))

ungolfed:

type B=BigInt
def recursive (a:B, b:B, f:(B,B)=>B): B = 
  if (b>1) f (a, recursive (a, b-1, f)) 
  else a
recursive (2, 3, recursive (_, _, recursive (_, _, (_ + _))))

explicação:

type B=BigInt
def p (a:B, b:B):B = a+b
def m (a:B, b:B):B = if (b>1) p (a, m (a, b-1)) else a
def h (a:B, b:B):B = if (b>1) m (a, h (a, b-1)) else a
def t (a:B, b:B):B = if (b>1) h (a, t (a, b-1)) else a

além disso, mul, high (: = pow), a tetração funciona da mesma maneira. O padrão comum pode ser extraído como método recursivo, que requer dois BigInts e uma função básica:

def r (a:B, b:B, f:(B,B)=>B):B = 
  if (b>1) f(a, r(a, b-1, f)) else a
r (4, 3, r (_,_, r(_,_, (_+_))))

Os sublinhados são espaços reservados para algo que é chamado nessa sequência, por exemplo, a adição mais (a, b) = (a + b); portanto ( + ) é uma função que recebe dois argumentos e os adiciona (a + b).

infelizmente, tenho problemas com o tamanho da pilha. Funciona com valores pequenos para 4 (por exemplo: 2) ou se eu reduzir a profundidade em uma etapa:

def h(a:B,b:B)=r(a,b,r(_,_,(_*_))) // size -7, penalty + 5
def h(a:B,b:B)=r(a,b,r(_,_,r(_,_,(_+_)))) 

O código original tem 112 caracteres e teria pontuação, se válida, 107. Talvez eu descubra como aumentar a pilha.

O algoritmo expandido pode ser transformado em chamadas recursivas:

type B=BigInt
def p(a:B,b:B):B=a+b
import annotation._
@tailrec
def m(a:B,b:B,c:B=0):B=if(b>0)m(a,b-1,p(a,c))else c
@tailrec
def h(a:B,b:B,c:B=1):B=if(b>0)h(a,b-1,m(a,c))else c
@tailrec
def t(a:B,b:B,c:B=1):B=if(b>0)t(a,b-1,h(a,c))else c

A chamada tailrecursive é mais longa que o método original, mas não gerou um fluxo de empilhamento na versão longa - no entanto, não gera um resultado em tempo razoável. t (2,4) está bom, mas t (3,3) já foi interrompido por mim após 5 minutos. No entanto, é muito elegante, não é?

// 124 = 119-5 bonus
type B=BigInt
def r(a:B,b:B,c:B,f:(B,B)=>B):B=if(b>0)r(a,b-1,f(a,c),f)else c
def t(a:B,b:B)=r(a,b,1,r(_,_,1,r(_,_,0,(_+_))))

E agora o mesmo que acima: use a multiplicação fedida (nós até lucramos ao rejeitar o bônus de 5, porque economizamos 7 caracteres: win = 4 chars :)

// 115 without bonus
type B=BigInt
def r(a:B,b:B,c:B,f:(B,B)=>B):B=if(b>0)r(a,b-1,f(a,c),f)else c
def t(a:B,b:B)=r(a,b,1,r(_,_,1,(_*_)))

invocação:

timed ("t(4,3)")(t(4,3)) 
t(4,3): 1
scala> t(4,3)
res89: B = 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096

tempo de execução: 1ms.


4

Br ** nfuck, 128-5 = 123 bytes

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

A entrada está na forma de caracteres com pontos de código dos números desejados como entradas. A saída é a mesma.

Uma explicação está chegando quando eu tiver o tempo abaixo. Recebo pontos de bônus por não usar exponenciação, multiplicação ou adição mesmo?

Cell 3 (0-indexed) is the running total x.
This calculates the nth tetration of a.

+<<+<<,<,                                       Initialize tape with [n, a, 0, 1, 0, 1]
[                                               While n:
  >[>+>>+<<<-]>[<+>-]                             Copy a 3 cells to right: [n, a, 0, x, a, 1]
  >[                                              While x:
    >[>>+>+<<<-]>>>[<<<+>>>-]                       Copy a 2 cells to right: [n, a, 0, x, a, 1, a, 0]
    <<[>[>+>+<<-]>>[<<+>>-]<<<-]                    Cell 7 = prod(cell 5, cell 6)
    >[-]>[<<+>>-]<<<<-]                             Move this value to cell 5. End while.
  >>[<<+>>-]+<[-]<<<<-]                           Update x to result of exponentiation. End while.
>>>.                                            Print the result!

Isso funciona (testado) para x 0, 0 x, x 1, 1 x, x 2, 2 3, e 2 4. Eu tentei 3 3, mas ele durou várias horas sem terminar (na minha implementação em Java - provavelmente não é o ideal) (EDIT: no EsotericIDE de @ Timwi [É ótimo! Vocês devem tentar] também. Sem sorte.). Em teoria, isso funciona até o tamanho da célula da implementação específica.


1
"Br ** nfuck" Sim "cérebro" é uma palavra muito ofensiva xD. desculpe eu precisava
FireCubez

3

Python, 161 - 5 (sem * operador) = 156

r=xrange
def m(x,y):
 i=0
 for n in r(y):i+=x
 return i
def e(x,y):
 i=1
 for n in r(1,y+1):i=m(i,x)
 return i
def t(x,y):
 i=1
 for n in r(y):i=e(x,i)
 return i

invocar:

t(2, 4)

1
A multiplicação por adição iterada é realmente rápida o suficiente para avaliar 4***3?!
Peter Taylor

2
@PeterTaylor yes? ele completa em menos de um segundo para mim
Blazer

Uau. A versão equivalente do GolfScript leva aaaaaaages.
Peter Taylor

Como em, eu o deixei funcionando da noite para o dia e ainda não terminou.
Peter Taylor

1
Seis anos depois, você também pode salvar alguns bytes substituindo sua mfunção porm=lambda x,y:sum(x for _ in r(y))
Jack Brounstein

3

Perl, 61 caracteres

aqui está um bizarro

sub t
{
  ($x,$y,$z)=@_;
  $y>1&&t($x,$y-1,eval$x."*$x"x($z-1||1))||$z
}

uso:

print t(2,4,1)

4
um incorreto também
ardnew 19/04/12

3

Mathematica , 40 33

Isso não está de acordo com as regras, mas não está de acordo com o código mais curto, e espero que seja do interesse de alguém.

m@f_:=Fold[f,1,#2~Table~{#}]&;

m[m@Sum]

Isso cria uma função de "tetração" quando é executada, mas os argumentos devem ser dados em ordem inversa. Exemplo:

m[m@Sum][3, 4]

1340780792994259709957402499820584612747936582059239337772356144372176 4030073546976801874298166903427690031858186486050853753882811946569946 433649006084096


Você explicaria o código? Ou exibir resultados em símbolos e não em números? Percebo que Fold[g, 1, #2~Table~{#}] &[3, 4]isso produzirá, g[g[g[1, 4], 4], 4]por exemplo.
9788

@ David m[Times]produz Fold[Times, 1, Table[#2, {#1}]] &, que é uma função de poder: m[Times][5, x]---> x^5; o mesmo método é usado para esta nova função de potência para produzir uma função de tetração. Logicamente, pode-se começar, Plusmas isso falha quase imediatamente.
precisa saber é o seguinte

Para eliminar Times, tente o seguinte: t[h_, n_] := Sum[h, {i, n}]. Então corra m[m@t][3, 4].
9788

@ David, sim, isso deve funcionar, mas não para o Code-Golf. ;-) (BTW, você pode escrever Sum[h, n].)
Mr.Wizard

Veja as regras de pontuação. Você economiza 9 pontos ao não usar o Times. A pontuação total ainda não é melhor que a sua, mas está se aproximando.
DavidC

3

Haskell:  58.  51 caracteres, com ou sem multiplicação.

i f x 1=x;i f x n=f$i f x$n-1
t=i(\o n->i(o n)n)(+)4

Ungolfed:

bump op n a = iterate (op n) n !! (fromIntegral $ a-1)
tetrate = iterate bump (+) !! 3

A definição mais curta vem do inline "bump" e da definição de uma versão personalizada do "iterate". Infelizmente, o resultado é impossivelmente ineficiente, mas começar com (*) em vez de (+) fornece uma velocidade decente. Em ghci:

Prelude> let i f x 1=x;i f x n=f$i f x$n-1
(0.00 secs, 1564024 bytes)
Prelude> let t=i(\o n->i(o n)n)(*)3
(0.00 secs, 1076200 bytes)
Prelude> t 4 3
13407807929942597099574024998205846127479365820592393377723561443721764030073546
976801874298166903427690031858186486050853753882811946569946433649006084096
(0.01 secs, 1081720 bytes)

3

Ruby 66 59 caracteres

def e(x,y)
r=1
(1..y).each{t=x
(2..r).each{t*=x}
r=t}
r
end

Infelizmente, esse script não produz a saída correta ( 1) quando o segundo número de entrada é 0; em vez disso, e(x,0)retorna o valor de x.
res

@res você está certo. Eu consertei o código. Obrigado!
Cristian Lupascu

2

Python, 112 caracteres

Os números devem ser o 1º e o 2º argumento: python this.py 4 3
**operador não usado.
*usava. É bastante trivial de implementar, exatamente como **, mas custa mais de 5 caracteres.

import sys
p=lambda y:y and x*p(y-1)or 1
t=lambda y:y>1 and p(t(y-1))or x
x,y=map(long,sys.argv[1:])
print t(y)

Como uso o código para calcular 4 3? E, apenas por curiosidade: você tentou implementar * dessa maneira e calcular 4 3 então?
usuário desconhecido

@userunknown, Entrada é por parâmetros. Eu adicionei uma explicação para a resposta. Não tentei adicionar a *implementação, acredito que a profundidade da recursão seria muito grande para 4 3.
ugoren

2

C, 117 105 99 caracteres

EDIT: Mesclou as duas funções pe rem uma, salvando alguns caracteres.
Dos 99 caracteres, 52 fazem o cálculo real (incluindo definições de variáveis). Os outros 47 são para manipulação de entrada e saída.
ERRO: Lida mal com potências de 0 (por exemplo 0 2). Deve encontrar uma correção de custo mínimo. Este não é um bug, eu esqueci que 0 2é indefinido.

Lida com sucesso 4 3e até fornece um resultado exato. No entanto, pode ser impreciso para alguns números menores.
Imprime o número com um final .000000.

x,y,z;
double R(){return--y?!z?y=R(),R(z=1):x*R():x;}
main(){
    scanf("%d%d",&x,&y);
    printf("%f\n",R());
}

Looks como 118 caracteres para mim: ideone.com/9D5SU
mellamokb

Testar isso com 4 3 é preciso apenas para cerca de 18 locais, o dobro não tem precisão suficiente para suportar uma representação exata.
Sir_Lagsalot

@Sir_Lagsalot, double tem precisão mais que suficiente para 4 ^ 256. Ele possui apenas um dígito significativo.
ugoren

Ah, bom ponto, eu não estava pensando em binário. Ele realmente imprime o valor exato para você? Ele fica truncado após os primeiros 18 dígitos decimais da minha máquina, mas estou disposto a aceitar que é específico do sistema.
Sir_Lagsalot

@Sir_Lagsalot: Veja o link ideone que forneci. Imprime o número inteiro.
mellamokb

2

Fator, 187 caracteres

USING: eval io kernel locals math prettyprint sequences ;
IN: g
:: c ( y x o! -- v )
o 0 = [ x y * ] [ o 1 - o!
y x <repetition> 1 [ o c ] reduce ] if ;
contents eval( -- x y ) swap 2 c .

Antes do golfe:

USING: eval io kernel locals math prettyprint sequences ;
IN: script

! Calculate by opcode:
!   0 => x * y, multiplication
!   1 => x ^ y, exponentiation
!   2 => x ^^ y, tetration
:: calculate ( y x opcode! -- value )
    opcode 0 = [
        x y *
    ] [
        ! Decrement the opcode. Tetration is repeated exponentiation,
        ! and exponentiation is repeated multiplication.
        opcode 1 - opcode!

        ! Do right-associative reduction. The pattern is
        !   seq reverse 1 [ swap ^ ] reduce
        ! but a repetition equals its own reverse, and 'calculate'
        ! already swaps its inputs.
        y x <repetition> 1 [ opcode calculate ] reduce
    ] if ;

contents eval( -- x y )         ! Read input.
swap 2 calculate .              ! Calculate tetration. Print result.

Não removi o operador de multiplicação *. Se fizesse isso, precisaria adicionar alguma lógica, expressando que a soma de uma sequência vazia é 0, não 1. Essa lógica extra custaria mais do que o bônus -5.


Disjuntor de regras, 124 + 10 = 134 caracteres

USING: eval kernel math.functions prettyprint sequences ;
contents eval( -- x y ) swap <repetition> 1 [ swap ^ ] reduce .

Este programa tem uma pontuação mais baixa, mas o operador de exponenciação ^quebra as regras. As regras dizem "(número de caracteres) + (10 * (número de operadores 'poderosos'))", então apliquei a penalidade de +10. No entanto, as regras também dizem "Não use o operador 'power'"; portanto, qualquer programa que cumpra essa penalidade infringe as regras. Portanto, esse programa de 134 caracteres não é uma resposta correta e devo apresentar meu programa mais longo de 187 caracteres como resposta.


2

Haskell 110 - 5 = 105

Estilo Peano de Tetração. Esta é a solução mais insana possível, apenas um aviso, mas também evita a adição.

data N=Z|S N
a&+Z=a
a&+S b=S$a&+b
_&*Z=Z
a&*S b=a&+(a&*b)
_&^Z=S Z
a&^S b=a&*(a&^b)
_&>Z=S Z
a&>S b=a&^(a&>b)

Isso depende de você ter a paciência para digitar os números Peano (e não mostrará a resposta. Se você realmente deseja executá-lo, adicione estas poucas linhas (90 caracteres):

f 0=Z
f a=S$f$a-1
t Z=0
t(S a)=1+t a
main=interact$show.f.(\[x,y]->x&>y).map(f.read).words

2

Ruby, 47 46 45

t=->x,n{r=x;2.upto(n){r=([x]*r).inject :*};r}


2

Lua: 133 caracteres, sem multiplicação

a,b=io.read():match"(%d+) (%d+)"a,b,ba=a+0,b+0,a for i=1,b-1 do o=1 for i=1,a do o=o+o for i=1,ba-b do o=o+o end end a=o end print(o)

Inicialmente, eu usava hacks de repetição de string para fazer multiplicação falsa, mas ele gosta de falhar em valores grandes. Eu poderia usar compilação dinâmica e loadstring para torná-lo menor, mas está ficando tarde aqui ... Preciso dormir.

Digitando "4 3" nas saídas stdin:

1.3407807929943e+154

2

VBA, 90 caracteres

* Talvez o bônus de não multiplicação não seja bom o suficiente. Eu acho que a resposta de não multiplicação é muito mais interessante, mas isso é código de golfe, então não é o melhor. Aqui está uma resposta sem *, e uma resposta melhor (menor e com melhor pontuação) com ela:

90 caracteres, sem operadores de energia, usa multiplicação = 90

Sub c(x,y)
f=IIf(y,x,1):For l=2 To y:b=x:For j=2 To f:b=b*x:Next:f=b:Next:MsgBox f
End Sub

116 caracteres, sem operadores de energia, sem bônus de multiplicação (-5) = 111

Sub c(x,y)
f=IIf(y,x,1):For l=2 To y:b=x:For j=2 To f:For i=1 To x:a=a+b:Next:b=a:a=0:Next:f=b:Next:MsgBox f
End Sub

OBSERVAÇÃO: O VBA tem problemas para imprimir o número quando o resultado é muito grande (ou seja 4, 3), mas é calculado corretamente; portanto, se, por exemplo, você deseja USAR esse número, é bom seguir em frente. Além disso, até números maiores aumentam (ou seja 3, 4).


2

Perl 6 , 32 bytes

->\a,\b{(1,{[*] a xx$_}...*)[b]}

Experimente online!

(1, { [*] a xx $_ } ... *)é uma sequência lenta que gera a torre de energia, cada elemento sendo a lista que consiste no primeiro parâmetro de entrada areplicado ( xx) um número de vezes igual ao elemento anterior ( $_), sendo essa lista reduzida com multiplicação ( [*]). A partir dessa sequência, simplesmente extraímos o b-ésimo elemento.


2

Cálculo lambda, 10-5

(usando codificação da Igreja e indeces De Bruijn )
λλ(1λ13)λ1

Explicação

Sem De Bruijn indeces λa,b.(b λc.ca)λc.c:

λa,b.                                                 define the anonymous function f(a,b)=
     (b                                                apply the following function b times
        λc.                                                    the anonymous function g(c)=
           ca)                 apply c to a because of church encoding this is equal to a^c
              λc.c                              the identity function, 1 in church encoding

Se você definir exp_a(x)=a^xeste programa, define a↑↑b=exp_a^b(1)onde ^bdenota a iteração da função.

Não tenho certeza se isso é permitido, porque caé tecnicamente equivalente a a^ccomo não é um verdadeiro built-in e apenas um efeito colateral da maneira como os números inteiros são codificados no cálculo lambda.


Hum, existe um intérprete para que eu possa tentar isso? Se não houver implementação de um idioma, não será possível usá-lo para resolver desafios aqui. Os idiomas são baseados em suas implementações aqui.
Erik the Outgolfer

1

Javascript: 116 caracteres

function t(i){y=i.split(' ');a=y[0];b=y[1];return+b&&p(a,t(a+' '+(b-1)))||1}function p(a,b){return+b&&a*p(a,b-1)||1}

t ('4 3') Saídas:

1.3407807929942597e+154

1

Python (111) (113) não *

r=lambda x,y:(x for _ in range(y));t=lambda x,y:reduce(lambda y,x:reduce(lambda x,y:sum(r(x,y)),r(x,y)),r(x,y),1)

6 *** 3 - 36k dígitos))

Upd: Tem que adicionar valor inicial, para ajustar t (X, 0) = 1


Impressionante, quanto tempo os 36k levaram?
precisa saber é o seguinte

1
9.375 segundos, incluindo impressão.
precisa saber é o seguinte

1

Haskell: 88-5 caracteres sem multiplicação, 59 caracteres com multiplicação

Sem multiplicação:

h x y=foldr(\x y->foldl(\x y->foldl(+)0(replicate x y))1(replicate y x))1(replicate y x)

Provavelmente existem maneiras de jogar um pouco de golfe.

Com multiplicação:

h x y=foldr(\x y->foldl(*)1(replicate y x))1(replicate y x)

E, finalmente, o programa não destruído:

mult x y = foldl (+) 0 (replicate x y)
expo x y = foldl (mult) 1 (replicate y x)
h x y = foldr (expo) 1 (replicate y x)

Essa é provavelmente a maneira mais simples de resolver esse problema, que é definir multiplicação como adição repetida, exponenciação como multiplicação repetida e tetração como exponenciação repetida.


1

Raquete 58 (não *)

(define(t x y)(if(= y 0)1(for/product([i(t x(- y 1))])x)))

para / product está seguindo uma linha tênue com a regra "sem multiplicação", haha.
MrZander

1

Lisp comum, 85 caracteres

(lambda(b c)(let((r b)u)(dotimes(c c r)(setf u 1 r(dotimes(c b u)(setf u(* u r)))))))

Tentei fazer as multiplicações através da adição repetida, mas eram mais de 5 caracteres. A mesma coisa com macroletes, as declarações não valeram os ganhos.

Outra solução, inspirada na solução python de boothby. É 1 caractere menor que a solução acima.

(lambda(a b)(eval`(*,@(loop for x below b nconc(loop for x below a nconc`(,a,a))))))

1

Python 3-68

(incluindo a penalidade de 10 pontos para o operador de energia)

a,b=input().split()
r=1
exec("r=%s**r;"%a*int(b))
print(r)


1

R , 71 - 5 = 66 bytes

function(x,y,b=x){for(i in 2:y)b=cumprod(z<-rep(x,b))[sum(z|1)];cat(b)}

Experimente online!

-5 por evitar *, o que foi mais difícil do que eu esperava. Explode muito rápido e não funciona (a menos que tenha mais memória), mas atende a todos os critérios necessários.

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.