Большие цифры: ультрафакториалы


25

Этот вопрос был переработан, пожалуйста, перечитайте его.

Ultrafactorials

Ультрафакториалы - это последовательность чисел, которые можно сгенерировать с помощью следующей функции:

a(n) = n! ^ n!

Результирующие значения растут очень быстро. Примечание: это запись A046882 в OEIS. Также связаны гиперфакториалы, все еще довольно огромная, но немного меньшая последовательность: A002109

Твое задание

Ваша задача - реализовать эти цифры на вашем языке. Ваша программа рассчитает сумму всех ультрафакториалов от 0 до включительно n .

вход

Ваша программа может принимать только один вход: число, которое напоминает последний a (n) ультрафакториал, добавляемый к сумме. Вход гарантированно будет положительным или 0.

Выход

Ваш вывод зависит только от вас, если где-то есть видимая сумма чисел.

правила

  • Вы можете принять все целые числа, следовательно, целочисленный ввод, и использовать целочисленные циклы подсчета для получения некоторых результатов.

Контрольные примеры

Input: -1
Output: Any kind of error (because -1! is undefined), or no handling at all

Input: 0
Output: 1

Input: 1
Output: 2

Input: 2
Output: 6

Input: 3
Output: 46662

Вызов

Это , поэтому выигрывает ответ с наименьшей длиной в байтах!


2
Нужно ли рассматривать произвольно большие целые числа? Или этого достаточно для обработки самого большого, который doubleподдерживает тип данных языка (например, )?
Луис Мендо

1
Преобразование в код и вывод зависит от вас, хотя вход будет целочисленным. @LuisMendo
devRicher

3
Изменение правил после того, как многие люди ответили, тоже не очень хорошая вещь. Пожалуйста, используйте Песочницу в соответствии с рекомендациями, если вы хотите отправить запрос.
Flawr

Ответы:




8

Желе, 6 байт

Попробуйте онлайн!

‘Ḷ!*`S // Main link: Argument n (integer)
‘      // Take n, increment by 1
 Ḷ     // Range from [0..n]
  !    // Calculates factorial for each [0..n]
   *`  // Raises each [0!..n!] to the power of itself
     S // Sum the resulting array

Существует атом приращения , поэтому R!*`S‘сохраняется байт (я пошел за ‘Ḷ!*`S).
Джонатан Аллан

1
Я на самом деле был в середине редактирования, прежде чем я увидел ваш комментарий: P
Xanderhall

Я тоже это видел, хорошая работа.
Джонатан Аллан

6

R - 34 30 байт

x=factorial(0:scan());sum(x^x)

векторизация это хорошо

редактирование: сохранено 4 байта благодаря @MickyT


1
Вы можете немного сократить его, переместив сканирование в факториалx=factorial(0:scan());sum(x^x)
MickyT

4

J, 15 12 байт

Сохранено 3 байта благодаря милям!

1#.i.^~@!@,]

объяснение

1#.i.^~@!@,]  input: y
          ,]  append y to list...
   i.         [0, y)
        !@    factorial each member
     ^~@      raise each to itself
1#.           perform summation

