PowerShell、420バイト(ayyyyyyyy) 378バイト
param($n);[int[]]$p="03141592653589793238462643383279502884197169399375"-Split'';$a=@(0,3,4);for($i=3;$i-lt50;$i++){$a+=$a[$i-1]+$a[$i-2]};$c=[char[]]"00001010111010111010111011111010111110111010111011111011111010111110111";$b=@(0);for($i=4;$i-le70;$i++){if($c[$i]-eq'1'){$b+=$i}};[double]$r=$a[$n]/$b[$n];$q=$p[$n+1];$s="";(0..($q-1))|%{$s+="0"};([math]::Round($r,$q,[MidpointRounding]::AwayFromZero)).ToString("0.$s")
質問の丸め方を計算してくれた41バイトを節約してくれたisaacgに感謝します。恐ろしいものを含める[MidpointRounding]::AwayFromZero
必要がなく、明示的にキャストする必要がないことを意味します[double]
。
これはとても楽しかったです!
拡張:
# Take input N
param($n)
# First digits of pi, stored as integer array
[int[]]$p="03141592653589793238462643383279502884197169399375"-Split''
# Fibonacci sequence A(N)
$a=@(0,3,4)
for($i=3;$i-lt50;$i++){
$a+=$a[$i-1]+$a[$i-2]
}
# Zero-indexed bitmask for if the n-th integer is composite (1) or not (0)
$c=[char[]]"00001010111010111010111011111010111110111010111011111011111010111110111"
# Populate B(N) as an array using the $c mask
$b=@(0)
for($i=4;$i-le70;$i++){
if($c[$i]-eq'1'){
$b+=$i
}
}
# Calculation Time!
$r=(a($n))/$b[$n]
# A small golf, as $p[$n+1] gets used a couple times
$q=$p[$n+1]
# Need to generate a string of zeroes for padding
$s=""
(0..($q-1))|%{$s+="0"}
# Round the number, then send it to a string so we get the necessary number of zeroes
([math]::Round($r,$q)).ToString("0.$s")
PowerShellの再帰は...遅いのでA(N)
、別の方向を構築して配列に格納し、インデックスを作成する必要があります。
古い
また、聖なる牛、出力要件はこれを殺しましたか。PowerShellはデフォルトで、最も近いa / k / a銀行家の丸めに丸めます。これは、丸めスタイル[MidpointRounding]::AwayFromZero
を切り替えるために非常に冗長なものを使用する必要があります。さらに、後続のゼロがある場合は、それを埋め込む必要があります。これらの2つの要件がから行の最後のカップルを回すために組み合わせる20バイト [math]::Round($r,$q)
に102バイト(から$s=""
に+$s)
すごいです...)。
C(n)
数字を言うとき、末尾の0を含める必要がありますか?