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")
感谢isaacg节省了41个字节,用于计算问题如何舍入。意味着我不必包含可怕的内容[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 /一位银行家的四舍五入,这需要利用异常冗长的语言[MidpointRounding]::AwayFromZero
来切换四舍五入样式。最重要的是,我们需要填充尾随零(如果有的话)。这两个要求相结合,将最后几行从20字节 [math]::Round($r,$q)
变成102字节(从$s=""
到+$s)
)……哇。
C(n)
数字时,我们是否必须包含尾随0?