Контрольные примеры

   f =: 1#.i.^~@!@,]
   (,. f"0) i.4
0     1
1     2
2     6
3 46662
   (,. f"0) i.6
0           1
1           2
2           6
3       46662
4  1.33374e33
5 3.17504e249

   echo"1] _90]\":f 6x
190281878633201797429473437859705759836595323046380462211756876146775419721154680216391116
383660154937824558291984804764687140715927099993629348072943551413397410741069111169123658
220861477766905534108349401724389611558474171816216027733366046875815097164882588181826712
426524007417126023680300953790645455254723360874298622143752208989152655091222094594342956
890526202094068774356589887610542642450567071133028553816930267473112879050178461179814798
008667622200592591542432361632955904924276854403585221477449385731481108378608652069211835
448555831555820393949831627809528917004144455150642180845929102272754394116905511650997561
389917179995442329297103257850695109383021080317204810134810158543814178231002423431556657
737982683316707709406053569620116083909440177269311235173671447595521339849978144493268530
780365729831790064477684808893338190825461650933123545889305523546630119181308584140916288
912561260392366609493077363059677222110731132927863243720195975705161197786520981159422881
575250362836779593393897664990291828935858671453835924398316498051705698128484688847592380
831018330553151156822298060174230201841578757499203145955456593022852288527824268115043999
037373974753999860179933517198889966353093307592136928730661270863274130109304971274296438
682725017433937245229524959283895094220677649257613358344409711070780405579776000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000003175042373780336892901667920556557182493442088021222004926225128381629943118937129
098831435345716937405655305190657814877412786176000000000000000000000000000000000000000000
000000000000000000000000000000000000000000001333735776850284124449081472890438

1#.i.^~@!@,]сбривает еще несколько байтов.
миль

@ Майлз О, круто. Я не знал, 1#.выполняет суммирование. Если это еще не совет, обязательно добавьте его!
Конор О'Брайен

4

Perl 6 , 41 38 37 байт

{[+] ([**] [*](1..$_)xx 2 for 0..$_)}

{[+] ([**] ([*] 1..$_)xx 2 for 0..$_)}

{sum (($_**$_ with [*] 1..$_) for 0..$_)}

( Попробуйте онлайн. )

Объяснение:

  • for 0 .. $_: Для каждого целого числа от 0 до ввода,
  • [*](1 .. $_) xx 2: рассчитать факториал дважды,
  • [**] ...: и возвести в степень два идентичных факториала.
  • [+] ...: Затем суммируйте все результаты цикла.

Спасибо b2gills за 1 байт.


([*] …)можно записать как [*](…)сохранение байта
Брэд Гилберт b2gills

3

Чеддер , 44 37 байт

n->(0|>n=>(i,a=(1|>i)/(*))->a**a)/(+)

Спасибо козам за операторский! Я думаю, что было бы неплохо добавить факториал

Попробуйте онлайн

Ungolfed

n -> ( 0|>n => (i, a=(1|>i) / (*)) -> a ** a) / (+)

объяснение

Примечание: немного устаревший, исправит

n ->           // Input
( 0 |> n) =>   // Run below for each of [0, n]
    (              
      i,           // Input
      a =          // Let's keep n! in this variable `a`
         (1 |> i)  // Range from [1, n]
         / (*)     // Multiply all the items of that range
                   // `/` is reduce `(*)` is multiplication function
    ) ->
    a ** a         // A to the power of A
) / (+)        // Sum all results

Разве слава Богу не немного самонадеянно здесь? : D
flawr

@ flawr хорошо. Исправлено: P
Downgoat

2
Ха-ха, лучше, пожалуй, один из немногих законных способов использования козла, которые мы недавно видели здесь :)
flawr


3

PHP, 49 байт

for($f=1;$i<=$argv[1];$f*=++$i)$s+=$f**$f;echo$s;

INFдля n>5на 64-битной системе.

для больших чисел, 70 байт

while($i<=$argv[1])$s=gmp_add($s,gmp_pow($f=gmp_fac($i++),$f));echo$s;

требует PHP для компиляции с --with-gmp


3

Рубин, 64 66 байт

->n{(o=(1..n).map{|i|a=(1..i).inject(:*);a**a}.inject(:+))?o+1:1}

Добавлены два символа для исправления ошибки «один за другим» (позже мы рассмотрим сокращение вызовов инъекции).


Я не очень хорошо разбираюсь с Руби, но не мог бы ты это исправить a=(0..i)вместо a=(1..i)?
Timtech

