Grandes números: Ultrafatoriais
Esta questão foi reformulada, por favor, leia-a novamente.
Ultrafatoriais
Os ultrafatoriais são uma sequência de números que pode ser gerada usando a seguinte função:
Os valores resultantes aumentam extremamente rapidamente. Nota lateral: Esta é a entrada A046882 no OEIS. Também estão relacionados os hiperfatoriais, uma sequência ainda bastante grande, mas um pouco menor: A002109
Sua tarefa é implementar esses números no seu idioma. Seu programa calculará a soma de todos os ultrafatoriais de 0 a inclusivo n .
Seu programa pode receber apenas uma entrada: um número, que se assemelha ao último a (n) ultrafatorial a ser adicionado à soma. A entrada é garantida como positiva ou 0.
Sua saída depende de você, desde que exista a soma visível dos números em algum lugar.
Você pode assumir todos os números inteiros, portanto, números inteiros e usar loops de contagem inteira para produzir alguns resultados.
Isso é código-golfe , então a resposta com o menor comprimento em bytes vence!
Precisamos considerar números inteiros arbitrariamente grandes? Ou é suficiente lidar com o maior que o tipo de dados padrão do idioma (como double) suporta?
A conversão em código e saída é com você, mas a Entrada será um número inteiro. @LuisMendo
Mudar as regras depois que muitas pessoas responderem também não é uma coisa boa a se fazer. Use o Sandbox conforme recomendado sempre que desejar enviar um desafio.
L!DmOtambém funciona se você deseja remover o bit "CP-1252 encoding".
Desculpas pelo código extremamente claro;)
Usando mathematica para mathematica - dick move: D
Há um átomo de incremento ', então R!*`S'salva um byte (eu fui para 'Ḷ!*`S).
Na verdade, eu estava no meio da edição antes de ver seu comentário: P
— Xanderhall 19/12/16
Eu também vi isso, bom trabalho.
vetorizar é legal
edit: salvou 4 bytes graças a @MickyT
você pode encurtou um pouco movendo você digitalizar para o factorialx=factorial(0:scan());sum(x^x)
Economizou 3 bytes graças a milhas!
1#.i.^~@!@,]raspa mais alguns bytes.
@miles Oh, legal. Eu não sabia que 1#.realiza soma. Se já não é uma dica, você deve definitivamente adicioná-la!
Perl 6 , 41 38 37 bytes
( Experimente online. )
for 0 .. $_: Para cada número inteiro de 0 à entrada,
[*](1 .. $_) xx 2: calcule o fatorial duas vezes,
[**] ...: e exponencia os dois fatoriais idênticos.
[+] ...: Soma todos os resultados do loop.
Graças ao b2gills por 1 byte.
([*] …)pode ser escrita como [*](…)salvar um byte
Queijo Cheddar , 44 37 bytes
Obrigado cabras para reduzir operador! Eu acho que seria uma boa ideia adicionar fatorial
Nota: Um pouco desatualizado, irá corrigir
Não é graças a Deus um pouco presunçoso aqui? : D
@flawr ok. Corrigido: P
Haha, melhor, talvez um dos poucos usos legítimos de cabra vimos por aqui recenly :)
MATL , 7 bytes
INF para n>5 em um sistema de 64 bits.
para números grandes, 70 bytes
requer que o PHP seja compilado com --with-gmp
Rubi, 64 66 bytes
Adicionados dois caracteres para a correção de bug off-by-one (analisará mais tarde as chamadas de injeção).
Eu não sou bom com Ruby, mas você não poderia consertar isso em a=(0..i)vez de a=(1..i)?
@Timtech Espere injeção de zero em uma multiplicação não faz bem a ninguém :(
Certo, acho que adicionar +1é a melhor solução.
— Timtech #
Correção trivial aplicada para caso n = 0.
Pitão - 9 8 bytes
Observe que esse envio foi feito antes da remoção das regras que baniam os componentes internos.
PARI / GP , 19 bytes
Estava prestes a postar isso. Ainda bem que verifiquei primeiro.
R, 42 bytes 35
Agora que li a pergunta corretamente, coloquei a soma.
Isso requer o gmp biblioteca (aritmética de precisão múltipla) esteja disponível. Isso permite que grandes números sejam manipulados. Caso contrário, qualquer coisa acima de 5 retornosINF .
Isso é implementado como uma função sem nome para evitar o as.characterque seria necessário para a saída para STDOUT atravéscat
O f (9) funciona muito bem, mas preenche várias páginas. Algumas centenas ou mais e 2.017.528 dígitos. f (10) mata a sessão na minha máquina.
Eu acho que a razão de ser diferente das outras respostas é porque você deve retornar a soma de 0! ^ 0! para N! ^ N !. Mas isso é fácil de alterar alterando para factorialZ(0:x). Existe um motivo específico para não usar a base::factorial()função?
— JD:
@JarkoDubbeldam Obrigado pela captura. Precisa ler melhor as perguntas :). Estou usando gmp::factorialZpara lidar com grandes números.
@ fəˈnɛtɪk Desculpe, força do hábito.
Curiosidade: Pyke não possui um fatorial embutido, pois SBpossui apenas 2 bytes!
Exemplo de uso: a 3-> 46662.
bcalcula um único ultrafatorial e asoma todos os ultrafatoriais de 0até n.
Você já tentou resumir uma lista de compreensão?
Você única x usado uma vez, então você poderia usar range(input())isso iria remover alguns bytes
Maravilha , 33 bytes
Crie um intervalo inclusivo de 0 a entrada.
Mapeie o intervalo com uma função que 1) calcula o fatorial do item, 2) armazena o resultado fe 3) calcula f^f.
PS Você pode substituir sum(seq(com Σ(se você tiver um sistema operacional mais recente (sem alteração de tamanho).
Idioma do GameMaker, 97 bytes
Função principal (52 bytes)
Função f (45 bytes)
Impressionante! Muito inteligente a maneira como inicializa sao mesmo tempo em que passa como o tvalor inicial para reduzir / injetar.
Pode ser golfed mais um personagem ->n{((t=s=1)..n).map{|i|t+=(s*=i)**s};t}ou->n{t=s=1;(1..n).map{|i|t+=(s*=i)**s};t}
⍳ faixa de entrada
0, precedido com 0
!*! Aplique x! ^ x!
+/ soma
*e !são funções escalares, então use matrizes: +/*⍨!0,⍳⎕ou (+/!*!)0,⍳se você realmente deseja um trem.