使用xkcd的公式来近似世界人口


42

XKCD 1047,兰德尔罗列出“稍微错”什锦数量和数字的具有不同精确度和复杂度的近似,诸如升的在一加仑的数量非常接近3 + π / 4。在漫画的中间,他进行了一段间歇:一种根据给定年份估算世界(和美国)人口的方法。

世界和美国人口公式,如下所述
(摘自xkcd: Randall Munroe的近似值

您的任务是编写一个实现这些公式的程序,以近似当前的世界和美国人口,方法如下。

世界人口

  1. 取当年的最后两位数字。
  2. 减去自2005年卡特里娜飓风以来的of年数(包括当年)。为此,任何可被4整除的年份都被视为a年。
  3. 在两个数字之间添加一个小数点(与除以10相同)。
  4. 加6。这使数十亿人受益。

美国人口

  1. 取当年的最后两位数字。
  2. 减10。
  3. 乘以3。
  4. 加10。
  5. 开头加3(对于此挑战,某些数字将为负,因此加300)。不知何故,我没有注意到仅连接是行不通的,因为我用来生成结果的程序仅增加了300。
  6. 这使成千上万人受益。

细节

这个公式“应该保持十年或两年不变”,但是从理论上讲,您必须能够处理任何2000年至2039年(含)。在某些情况下,自卡特里娜飓风以来的the年将为负值或零值。

您可以自由地以任何方式简化公式,只要所有输出与下面的输出匹配即可。

对于年份,请根据计算机的时钟使用年份。它必须在明年和本世纪的任何其他年份工作,因此您不能简单地对2015年进行硬编码。为方便起见,您可能希望包括一种将年份指定为变量或输入以测试其他年份的方法。

输出应为近似的世界人口(十亿人),后跟一些定界符(例如空格或逗号),然后是美国人口(以百万计)。您也可以编写一个返回或打印字符串或数字或字符串数​​组的函数。

这是代码高尔夫,因此以字节为单位的最短代码获胜。Tiebreaker是最早的帖子。

测试用例

这是所有可能年份的列表,其后是两个输出。

Year   World  U.S.
2000    6.1   280
2001    6.2   283
2002    6.3   286
2003    6.4   289
2004    6.4   292
2005    6.5   295
2006    6.6   298
2007    6.7   301
2008    6.7   304
2009    6.8   307
2010    6.9   310
2011    7     313
2012    7     316
2013    7.1   319
2014    7.2   322
2015    7.3   325
2016    7.3   328
2017    7.4   331
2018    7.5   334
2019    7.6   337
2020    7.6   340
2021    7.7   343
2022    7.8   346
2023    7.9   349
2024    7.9   352
2025    8     355
2026    8.1   358
2027    8.2   361
2028    8.2   364
2029    8.3   367
2030    8.4   370
2031    8.5   373
2032    8.5   376
2033    8.6   379
2034    8.7   382
2035    8.8   385
2036    8.8   388
2037    8.9   391
2038    9     394
2039    9.1   397

1
您需要四舍五入吗?
蓝色

5
@muddyfish我不确定我是否理解。如果您完全按照漫画中的说明进行操作,那么从技术上讲,没有任何划分,但是世界人口应该四舍五入到最接近的十分之一。
NinjaBearMonkey

2
我对美国人口感到困惑。如果要连接一个3,不应该2040填充个310040 - 10 = 3030 * 3 = 9090 + 10 = 100,这将使"3" + "100" = 3100
科尔

2
@Cole好点,我会做到的,所以您只需要支持到2039年的年份。关于年份的硬编码,我不想允许硬编码,因为即使支持日期的语言几乎总是会比较短。
NinjaBearMonkey 2015年

8
@NinjaBearMonkey我建议您将“加3,思考级联”的描述更改为文字“加300”,以涵盖当前一个结果不是一个很好的2位正数时发生的所有边缘情况。(例如,2000年280的结果为-20+300=280和而不是3 . -20= "3-20"
PhiNotPi

Answers:


22

Pyth,21 20字节

丹尼斯-1字节

c/J-*3.d3C\ᙹ4T+33J

这些具有相同的字节数,但仅使用ASCII:

c/J%*3.d3 523 4T+33J
c/-J%*3.d3*44T33 4TJ

我不知道Pyth,所以还是大概可能golfable。使用相同的算法:

TI-BASIC,23个字节

max(3getDate-5753
{.1int(Ans/4),Ans+33

getDate{YYYY,MM,DD}根据日期格式设置(TI-84没有真正的int数据类型)以某种顺序返回三个浮点的列表;的max(将是今年。在内部进行乘法和减法会max(保存一个封闭的括号。


1
我认为这是我第一次在这里看到TI-BASIC答案。–
The_Basset_Hound

7
@The_Basset_Hound TI-BASIC是第28种最常见的语言,有140个答案;它也赢得了一个重大的一个 几个 问题
lirtosiast

16

Javascript(ES6),55 54 48字节

-~((n=Date().substr(13,2)*3+280)/4-9.1)/10+' '+n

在Firefox 33中可以使用;理论上支持2000年到2099年的所有年份。如果不允许将结果转储到控制台的程序,请使用以下51字节函数:

(n=Date().substr(13,2)*3+280)=>-~(n/4-9.1)/10+' '+n

完整程序,55字节:

n=Date().substr(13,2)*3+280,alert(-~(n/4-9.1)/10+' '+n)

获得年份非常昂贵,但是在使用不推荐使用getYear()而不是之前getFullYear(),等式中的所有数字都变得更小,节省了大量字节。 编辑:多亏了一个eeevil把戏,我跳过newgetYear()干脆。>:D

建议欢迎!


10

Pyth,30个字节

.R+*.075J%.d3C\d6.105 1+*3J280

我的第一个Pyth程序!

感谢@Jakube的一些提示(我永远都不会想到这些!)


3
尚未阅读问题,但是我立即看到了一些优化。将所有内容写在一行上。选择数字和变量(一个不同的排序+*3Z280,而不是+*Z3 280为实例)。C\d而不是100(节省空格)。使用J代替Z(保存=)。内联作业。链接
Jakube 2015年

10

Python 2,80个字节

from datetime import*
y=date.today().year%40
print int(61.55+.75*y)/10.,y*3+280

现在回合!


正如OP一分钟前澄清的那样,您必须四舍五入。;-)
mınxomaτ

3
year%100与year%40相同。
lirtosiast


5

Python 3,134个字节

效果很好,但似乎有点长

from datetime import*
y=str(date.today().year)
z=int(y[2:])
m=str(60+(z-int((int(y)-2005)/4)))
print("%s.%s"%(m[0],m[1]),310+(z-10)*3)

为了缩短这一点,使用from time import*y=strftime('%Y')。或复制其他python答案:P
FlipTack

5

AutoIt- 60 58 56字节

$_=@YEAR-2e3
ClipPut(($_-Int($_/4-1))/10+6&' 3'&3*$_-20)

舍入会消耗字节(不再可用)。我现在已经调整了两个公式。一些样本输出:

7.3 325 // 2015
7.3 328
7.4 331
7.5 334 // 2018
8.4 370 // 2030

他们似乎都是准确的。

提示:执行顺序将字节保存在括号中。例如:(a-4)/4 = a/4-1:-)。


4

PowerShell,53 45字节

$n=date -f yy;.1*[int](61.45+.75*$n);280+3*$n

使用与泥泞鱼的Python 2答案类似的取整技巧来简化世界人口的计算,因为Round()从a [double]转换为时PowerShell会隐式地将s [int]而不是截断。

对于输出,我们假设“后跟一些定界符(例如空格或逗号)”也可以表示“换行符”,因此我们先执行一个结果,然后执行第二个结果。PowerShell隐式写出结果,因此我们不需要显式调用任何打印命令。


3

Mathematica,50个字节

n=Today["YearShort"];{.1*(61+n-Floor[n/4]),280+3n}

请注意,由于依赖于,因此依赖于版本号为10+(2014年发布)的Wolfram引擎DateObjects

R,64字节

n=as.numeric(format(Sys.time(),"%y"))
c(.1*(61+n-n%/%4),280+3*n)

直接移植Mathematica代码,认为我有一个较短的解决方案,但取决于软件包,而这适用于基数R。


1
(1/10)-> .1
lirtosiast

1
我认为您也不需要括号.1
lirtosiast

3

Java中,180个 177 166 152 143字节

感谢Thomas帮助菜鸟出手:)

class D{public static void main(String[]a){int f=java.time.LocalDate.now().getYear();System.out.printf("%.1f %d\n",(3.*f-5755)/40,3*f-5720);}}

非高尔夫版本:

class D {
  public static void main(String[]a) {
    int f = java.time.LocalDate.now().getYear();
    System.out.printf("%.1f %d\n",(3.*f-5755)/40,3*f-5720);
  }
}

需要Java 8。


import java.time.*3.0-> 3.?您也不需要用输出打印年份。
lirtosiast

哦,我没有意识到您不需要打印年份...:P
意大利面条2015年

3

JavaScript(ES6)52

一个将输出作为数组返回的函数。

(y=(new Date).getYear())=>[(y+~(y/4)-13)/10,y*3-20]

仅出于测试目的,该函数接受等于当年1900的输入(例如2015的105)

这与ETHproductions的答案一致(数学就是数学),但是回避了邪恶的把戏,它在不同的语言环境中更易于移植。而且它的功能是短1个字节。

测试代码段:

f=(y=(new Date).getYear())=>[(y+~(y/4)-13)/10,y*3-20]

o=[];
for(a=2000;a<2050;a++)o.push(`<td>${a}</td><td>${f(a-1900)}</td>`);
document.write(`<table><tr>${o.join`</tr><tr>`}</tr></table>`)
td { text-align:right; font-family:monospace }


2

Ruby,57个字节

y=Time.now.year%40;puts "#{6+(y-(y-5)/4)*0.1} #{3*y+280}"

不幸的是,Time.now.year确实要花一些字符。


2

Desmos,140字节

我正在将换行符计数为一个新方程式的信号。链接上的文件夹仅用于组织。

高尔夫球,140字节

add slider在提示时单击。

a=6+.1b-.1c
d=280+3b
c=\sum_{n=2005}^q\left\{0=\operatorname{mod}\left(n,4\right),0\right\}
b=100\left|\operatorname{floor}\left(.01q\right)-.01q\right|

Ungolfed,261字节

p_{world}=6+\frac{l_{astdig}-l_{eap}}{10}
p_{us}=310+3\left(l_{astdig}-10\right)
y_{ear}=2039
l_{eap}=\sum _{n=2005}^{y_{ear}}\left\{0=\operatorname{mod}\left(n,4\right),0\right\}
l_{astdig}=100\left|\operatorname{floor}\left(\frac{y_{ear}}{100}\right)-\frac{y_{ear}}{100}\right|

2

Glava,77个字节

i|f=java.time.LocalDate.now().getYear();F("%.1f %d\n",(3.*f-5755)/40,3*f-5720

我的Java答案的翻译。


1

PHP,45字节

编码:

echo(int)(($x=3*date(y)+247)/4)*.1," ",$x+33;

因为y(的参数date())是未定义的常量,所以PHP会触发一个通知(可以将其静音)并将其转换为字符串(根据需要);此PHP礼节允许节省2个字节。

为了消除通知,需要使用error_reporting=0runtime指令运行程序,如下所示:

$ php -d error_reporting=0 -r 'echo(int)(($x=3*date(y)+247)/4)*.1," ",$x+33;'
7.3 325

供测试用

通过更换调用date(y)$argv[1](第一个命令行参数),1个字节的节目长度增加,但是它可以通过命令行获得一年。

预期的参数是年份减去2000;它也适用于负值(2000年之前的年份)或大于40的值(2040年之后)。

$ php -r 'echo(int)(($x=3*$argv[1]+247)/4)*.1," ",$x+33;' 00
6.1 280

$ php -r 'echo(int)(($x=3*$argv[1]+247)/4)*.1," ",$x+33;' 01
6.2 283

$ php -r 'echo(int)(($x=3*$argv[1]+247)/4)*.1," ",$x+33;' 02
6.3 286

$ php -r 'echo(int)(($x=3*$argv[1]+247)/4)*.1," ",$x+33;' 03
6.4 289

$ php -r 'echo(int)(($x=3*$argv[1]+247)/4)*.1," ",$x+33;' 04
6.4 292

$ php -r 'echo(int)(($x=3*$argv[1]+247)/4)*.1," ",$x+33;' 15
7.3 325

$ php -r 'echo(int)(($x=3*$argv[1]+247)/4)*.1," ",$x+33;' 39
9.1 397

1

APL, 25 23 29个字节

{(10÷⍨⌊⍵÷4),⍵+33}⊃¯5753+3×⎕TS

TryAPL

是的,它是29 个字节


保存2个字符:(÷∘40,+∘33)5753个+ 3×⊃⎕TS
亚当
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.