値を計算します


16

チャレンジ

入力として整数与えられ、が値を出力する場合(はリーマンゼータ関数を表します)。ss1ζsζバツ

さらに詳しい情報

ζsは次のように定義されます:

ζs=n=11ns

回答を小数点以下5桁まで出力する必要があります(これ以上、それ以下)。答えが無限であることが判明した場合は、または同等の言語を出力する必要があります。

リーマンゼータのビルトインは許可されていますが、そのようにするのは面白くありません;)

出力は次のとおりでなければなりません

Input -> Output
1 -> ∞ or inf etc.
2 -> 1.64493
3 -> 1.20206
4 -> 1.08232
8 -> 1.00408
19 -> 1.00000

バウンティ

組み込みを許可するための慰めとして、組み込みのゼータ関数を使用しない最短回答に対する100人の報奨金を提供します。(緑色のチェックマークは、全体として最も短いソリューションに移動します)

勝ち

バイト単位の最短コードが優先されます。


7
この課題には、そのような可能性がありました...
ビルトイン

@HyperNeutrinoうん、ビルトインが許可されたチャレンジを見たので投稿しました。FGITW
NoOneIsHere

2
「小数点以下5桁の精度」は厳密ですか?(つまり、より正確に出力できますか?)そうでない場合、テストケースは実際に6dpを表示するはずです。
ジョナサンアラン

@JonathanAllen私はしましたが、丸めスペックアップクリア
ベータ崩壊

3
@BetaDecay(pingのないため息)は、19 実際にテキストを出力する入力1.00000ですか?有効ではない11.0、有効ですか?カメレオンに挑戦したようです。
ジョナサンアラン

回答:


11

Mathematica、9 7 11バイト

Zeta@#~N~6&

説明:

Zeta@#       (* Zeta performed on input *)
      ~N     (* Piped into the N function *)
        ~6   (* With 6 digits (5 decimals) *)
          &  (* Make into function *)

Mathematicaの結果

組み込みなし:

Mathematica、23 UTF-8バイト

