विश्व की आबादी को अनुमानित करने के लिए xkcd के सूत्र का उपयोग करें


42

में xkcd 1047 , इस तरह है कि एक गैलन में लीटर की संख्या के रूप में रान्डेल मुनरो सूची "थोड़ा गलत" बदलती परिशुद्धता और जटिलता के साथ मिश्रित मात्रा और संख्या का अनुमान है, बहुत 3 + के करीब है π / 4 । कॉमिक के बीच में, वह एक मध्यांतर देता है: एक निश्चित वर्ष के लिए दुनिया (और संयुक्त राज्य) की आबादी का अनुमान लगाने का एक तरीका।

विश्व और अमेरिकी जनसंख्या सूत्र, नीचे वर्णित है
(Xkcd से क्रॉप : रान्डेल मुनरो द्वारा स्वीकृतियां)

आपका कार्य एक प्रोग्राम लिखना है जो वर्तमान विश्व और अमेरिका की आबादी को अनुमानित करने के लिए इन फ़ार्मुलों को लागू करता है, जिसे निम्नानुसार दोहराया जाता है।

दुनिया की आबादी

  1. वर्तमान वर्ष के अंतिम दो अंक लें।
  2. तूफान कैटरीना (2005) के बाद से ( वर्तमान वर्ष सहित) लीप वर्ष की संख्या घटाना । इन उद्देश्यों के लिए, 4 से विभाज्य किसी भी वर्ष को एक लीप वर्ष माना जाता है।
  3. दो संख्याओं के बीच एक दशमलव बिंदु जोड़ें (10 से विभाजित करने के समान)।
  4. जोड़ें 6. यह अरबों लोगों में परिणाम देता है।

अमेरिका की आबादी

  1. वर्तमान वर्ष के अंतिम दो अंक लें।
  2. घटाना १०।
  3. 3 से गुणा करें।
  4. 10 जोड़ें।
  5. शुरुआत में 3 जोड़ें (इस चुनौती के लिए, कुछ संख्याएं नकारात्मक होंगी, इसलिए इसके बजाय 300 जोड़ें)। किसी भी तरह मैंने नोटिस नहीं किया कि सिर्फ कॉनकैटेनिंग काम नहीं करेगा क्योंकि मैं जिस कार्यक्रम का उपयोग करता था, वह सिर्फ 300 जोड़े।
  6. यह लाखों लोगों में परिणाम देता है।

विवरण

यह सूत्र "एक या दो दशक तक चालू रहना चाहिए," लेकिन आपको सैद्धांतिक रूप से किसी भी वर्ष 2000-2020 को शामिल करने में सक्षम होना चाहिए। कुछ मामलों के लिए, कैटरीना के बाद से लीप वर्ष नकारात्मक या शून्य मान होगा।

आप किसी भी तरह से सूत्र को सरल बनाने के लिए स्वतंत्र हैं, जब तक कि सभी आउटपुट नीचे वाले से मेल खाते हैं।

वर्ष के लिए, कंप्यूटर की घड़ी के अनुसार वर्ष का उपयोग करें। यह अगले वर्ष और किसी भी अन्य वर्ष इस सदी में काम करना चाहिए, इसलिए आप केवल 2015 तक हार्डकोड नहीं कर सकते हैं। सुविधा के लिए, आप अन्य वर्षों का परीक्षण करने के लिए वर्ष को चर या इनपुट के रूप में निर्दिष्ट करने का एक तरीका शामिल करना चाह सकते हैं।

आउटपुट अनुमानित दुनिया की आबादी (अरबों लोगों में) होनी चाहिए, उसके बाद कुछ सीमांकक (जैसे अंतरिक्ष या अल्पविराम), इसके बाद अमेरिकी आबादी (लाखों लोगों में) होगी। आप एक फ़ंक्शन भी लिख सकते हैं जो एक स्ट्रिंग या संख्याओं या स्ट्रिंग्स की रिटर्न या प्रिंट करता है।

यह कोड गोल्फ है, इसलिए बाइट्स जीत में सबसे छोटा कोड है। टाईब्रेकर जल्द से जल्द पोस्ट है।

परीक्षण के मामलों

यह सभी संभावित वर्षों की सूची है, जिसके बाद दो आउटपुट हैं।

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
@ मुडीफ़िश मुझे यकीन नहीं है कि मैं समझ गया हूँ। यदि आप कॉमिक में दिए गए निर्देशों का ठीक से पालन करते हैं, तो तकनीकी रूप से कोई विभाजन नहीं हो सकता है, लेकिन दुनिया की आबादी को निकटतम दसवें तक पहुंचाया जाना चाहिए।
निन्जाबियरमॉन्की

2
मैं संयुक्त राज्य अमेरिका की आबादी से थोड़ा भ्रमित हूं। यदि आप एक समवर्ती कर रहे हैं 3, की 2040आबादी नहीं देनी चाहिए 3100? 40 - 10 = 30, 30 * 3 = 90, 90 + 10 = 100, देना होगा जो"3" + "100" = 3100
कोल

2
@ अच्छा बिंदु, मैं इसे बनाऊंगा ताकि आपको केवल 2039 के माध्यम से वर्षों का समर्थन करना पड़े। वर्ष को हार्डकोड करने के बारे में, मैं हार्डकोडिंग की अनुमति नहीं देना चाहता हूं क्योंकि यह लगभग हमेशा छोटी भाषाओं में भी होगा जो समर्थन तिथियां करते हैं।
निनजाबियरनॉकी

