xkcd의 공식을 사용하여 세계 인구를 추정하십시오.


42

에서 XKCD 1047 , 이러한 갤런에서 리터의 수와 랜달 먼로 목록 다양한 정밀도와 복잡성 모듬 수량와 숫자의 "약간 잘못"근사는 매우 가까운 3 +에있다 π / 4 . 만화의 한가운데서, 그는 한 해 동안 세계 (미국) 인구를 추정 할 수있는 방법을 제공합니다.

아래에 설명 된 세계 및 미국 인구 공식
( xkcd 에서 자름 : 랜달 먼로의 근사치 )

당신의 임무는 다음과 같이 현재 세계와 미국 인구를 근사하기 위해 이러한 공식을 구현하는 프로그램을 작성하는 것입니다.

전세계 인구

  1. 현재 연도의 마지막 두 자리를 가져옵니다.
  2. 허리케인 카트리나 (2005) 이후 윤년 (현재 연도 포함) 수를 뺍니다 . 이를 위해 4로 나눌 수있는 연도는 윤년으로 간주됩니다.
  3. 두 숫자 사이에 소수점을 추가하십시오 (10으로 나누는 것과 동일).
  4. 추가 6. 수십억의 사람들이 결과를 얻습니다.

미국 인구

  1. 현재 연도의 마지막 두 자리를 가져옵니다.
  2. 빼기 10.
  3. 3을 곱하십시오.
  4. 10을 더하십시오.
  5. 시작 부분에 3을 더하십시오 (이 문제의 경우 일부 숫자는 음수이므로 대신 300을 더하십시오). 어떻게 든 결과를 생성하는 데 사용 된 프로그램이 방금 300을 추가했기 때문에 연결하는 것이 효과가 없다는 것을 알지 못했습니다.
  6. 이것은 수백만의 사람들에게 결과를 제공합니다.

세부

이 공식은 "10 년 또는 2 년 동안 최신 상태를 유지해야하지만"이론적으로 2000 년에서 2039 년까지 모든 것을 다룰 수 있어야합니다. 경우에 따라 카트리나 이후의 윤년은 음수 또는 0이됩니다.

모든 출력이 아래 출력과 일치하는 한 어떤 식 으로든 수식을 단순화 할 수 있습니다.

연도에는 컴퓨터 시계에 따라 연도를 사용하십시오. 내년과 올해의 다른 세기에도 작동해야하므로 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
숫자를 반올림해야합니까?
Blue

5
@muddyfish 이해가 잘 모르겠습니다. 만화의 지침을 정확히 따르면 기술적으로 분할이 없지만 세계 인구는 가장 가까운 10 분의 1로 반올림해야합니다.
NinjaBearMonkey

2
나는 미국 인구에 약간 혼란스러워합니다. 당신은을 연결하는 경우 3, 안 2040인구를 줄 3100? 40 - 10 = 30, 30 * 3 = 90, 90 + 10 = 100, 줄 것이다"3" + "100" = 3100

2
@Cole 좋은 지적, 나는 당신이 2039 년까지만 지원할 수 있도록 해줄 것입니다. 올해의 하드 코딩에 관해서는, 날짜를 지원하는 언어조차도 거의 항상 짧아지기 때문에 하드 코딩을 허용하고 싶지 않습니다.
NinjaBearMonkey

8
@NinjaBearMonkey 이전 결과가 좋은 2 자리 양수가 아닌 경우 발생하는 모든 엣지 사례를 포함하기 위해 "3을 추가하고 연결을 생각하는 것"에 대한 설명을 리터럴 "add 300"으로 변경하는 것이 좋습니다. (예를 들어 2000 년은 280의 결과로 -20+300=280, 그렇지 않음 3 . -20= "3-20")
PhiNotPi

답변:


22

Pyth, 21 20 바이트

Dennis의 -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 번째로 가장 많이 사용되는 언어입니다. 또한 원있어 하나 개의 중요한몇 가지 작은 질문 .
lirtosiast

16

자바 스크립트 (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
질문을 읽지 못했지만 다음은 내가 즉시 본 최적화입니다. 한 줄에 모든 것을 쓰십시오. 숫자와 변수의 다른 순서를 선택하십시오 ( 예 : +*3Z280대신 +*Z3 280). C\d대신 100(공간 절약). J대신 Z(을 저장 =) 대신 사용하십시오 . 과제를 인라인합니다. 링크
Jakube

10

파이썬 2, 80 바이트

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

이제 반올림!


1 분 전에 OP가 명확하게 설명했듯이 반올림해야합니다. ;-)
mınxomaτ

3
year % 100은 year % 40과 같습니다.
lirtosiast

6

CJam, 28 바이트

et0=100%__4/(-Ad/6+S@3*280+

온라인으로 사용해보십시오

현재 연도 이외의 연도를 시도하려면 et0=시작시의 문자 값을 연도의 리터럴 값으로 바꾸십시오 .


2
2000은 40으로 나눌 수 있고 2000-2039 만 있으면되므로 40%1 바이트를 절약 할 수 있습니다 .
Andrea Biondo

5

파이썬 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'). 또는 다른 파이썬 답변을 복사하십시오 : 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

muddyfish의 Python 2 답변 과 유사한 반올림 기법 을 사용하여 세계 인구 계산을 단순화합니다. PowerShell 은 자르기보다는 Round()에서에서 [double]로 캐스트 할 때 암시 적으로 사용 [int]되기 때문입니다.

출력의 경우 "구분 기호 (예 : 공백 또는 쉼표)" 가 "줄 바꿈"을 의미 할 수 있다고 가정 하므로 하나의 결과를 실행 한 다음 두 번째 결과를 실행합니다. PowerShell은 암시 적으로 결과를 작성하므로 인쇄 명령을 명시 적으로 호출 할 필요가 없습니다.


3

수학, 50 바이트

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

이는 버전 번호 10+ (2014 출시)의 Wolfram Engine을 사용하는 데 의존합니다 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

자바 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.? 또한 출력물로 연도를 인쇄 할 필요가 없습니다.
lirtosiast

오, 나는 당신이 한 해가 인쇄 될 필요가 없다는 것을 몰랐습니다 ... : P
스파게티

3

자바 스크립트 (ES6) 52

출력을 배열로 반환하는 함수입니다.

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

테스트 목적으로 만이 함수는 현재 연도 인 1900과 동일한 입력을받습니다 (예 : 2015 년 105).

그것은 ETH 프로덕션의 답변 (수학은 수학입니다)의 라인에 있지만 악의적 인 트릭을 피하는 것은 다른 지역에서보다 이식성이 뛰어납니다 . 그리고 함수로서 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

루비, 57 바이트

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

불행히도, Time.now.year실제로 일부 문자가 필요합니다.


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|

언 골프 드 , 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

글 라바, 77 바이트

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

내 자바 답변의 번역.


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

1

APL, 25 23 29 바이트

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

TryAPL

예, 29 바이트 입니다.


두 문자를 저장하십시오 : (÷ ∘40, + ∘33) ¯5753 + 3 × ⊃⎕TS
Adám
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.