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 mesmay
vezes.- 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
*
é a multiplicação em alguns contextos, mas é também o simples looping operador:{block}N*
é equivalente a C-stylefor(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 de4***3
elementos sobrecarregará a RAM.x 0
=> 1. Minha solução original não lidou com esse caso.Respostas:
J, a pontuação é 7 (12 caracteres - 5 pontos para evitar a multiplicação)
+/@$/@$~/@$~
uso:
Apenas algumas dobras aninhadas:
*/@$~/@$~
^/@$~
onde$~
cria array,/
é uma função fold.fonte
pad
significa aqui? Desculpe, o inglês não é minha língua materna.@$~
em conjunto?/
, mas sim. você está apenas dobrando quantas vezes forem necessárias sobre a função de dobra aninhada.Haskell,
8785 - 5 == 8082Não utiliza exponenciação, multiplicação ou adição (!), Apenas lista operações. Demonstração:
...
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).
fonte
GolfScript,
1518 caracteresSim, 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.
fonte
"2 3" ~])*{[]+*{*}*}*
.;
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.ruby golfscript.rb my_script.gs
na 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, comecho 2 3 | ruby golfscript.rb my_script.gs
, seu programa faz trabalho como-determinado.)J,
161912 caracteresou como verbo (17 caracteres):
uso:
ou recebendo informações do teclado (
242720 caracteres):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 ao4 $ 2
que fornece uma lista de2
s com quatro itens2 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á2
multiplicado por si só tempo suficiente para ser equivalente a2^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 problemasEle sai com 17 caracteres (+/@$~/,@$~/1,~$~/
) que, mesmo com o bônus -5, é muito longo4 3
fonte
^/]$[
que cria a lista2 2 2 2
e 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.GolfScript (24 caracteres - 5 = 19 pontos)
é incrivelmente lento.
(ou 20 caracteres)
é muito mais rápido.
fonte
Python, 70
Isso usa
eval
chamadas 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.fonte
input()
ou usoeval(raw_input())
Felicidadesexec"eval('a*'*"*b+'1'+"+'1')"*b
Scala: 110
ungolfed:
explicação:
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:
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:
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:
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 é?
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 :)
invocação:
tempo de execução: 1ms.
fonte
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 tempoabaixo. Recebo pontos de bônus por não usar exponenciação, multiplicação ou adição mesmo?Isso funciona (testado) para
x 0
,0 x
,x 1
,1 x
,x 2
,2 3
, e2 4
. Eu tentei3 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.fonte
Python, 161 - 5 (sem * operador) = 156
invocar:
fonte
4***3
?!m
função porm=lambda x,y:sum(x for _ in r(y))
Perl, 61 caracteres
aqui está um bizarro
uso:
fonte
Mathematica ,
4033Isso 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.
Isso cria uma função de "tetração" quando é executada, mas os argumentos devem ser dados em ordem inversa. Exemplo:
fonte
Fold[g, 1, #2~Table~{#}] &[3, 4]
isso produzirá,g[g[g[1, 4], 4], 4]
por exemplo.m[Times]
produzFold[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,Plus
mas isso falha quase imediatamente.t[h_, n_] := Sum[h, {i, n}]
. Então corram[m@t][3, 4]
.Sum[h, n]
.)Haskell:
58.51 caracteres, com ou sem multiplicação.Ungolfed:
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
:fonte
Ruby
6659 caracteresfonte
1
) quando o segundo número de entrada é0
; em vez disso,e(x,0)
retorna o valor dex
.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.fonte
*
implementação, acredito que a profundidade da recursão seria muito grande para4 3
.C,
11710599 caracteresEDIT: Mesclou as duas funções
p
er
em 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 exemploEste não é um bug, eu esqueci que0 2
). Deve encontrar uma correção de custo mínimo.0 2
é indefinido.Lida com sucesso
4 3
e até fornece um resultado exato. No entanto, pode ser impreciso para alguns números menores.Imprime o número com um final
.000000
.fonte
Fator, 187 caracteres
Antes do golfe:
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
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.fonte
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.
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):
fonte
Ruby,
47 4645t=->x,n{r=x;2.upto(n){r=([x]*r).inject :*};r}
fonte
Lua: 133 caracteres, sem multiplicaçã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:
fonte
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
116 caracteres, sem operadores de energia, sem bônus de multiplicação (-5) = 111
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 seja3, 4
).fonte
Perl 6 , 32 bytes
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 entradaa
replicado (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 ob
-ésimo elemento.fonte
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
:Se você definir
exp_a(x)=a^x
este programa, definea↑↑b=exp_a^b(1)
onde^b
denota a iteração da função.Não tenho certeza se isso é permitido, porque
ca
é tecnicamente equivalente aa^c
como 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.fonte
Javascript: 116 caracteres
t ('4 3') Saídas:
fonte
Python
(111)(113) não *6 *** 3 - 36k dígitos))
Upd: Tem que adicionar valor inicial, para ajustar t (X, 0) = 1
fonte
Haskell: 88-5 caracteres sem multiplicação, 59 caracteres com multiplicação
Sem multiplicação:
Provavelmente existem maneiras de jogar um pouco de golfe.
Com multiplicação:
E, finalmente, o programa não destruído:
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.
fonte
Raquete 58 (não *)
fonte
Lisp comum, 85 caracteres
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.
fonte
Python 3-68
(incluindo a penalidade de 10 pontos para o operador de energia)
fonte
Yabasic , 71 bytes
Uma função que recebe entrada
a
eb
como uma sequência delimitada por espaço.Experimente online!
fonte
R , 71 - 5 = 66 bytes
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.
fonte