Sum[1/n^#,{n,∞}]~N~6&

ケリー・ロウダーに感謝


3
N@*Zeta2バイト節約します。
マーティンエンダー

@*(左)合成作用素である:f@*gその値は引数で機能意味xですf[g[x]]
グレッグマーティン

@BetaDecay For 1を出力しComplexInfinity5場所に丸めます。(例1.64493
-NoOneIsHere

@MartinEnderどのように動作し*ますか?
-NoOneIsHere

1
@NoOneIsHere答えはを使用しますN~5が、説明はを使用し6ます。
numbermaniac

8

Javascript、81 70 66 65バイト

s=>s-1?new Int8Array(1e6).reduce((a,b,i)=>a+i**-s).toFixed(5):1/0

実行可能な例:

ζ=s=>s-1?new Int8Array(1e6).reduce((a,b,i)=>a+i**-s).toFixed(5):1/0

const values = [ 1, 2, 3, 4, 8, 19 ];
document.write('<pre>');
for(let s of values) {
  document.write('ζ(' + s + ') = ' + ζ(s) + '\n')
}


なぜそれをZと呼ぶのですか?ゼータ記号はJSで有効な関数名であり、ゴルフをする必要はありません。
ファンドモニカの訴訟

交換するArray(1e6).fill()[...Array(1e6)]、最初に取って代わる(s)s
コナー・オブライエン

1
@QPaysTaxes良い点!Unicode変数名ftw!
Frxstrem

@ ConorO'Brien Huh、私はその配列のトリックに気づきませんでした(スパース配列は反復しないと思っていましたが、間違っていたと思います)。ありがとう!
Frxstrem

@Frxstremζは2バイトを使用することに注意してください
CocoaBean

6

APL(Dyalog)22 21バイト

ビルマインなし -1 ngnに感謝します。

Dyalog APLには無限大がないため、アイバーソンの提案する表記法を使用します。

{1=⍵:'¯'5⍕+/÷⍵*⍨⍳!9}

オンラインでお試しください!

{ 匿名関数:

1=⍵: 引数が1の場合:

  '¯' マクロンを返します

 そうしないと

  !9 9の階乗(362880)

   最初に、多くの整数I ntegers

  ⍵*⍨ それらを議論の力に引き上げる

  ÷ 逆数

  +/ 和

  5⍕ 小数点以下5桁の形式

} [匿名関数の終わり]


1
1E6-> !9
ngn

@ngnありがとう。
アダム

5

C、74 70 69バイト

n;f(s){double z=n=0;for(;++n>0;)z+=pow(n,-s);printf("%.5f",z/=s!=1);}

でコンパイルし-fwrapvます。出力の生成には時間がかかります。

ここ動作することを確認してください。部品++n>0はに置き換えられ++n<999999ますので、待つ必要はありません。これにより、同一の機能と出力が維持されます。


DOESのfloat作品?
l4m2

5

TI-Basic、16バイト(組み込みなし)

Fix 5:Σ(X^~Ans,X,1,99

Ans = 2の正しい答えを得るには、実際に約150000まで行く必要があります。84Plus CEで計算するのに30分以上かかります。また、どこかで(Ans-1)^ 0を掛けて、Ans = 1、TI-Basicの無限大の最も近い表現のエラーを得ることができます!
pizzapants184

@ pizzapants184 2、3などに99回以上の反復が必要な場合があることを完全に承知しています。あなたは置き換えることによって、この機能を実現することが可能99E9^ 9 10を表す。すなわち、Eは科学的なEです。(または、明らかにE5のような小さなもの)。E99が一般に正の無限大に使用されることを理解すると、合計の上限がの場合、理論的にはこの機能が可能になりますE99。エミュレータは、物理的な計算機よりもはるかに高速にこれを提供できます。あなたの考えをありがとう:)
ティムテック

私はこれが無限を表示するものとは思わない。1を無限に追加しても、浮動小数点の不正確性のためにエラーはスローされません。
リルトシアスト

4

C(gcc)112 101 94 84バイト

ceilingcatからのゴルフのヒントをありがとう。

n;f(s){float r;for(n=98;n;r+=pow(n--,-s));printf("%.5f",r+pow(99,-s)*(.5+99./--s));}

オンラインでお試しください!


1
質問が編集されました。言語固有の無限大記号を出力できます。
2501

@ 2501私は以前の答えに戻りましたが、まだあなたのソリューションからかなり離れています。
cleblanc

@ceilingcat f(1)は正しくないようです。
cleblanc



2

MATL、21バイト

q?'%.5f'2e5:G_^sYD}YY

オンラインでお試しください!

説明

入力1は出力に対して特殊なケースですinfに対して。これにより、MATLは無限を表示します。

以外の入力の場合12e5小数点以下5桁の精度を達成するには、最初の項を合計するだけで十分です。その理由は、直接計算から、この項の数はinput 2で十分であり、指数が大きいほど系列のテールが小さくなるためです。

q         % Input (implicit) minus 1
?         % If non-zero
  '%.5f'  %   Push string: format specifier
  2e5:    %   Push [1 2 ... 2e5]
  G       %   Push input again
  _       %   Negate
  ^       %   Power. element-wise
  s       %   Sum of array
  YD      %   Format string with sprintf
}         % Else
YY        %   Push infinity
          % End (implicit)
          % Display (implicit)

2

R、54バイト

function(a){round(ifelse(a==1,Inf,sum((1:9^6)^-a)),5)}

合計を直接検索し、必要に応じてフォーマットしInfます。aが1の場合は出力し9^6ます。9^9同じ長さのコードでより正確になります。Rに適切な三項演算子があれば、これを短くすることができます。


1
function(a)round("if"(a-1,sum((1:9^6)^-a)),5)数バイト短くなります。
ジュゼッペ

はい。ただし、a = 1の場合はエラーがスローされ function(a)round("if"(a-1,sum((1:9^6)^-a),Inf),5)、元のソリューションよりもさらに短くなります。
マイケルルーゴ

はい、もちろんです!を含めるのを忘れてしまったのでInf、コメントボックスにコードを直接入力すると
ジュゼッペ

2

C、129130128バイト

#include<math.h>
f(s,n){double r=0;for(n=1;n<999;++n)r+=(n&1?1:-1)*pow(n,-s);s-1?printf("%.5f\n",r/(1-pow(2,1-s))):puts("oo");}

次の式を使用します

\ zeta(s)= \ frac {1} {1-2 ^ {1-s}} \ sum \ limits_ {n = 1} ^ {\ infty} {\ frac {(-1)^ {n + 1} } {n ^ s}}

テストと結果

main(){f(2,0);f(1,0);f(3,0);f(4,0);f(8,0);f(19,0);}

1.64493
+oo
1.20206
1.08232
1.00408
1.00000

なぜこの方程式ではなくΣ(1/(n^s))?それは...はるかに複雑なようだ
ベータ崩壊