@Timtech Ожидайте, что вставка нуля в умножение никому не поможет :(
DepressedDaniel

Да, я думаю, что добавление +1- лучшее решение.
Timtech

@GB Прикладное тривиальное исправление для случая n = 0.
ДепрессияДаниэль


2

Haskell, 67 56 байт

Обратите внимание, что это представление было сделано до того, как были удалены правила, запрещающие встроенные функции.

p=product
a n=sum[p[x|x<-[p[1..i]],_<-[1..x]]|i<-[0..n]]

Например:

*Main> a 0
1
*Main> a 1
2
*Main> a 2
6
*Main> a 3
46662
*Main> a 4
1333735776850284124449081472890438
*Main> a 5
3175042373780336892901667920556557182493442088021222004926225128381629943118937129098831435345716937405655305190657814877412786176000000000000000000000000000000000000000000000000000000000000000000000000000000000000001333735776850284124449081472890438

2

Python 2, 73 72 байта

import math
lambda n,f=math.factorial:sum(f(i)**f(i)for i in range(n+1))


2

R, 42 35 байт

Теперь, когда я правильно прочитал вопрос, я добавил сумму.

Это требует наличия библиотеки gmp (арифметики с множественной точностью). Это позволяет обрабатывать большие числа. В противном случае что-либо более 5 возвращается INF.

Это реализовано как безымянная функция, чтобы избежать того as.character, что потребуется для вывода в STDOUT черезcat

function(x)sum((i=gmp::factorialZ(0:x))^i)

Пример запуска

> f <- function(x)sum((i=gmp::factorialZ(0:x))^i)
> f(5)
Big Integer ('bigz') :
[1] 3175042373780336892901667920556557182493442088021222004926225128381629943118937129098831435345716937405655305190657814877412786176000000000000000000000000000000000000000000000000000000000000000000000000000000000000001333735776850284124449081472890438
> f(6)
Big Integer ('bigz') :
[1] 190281878633201797429473437859705759836595323046380462211756876146775419721154680216391116383660154937824558291984804764687140715927099993629348072943551413397410741069111169123658220861477766905534108349401724389611558474171816216027733366046875815097164882588181826712426524007417126023680300953790645455254723360874298622143752208989152655091222094594342956890526202094068774356589887610542642450567071133028553816930267473112879050178461179814798008667622200592591542432361632955904924276854403585221477449385731481108378608652069211835448555831555820393949831627809528917004144455150642180845929102272754394116905511650997561389917179995442329297103257850695109383021080317204810134810158543814178231002423431556657737982683316707709406053569620116083909440177269311235173671447595521339849978144493268530780365729831790064477684808893338190825461650933123545889305523546630119181308584140916288912561260392366609493077363059677222110731132927863243720195975705161197786520981159422881575250362836779593393897664990291828935858671453835924398316498051705698128484688847592380831018330553151156822298060174230201841578757499203145955456593022852288527824268115043999037373974753999860179933517198889966353093307592136928730661270863274130109304971274296438682725017433937245229524959283895094220677649257613358344409711070780405579776000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003175042373780336892901667920556557182493442088021222004926225128381629943118937129098831435345716937405655305190657814877412786176000000000000000000000000000000000000000000000000000000000000000000000000000000000000001333735776850284124449081472890438

f (9) работает довольно хорошо, но заполняет несколько страниц. Несколько сотен или около того и 2 017 528 цифр. f (10) убивает сеанс на моей машине.


Я думаю, что причина отличается от других ответов в том, что вы должны вернуть сумму от 0! ^ 0! в N! ^ N !. Но это легко исправить, изменив на factorialZ(0:x). Есть ли конкретная причина не использовать base::factorial()функцию?
JAD

1
@JarkoDubbeldam Спасибо за улов. Нужно читать вопросы лучше :). Я использую gmp::factorialZдля обработки больших чисел.
MickyT

2

JavaScript (ES7), 38 байт

f=(n,a=1,i=0)=>i>n?0:a**a+f(n,a*++i,i)

@ fəˈnɛtɪk Извините, сила привычки.
Нил

1

Пайк, 11 байт

hFSBD]1*B)s

Попробуй это здесь!

hF          -  for i in range (0, input+1)
  SB        -     product(range(1, i+1)
    D]1*    -    [^]*^
        B   -   product(^)
          s - sum(^)

