大きな数字:超階乗


25

この質問は修正されました。もう一度お読みください。

Ultrafactorials

超階乗は、次の関数を使用して生成できる一連の数値です。

a(n) = n! ^ n!

結果の値は非常に急速に上昇します。 サイドノート:これは、OEISのエントリA046882です。ハイパーファクターも関連しています。これはまだ非常に巨大ですが、少し小さいシーケンスです:A002109

あなたのタスク

あなたの仕事は、これらの数字をあなたの言語に実装することです。プログラムは、すべての超階乗合計を 0から包括的に計算します nます。

入力

プログラムは、入力に1つだけ入力できます。これは、合計に追加される最後の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 16

3
多くの人が答えた後にルールを変更することも、良いことではありません。チャレンジを送信する場合は、アドバイスに従ってSandboxを使用してください。
flawr 16

回答:




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)

ベクトル化は素晴らしい

編集: @MickyTのおかげで4バイト保存


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:階乗を2回計算し、
  • [**] ...:2つの同一階乗を累乗します。
  • [+] ...:次に、ループのすべての結果を合計します。

1バイトのb2gillsに感謝します。


([*] …)[*](…)バイトを保存するように書くことができます
ブラッドギルバートb2gills

3

チェダー44 37バイト

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

演算子を減らすためにヤギに感謝します!階乗を追加するのは良い考えだと思います

オンラインで試す

非ゴルフ

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 OK。修正済み:P
Downgoat

2
ハハ、良い、おそらくここで最近見た数少ないヤギの合法的な使用法の1つです:)
flawr


3

PHP、49バイト

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

INF以下のためのn>564ビットシステム上で。

多数の場合、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}

off-by-oneバグ修正のために2文字を追加しました(後で注入呼び出しの短縮を検討します)。


私はRubyが苦手ですが、a=(0..i)代わりにこれを修正できませんでしたa=(1..i)か?
ティムテック16

@Timtech乗算にゼロを注入しても、何の効果もありません。(
DepressedDaniel

そうです、追加すること+1が最善の解決策だと思います。
ティムテック16

@GB n = 0の場合に適用される些細な修正。
DepressedDaniel


2

ハスケル、 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 16

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にはSB2バイトしかないため、階乗が組み込まれていません!


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

リストの理解度を合計してみましたか?
ライキング

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値として渡すと同時に初期化する方法は非常に巧妙です。
DepressedDaniel

->n{((t=s=1)..n).map{|i|t+=(s*=i)**s};t}またはもう1つのキャラクターをゴルフすることができます->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
ビルトインの階乗またはべき乗は使用できません。
ダウンゴート16


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)))

ゴルフをしていない:

#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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.