你的目标:估计圆周率至少小数点10位。格式是您的选择-它可以输出为一个数字,作为一个字符串,作为一个输出到STDOUT,等等。
看起来很简单,对吧?但等等,事情并不像看上去那么简单.
规则:您完全可以得到10个函数调用(这包括操作符)。这些函数不能是自然诱导或定义pi的函数,例如弧形trig函数或将度转换为弧度的函数(这还包括任何作为“求解器”运行的函数,例如可以找到sin(x)根的函数)。如果您的语言具有复数功能,则无法使用此功能。所有函数都必须是语言内置函数的一部分,或者在标准库中(加载库不算操作,但它必须是标准库,而不仅仅是流行的库)。
所有函数调用都必须是代码的关键--这意味着您不能使用除法或除法。您也不能使用任何文字(除了三个数字的形式为一个、两个或三个整数)*,读取任何类型的文件,或代码将自身转换为值的能力(例如,将变量的名称作为字符串的函数)。
*注意:对于需要输出格式字符串的语言,格式字符串是一个例外。但是,在格式字符串中只能找到格式,而不是实际的内容,因此可以使用printf("%f%f",x,y),而不能使用printf("%f.%f",x,y)。
循环可能会被使用,但是会消耗掉你的函数调用--10个函数调用是调用,而不是使用的全部函数。赋值不算作操作,但数组切片(包括从数组中获取单个值)等操作计数,在这种情况下,1将计算为两个字节(对于[])。
如果你认为你发现了规则的漏洞,那么它也违反了规则。这不是寻找规则最佳弯曲的挑战,也不是在质疑问题中滥用小疏忽的最佳方式.如果你的本能是把它称为“漏洞”,那就把它作为一个评论来帮助关闭它。
得分:这是代码保龄球,所以你在追求最高的分数。但计算的并不是代码中的总字节数。
相反,它是使用的函数中的字节之和。也就是说,如果您使用4*cos(2/3) (碰巧约为3.14355),那么您就有三个函数-- *、cos和/,总共是5个字节。例如,如果要使用(使用朱莉娅)、sum(map(n->1/n,1:4)),则操作为sum、map、/和:,长度为8字节.但是,由于1/n被调用了四次,它使用了7个函数调用(sum、map、4个/实例和:)。用户创建的函数不计算函数调用允许数或字节计数(注意:在这些用户创建的函数中使用的函数确实计数)。
附加强调:这里的重点是在计算pi的上下文中找到滥用语言最长内置/标准函数名的最佳方法。更多的数字圆周率是不必要的,但我个人将更有可能投票的答案,得到更多的数字超过必要。
请记住,由于您使用的是长函数名,所以您可能应该避免使用一元和二进制运算符,因为这些运算符中的大多数都具有完全的等效函数(例如,在Julia中,*可以被prod替换)。
快速摘要:您有10个内置函数调用(包括操作符/子程序/等)。你必须估计π到小数点10位。对于整数文本,您可以总共使用3个字符(因此,您可以有1和36,或1,2,3,或328,但不能有22和49)。得分是内建函数名字节的计数(如果用户定义了名称,则不计数)。没有直接计算或使用pi的函数。没有复杂的数字。这不是寻找漏洞的挑战。
发布于 2015-07-23 15:06:47
正好有10个函数调用和3个数字文本。
using System;
using System.Linq;
namespace ConsoleApplication2
{
internal class Program
{
private static void Main(string[] args)
{
/*3:*/
int a = 3; //0 calls: 0
/*14->15:*/
int b = 14; //0 calls: 0 + 0 = 0
/*14:*/
int c = (b)++; //1 call: 0 + 1 = 1
/*926:*/
int d = 926; //0 calls: 1 + 0 = 1
/*53:*/
int e = (a*c) + (a*a); //3 calls: 1+3 = 4
//3*14 + 3*3 = 42+9 = 51
e++; //1 call: 4 + 1 = 5
e++; //1 call: 5 + 1 = 6
/*5:*/
char f = e.ToString().ToCharArray().First(); //3 call: 6 + 3 = 9
Console.WriteLine("{0}.{1}{2}{3}{4}{5}", a, c, b, d, e, f); //1 call: 9 + 1 = 10
}
}
}产出: 3.1415926535
发布于 2015-07-23 13:55:20
我认为这现在是正确的..。
#include <stdio.h>
#include <math.h>
main()
{
double pi= (double)22 / 7; /* 1 */
pi+=sin(pi); /* 1 + 3 bytes = 4 */
pi+=sin(pi); /* 1 + 3 bytes = 4 */
pi+=sin(pi); /* 1 + 3 bytes = 4 */
pi+=sin(pi); /* 1 + 3 bytes = 4 */
printf("%.10f", pi); /* 6 bytes = 6 */
return 0;
}发布于 2016-07-14 23:02:37
一定要喜欢那些冗长的内置名字!
((lambda() ; lambda is a Racket-defined function too, 6 bytes
(define-values (a b) (integer-sqrt/remainder 491)) ; 13 (define-values) + 22 (integer-sqrt/remainder) = 35 (on this line alone). a and b are 22 and 7 respectively
(define-values (q) (/ a b)) ; 13 (define-values) + 1 (/) = 14
(define-values (c) (+ (sin q) q)) ; 13 + 1 + 3 = 17
(+ (sin c) c) ; 1 + 3 = 4
)) ; total: 6 + 35 + 14 + 17 + 4 = 72有了球拍中in-exact数的精度,这实际上等于pi,因此(- pi (lambda...)输出0.0。
而且,我知道这是一个非常古老的挑战。但是与这个碗相比,目前所有的挑战答案都是可怕的,所以我不得不这样做。
https://codegolf.stackexchange.com/questions/53547
复制相似问题