@BetaDecayは、結果を見つけるのがより速く思えるからです。ここでは、1..999に合計sの範囲があり、 'Σ(1 /(n ^ s))'には、範囲1..10 ^ 6
RosLuP

1
そうですか。参考までに、単にoo大丈夫です。ポジティブと指定する必要はありません
ベータ崩壊


@ceilingcatこの質問に別のエントリを1つ書くことができます... math.hヘッダーなしでリンクしていないことをここで覚えているようです...
RosLuP

2

Python 3:67バイト(組み込みなし)

f=lambda a:"∞"if a<2else"%.5f"%sum([m**-a for m in range(1,10**6)])

特別なことはありません。暗黙のutf-8エンコーディングのためにPython 3のみを使用します。

テストケースでオンライン試してください




1

ゼリー、23 バイト

ȷ6Rİ*⁸S÷Ị¬$ær5;ḷỊ?”0ẋ4¤

オンラインでお試しください!

どうやって?

  • 最初の100万用語の合計
  • (ではなく)を生成する0タイミングで除算しますabs(input)<=1inf14.3927267228649891
  • 小数点以下5桁に丸めます
  • as abs(result)<=1をフォーマットする場合、4つのゼロを追加します1.01.00000
  • 結果を出力します

ȷ6Rİ*⁸S÷Ị¬$ær5;ḷỊ?”0ẋ4¤ - Main link: s
ȷ6                      - literal one million
  R                     - range: [1,2,...,1000000]
   İ                    - inverse (vectorises)
     ⁸                  - link's left argument, s
    *                   - exponentiate
      S                 - sum
          $             - last two links as a monad:
        Ị               -   insignificant? (absolute value of s less than or equal to 1?)
         ¬              -   not (0 when s=1, 1 when s>1)
       ÷                - divide (yielding inf when s=1, no effect when s>1)
           ær5          - round to 10^-5
                      ¤ - nilad followed by link(s) as a nilad:
                  ”0    -   literal '0'
                    ẋ4  -   repeated four times
                Ị?      - if insignificant (absolute value less than or equal to 1?)
              ;         -       concatenate the "0000" (which displays as "1.00000")
               ḷ        - else: left argument
                        - implicit print


0

ゼリー、26バイト

⁵*5İH+µŒṘḣ7
⁴!Rİ*³Sǵ’ݵ’?

このリンクでオンライン試さないでください!(これは16兆個から20兆個の用語を使用するため、TIOで実行するとMemoryErrorが生成されます)

代わりに、このリンクでオンライン試してください。(代わりに100万語を使用します。はるかに管理しやすいですが、もう1バイト必要です)

inf入力1を返します。

説明

⁵*5İH+µŒṘḣ7    - format the output number
⁵*5İH+         - add 0.000005
      µŒṘ      - get a string representation
         ḣ7    - trim after the fifth decimal.

⁴!Rİ*³Sǵ’ݵ’? - main link, input s
           µ’? - if input minus 1 is not 0...
⁴!R            -   [1,2,3,...,16!] provides enough terms.
   İ           -   take the inverse of each term
    *³         -   raise each term to the power of s
      S        -   sum all terms
       Ç       -   format with the above link
               - else:
        µ’İ    -   return the reciprocal of the input minus 1 (evaluates to inf)

26個のバイトのうち、7個は計算に使用され、12個は書式設定に使用され、7個はinfゼロでの生成に使用されます。このためには、より良いゴルフが必要です。


ȷ6百万の数値リテラルであり、要因の回避策を削除します。
ジョナサンアラン

0

MathGolf、14バイト(組み込みなし)

┴¿Å'∞{◄╒▬∩Σ░7<

TIOリンクで、私が置換していることを注意するためにプッシュされ、106 の代わりに 107。これは、ここで送信されたバージョンがすべてのテストケースでタイムアウトするためです。これにより、3と8の答えは小数点以下1桁ずれることになります。ただし、MathGolfには1バイトの数値リテラルがはるかに大きいため、任意の10進精度が可能です。

オンラインでお試しください!

説明

┴                check if equal to 1
 ¿               if/else (uses one of the next two characters/blocks in the code)
  Å              start block of length 2
   '∞            push single character "∞"
     {           start block or arbitrary length
      ◄          push 10000000
       ╒         range(1,n+1)
        ▬        pop a, b : push(b**a)
         ∩       pop a : push 1/a (implicit map)
          Σ      sum(list), digit sum(int)
           ░     convert to string (implicit map)
            7    push 7
             <   pop(a, b), push(a<b), slicing for lists/strings

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