xkcdの式を使用して、世界の人口を概算します


42

XKCD 1047、例えばガロンにおけるリットルの数とランダルマンローリスト変化精度と複雑さと各種量と数字の「わずかに間違った」近似は、非常に近い3 +であるπ / 4。コミックの真ん中で、彼は休憩を与えます:特定の年に基づいて世界(および米国)の人口を推定する方法。

以下に説明する世界および米国の人口フォーミュラ
xkcdからの切り抜き:ランドールマンローによる近似

あなたの仕事は、これらの式を実装して現在の世界と米国の人口を概算するプログラムを作成し、次のように複製することです。

世界人口

  1. 現在の年の下2桁を取得します。
  2. ハリケーンカトリーナ(2005 年)以降のうるう年(現在の年を含む)の数を引きます。これらの目的のために、4で割り切れる年はうるう年と見なされます。
  3. 2つの数値の間に小数点を追加します(10で除算するのと同じです)。
  4. 6を追加します。これにより、数十億の結果が得られます。

米国の人口

  1. 現在の年の下2桁を取得します。
  2. 減算10。
  3. 3で乗算します。
  4. 追加10。
  5. 先頭に3を追加します(このチャレンジでは、一部の数値が負になるため、代わりに300を追加します)。どういうわけか、結果を生成するために使用したプログラムが300を追加しただけなので、連結だけでは機能しないことに気づきませんでした。
  6. これにより、数百万人の結果が得られます。

詳細

この式は「10年または2年の間最新の状態を維持する必要があります」が、2000〜2039年を含めて理論的に処理できる必要があります。場合によっては、カトリーナからのうるう年の値が負またはゼロになります。

すべての出力が以下のものと一致する限り、任意の方法で数式を単純化できます。

年については、コンピューターの時計に従って年を使用します。来年と今世紀の他の年に機能する必要があるため、単純に2015年をハードコードすることはできません。便宜上、他の年をテストする変数または入力として年を指定する方法を含めることができます。

出力は、およその世界人口(数十億人)、それに続く区切り文字(スペースまたはコンマなど)、米国人口(数百万人)の順になります。また、文字列または数値または文字列の配列を返すまたは印刷する関数を作成することもできます。

これはコードゴルフであるため、バイト単位の最短コードが優先されます。Tiebreakerは最も早い投稿です。

テストケース

これは、すべての可能な年のリストであり、2つの出力がそれに続きます。

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わかりません。コミックの指示に正確に従えば、技術的に分割は行われませんが、世界の人口は最も近い10分の1に丸められます。
NinjaBearMonkey

2
私は、米国の人口1に少し混乱しています。を連結している場合、の人口を与える3べきではありませんか?、、、与えることになる2040310040 - 10 = 3030 * 3 = 9090 + 10 = 100"3" + "100" = 3100
コール

2
@Cole良い点です。2039年までサポートするだけでよいので、1年のハードコーディングについては、ハードコーディングを許可しません。これは、ほとんどの場合、日付をサポートする言語でも短くなります。
NinjaBearMonkey

8
@NinjaBearMonkey「3の連結を追加する」の説明をリテラルの「300を追加する」に変更して、前の結果が2桁の正数でない場合に発生するすべてのエッジケースをカバーすることをお勧めします。(例えば、2000年には、与え280た結果として-20+300=280ではなく3 . -20= "3-20"
PhiNotPi

回答:


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を知らないので、おそらくゴルフができるかもしれません。同じアルゴリズムを使用する:

TI-BASIC、23バイト

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

getDate{YYYY,MM,DD}日付形式の設定に応じて、3つの浮動小数点数のリストを何らかの順序で返します(TI-84には真のintデータ型はありません)。max(年になります。内部で乗算と減算を行うと、max(親括弧が節約されます。


1
ここでTI-BASICの回答を見たのはこれが初めてだと思います
。...-The_Basset_Hound

7
@The_Basset_Hound TI-BASICは、ここで140 番目の回答数で28番目に最も一般的な言語です。それはまた勝っただ一つの大きなおよびいくつかの小さな問題を
リルトシアスト

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トリックのおかげで、私はスキップnewしてgetYear()完全に。>:D

提案を歓迎します!


10

Pyth、30バイト

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

私の最初のPythプログラム!

いくつかのヒントを@Jakubeに感謝します(私はそれらを考えたことがなかったでしょう!)


3
質問を読んでいないが、ここで私がすぐに見たいくつかの最適化があります。すべてを1行で書きます。(たとえば、+*3Z280代わりに+*Z3 280)数字と変数の異なる順序を選択します。C\d代わりに100(スペースを節約します)。のJ代わりに使用しますZ(保存します=)。割り当てをインライン化します。リンク
ジャクベ

10

Python 2、80バイト

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

今ラウンド!


OPが1分前に明らかにしたように、丸める必要があります。;-)
mınxomaτ

3
year%100はyear%40と同じです。
リルトシアスト


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

PowerShell は、切り捨てるのではなく、a からにキャストするときに暗黙的にsを実行するため、muddyfishのPython 2の回答と同様の丸め手法を使用して、世界人口の計算を簡素化しRound()ます。[double][int]

出力については、「区切り文字(スペースまたはコンマなど)が続く」も「改行」を意味すると想定しているため、1つの結果を実行してから2番目の結果を実行します。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
リルトシアスト

1
あなたも括弧を必要としないと思います.1
リルトシアスト

3

Java、180 177 166 152 143バイト

トーマスはヌーブを助けてくれてありがとう:)

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.?また、出力とともに年を印刷する必要もありません。
リトシアスト

ああ、私は...あなたがプリントアウト年を必要としませんでした実現しなかった:P
spaghetto

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

デスモス、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=0、次のようにランタイムディレクティブを使用してプログラムを実行する必要があります。

$ 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

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