8
@NinjaBearMonkey मैं सुझाव देता हूं कि आप "3 जोड़कर, सोच समझकर" के वर्णन को बदल दें, जब कि पिछले परिणाम एक अच्छा 2-अंकीय धनात्मक संख्या नहीं है, तब होने वाले सभी किनारे मामलों को कवर करने के लिए एक शाब्दिक "300 जोड़ें"। (उदाहरण के लिए, वर्ष 2000 और नहीं के 280परिणाम के रूप में देता है )-20+300=2803 . -20= "3-20"
PhiNotPi

जवाबों:


22

पायथ, 21 20 बाइट्स

डेनिस द्वारा -1 बाइट

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

ये एक ही बाइट काउंट हैं, लेकिन ASCII-only हैं:

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

मैं Pyth पता नहीं है, तो अभी भी शायद संभवतः golfable। समान एल्गोरिथ्म का उपयोग करना:

टीआई-बेसिक, 23 बाइट्स

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

getDate{YYYY,MM,DD}दिनांक प्रारूप सेटिंग के आधार पर किसी क्रम में तीन फ़्लोट्स की एक सूची देता है (TI-84s में सही इंटैटाइपाइप नहीं है); max(साल हो जाएगा। गुणा और घटाना max(एक करीबी परन को बचाता है।


1
मुझे लगता है कि यह पहली बार है जब मैंने यहां TI-BASIC उत्तर देखा है ....
The_Basset_Hound

7
@The_Basset_Hound TI-BASIC 28 वीं सबसे आम भाषा है, यहाँ 140 उत्तर हैं; यह भी जीता है एक प्रमुख और एक कुछ छोटे प्रश्नों
lirtosiast

16

जावास्क्रिप्ट (ईएस 6), 55 54 48 बाइट्स

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

फ़ायरफ़ॉक्स 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

पायथ, 30 बाइट्स

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

मेरा पहला पायथ प्रोग्राम!

कुछ संकेत के लिए @Jakube धन्यवाद (मैंने उन लोगों के बारे में कभी नहीं सोचा होगा!)


3
सवाल पढ़ा नहीं है, लेकिन यहाँ कुछ अनुकूलन हैं जिन्हें मैंने तुरंत देखा था। सब कुछ एक लाइन पर लिखें। संख्या और चर (की एक अलग आदेश चुनें +*3Z280के बजाय +*Z3 280उदाहरण के लिए)। C\dके बजाय 100(रिक्त स्थान बचाता है)। के Jबजाय का उपयोग करता है Z(बचाता है =)। असाइनमेंट को इनलाइन करें। लिंक
जकाबे

10

पायथन 2, 80 बाइट्स

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

अब दौर!


आपको गोल करना होगा, जैसा कि ओपी ने एक मिनट पहले स्पष्ट किया था। ;-)
mınxomaτ 19

3
वर्ष% 100 वर्ष% 40 के समान है।
20

6

सीजेएम, 28 बाइट्स

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

इसे ऑनलाइन आज़माएं

वर्तमान एक के अलावा अन्य वर्षों की कोशिश करने के लिए, वर्ष et0=के शाब्दिक मूल्य के साथ शुरुआत में प्रतिस्थापित करें ।


2
चूंकि 2000 40 से विभाज्य है, और आपको केवल 2000-2039 की आवश्यकता है, तो आप 40%एक बाइट को बचाने के लिए उपयोग कर सकते हैं ।
एंड्रिया बियोनडो

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

ऑटो इट - 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

पॉवरशेल, 53 45 बाइट्स

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

Muddyfish के रूप में एक ऐसी ही राउंडिंग चाल का उपयोग करता है अजगर 2 जवाब , दुनिया की आबादी गणना को आसान बनाने के बाद से PowerShell परोक्ष Round()है जब आप एक से डाली [double]एक के लिए [int]नहीं बल्कि छोटा से,।

आउटपुट के लिए, हम मानते हैं कि "इसके बाद कुछ सीमांकक (जैसे स्थान या अल्पविराम)" का अर्थ "न्यूलाइन" भी हो सकता है, इसलिए हम एक परिणाम को निष्पादित करते हैं और फिर दूसरे को। PowerShell स्पष्ट रूप से परिणाम लिखता है, इसलिए हमें किसी भी मुद्रण आदेश को स्पष्ट रूप से कॉल करने की आवश्यकता नहीं है।


3

गणितज्ञ, 50 बाइट्स

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

ध्यान दें कि यह निर्भरता के कारण संस्करण संख्या 10+ (जारी 2014) के साथ एक वुल्फराम इंजन होने पर निर्भर है DateObjects

आर, 64 बाइट्स

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

मैथेमेटिका कोड का प्रत्यक्ष पोर्ट, मुझे लगता है कि मेरे पास एक छोटा समाधान था लेकिन पैकेजों पर निर्भर था जबकि यह आधार आर के साथ काम करता है।


1
(1/10)-> .1?
lirtosiast

1
मुझे लगता है कि आपको भी चारों ओर कोष्ठक की आवश्यकता नहीं है .1
lirtosiast

3

जावा, 180 177 166 152 143 बाइट्स

धन्यवाद एक noob बाहर मदद के लिए थॉमस :)

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);}}

Ungolfed संस्करण:

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);
  }
}

जावा 8 की आवश्यकता है।


import java.time.*? 3.0-> 3.? आपको आउटपुट के साथ वर्ष प्रिंट करने की भी आवश्यकता नहीं है।
lirtosiast

ओह, मुझे नहीं पता था कि आपको इस साल प्रिंट आउट की जरूरत नहीं थी ...: P
एक स्पेगेटो

3

जावास्क्रिप्ट (ईएस 6) 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

रूबी, 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|


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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.