Забавный факт: Pyke не имеет встроенного факториала, потому что SBвсего 2 байта!


1

Haskell, 43 байта

b n|f<-product[1..n]=f^f
a n=sum$b<$>[0..n]

Пример использования: a 3-> 46662.

bвычисляет один ультрафакториал и aсуммирует все ультрафакториалы от 0до n.



1

Python 2, 82 байта

x=input()
s=0
for z in range(x):
 t=1
 for i in range(z+1):t*=i+1
 s+=t**t
print s

Вы пытались подвести итог понимания списка?
Riking

1
Вы использовали x только один раз, так что вы можете использовать range(input())это, чтобы удалить несколько байтов
Джордж

1

Чудо , 33 байта

@sum(->@^ f\prod rng1#0f)rng0+1#0

Использование:

(@sum(->@^ f\prod rng1#0f)rng0+1#0)3

объяснение

rng0+1#0

Создать инклюзивный диапазон от 0 до ввода.

->@^ f\prod rng1#0f

Сопоставьте диапазон с функцией, которая: 1) вычисляет факториал товара, 2) сохраняет результат fи 3) вычисляет f^f.

sum

Сумма.


1

TI-Basic, 13 байтов

sum(seq(A!^A!,A,0,Ans

PS Вы можете заменить sum(seq(на, Σ(если у вас более новая операционная система (без изменения размера).


1

Язык GameMaker, 97 байт

Основная функция (52 байта)

for(a=0;a<=argument0;a++)b+=power(f(a),f(a))return b

Функция f (45 байт)

a=argument0 if!a return 1else return a*f(a--)

1

Ruby 2, 41 байт

->n{(1..n).reduce(s=1){|t,i|t+(s*=i)**s}}

Потрясающе! Очень умный способ инициализации sпри передаче его в качестве начального tзначения для уменьшения / ввода.
ДепрессияДаниэль

Можно сыграть в гольф еще одного персонажа ->n{((t=s=1)..n).map{|i|t+=(s*=i)**s};t}или->n{t=s=1;(1..n).map{|i|t+=(s*=i)**s};t}
DepressedDaniel

1

Dyalog APL, 10 байт

(+/!*!)0,⍳

Как?

диапазон ввода

0, предшествует 0

!*! подать заявление x! ^ x!

+/ сумма


*и !являются скалярными функциями, поэтому используйте массивы: +/*⍨!0,⍳⎕или, (+/!*!)0,⍳если вы действительно хотите поезд.
Адам

0

Mathematica, 19 байт

Sum[a!^a!,{a,0,#}]&

Анонимная функция. Принимает число в качестве ввода и возвращает число в качестве вывода.


1
Мы не можем использовать встроенный факториал или возведение в степень.
Downgoat


0

C #, 79 байт с консольным выводом

n=>{int i=1,j=1;for(;i<=n;i++)j*=i;System.Console.Write(System.Math.Pow(j,j));}

C #, 64 байта в качестве возврата

n=>{int i=1,j=1;for(;i<=n;i++)j*=i;return System.Math.Pow(j,j);}

0

На самом деле 11 10 байт

1+r`!;ⁿ`MΣ

Как это работает

Program takes implicit input, implicit print at EOF
1+          Add one to the input n+1
  r         Create a range (0,1,..,n)
   `   `    Create a function between the two `
    !       Factorialize the current stack item
     ;      Duplicate the current stack item
      ⁿ     Power a,b from the current stack item
         M  Map the function across the stack top item
          Σ Sum the stack together

0

Ракетка 54 байта

(for/sum((i(+ 1 n)))(let((t(factorial i)))(expt t t)))

Ungolfed:

#lang racket
(require math)

(define (f n)
  (for/sum ((i (+ 1 n)))
    (let ((t (factorial i)))
      (expt t t))))

Тестирование:

(f -1)
(f 0)
(f 1)
(f 2)
(f 3)

Выход:

0
1
2
6
46662
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.