বিশ্বের জনসংখ্যার আনুমানিক জন্য xkcd এর সূত্র ব্যবহার করুন


42

ইন xkcd 1047 , এই ধরনের একটি পয়সের পাঁচ সের মধ্যে লিটার নম্বর হিসাবে রান্ডাল মানরো তালিকা "সামান্য ভুল" নানারকম স্পষ্টতা এবং জটিলতা সঙ্গে হরেক রকম পরিমাণে এবং সংখ্যার অনুমান, খুব 3 + এ পাসে π / 4 । কমিকের মাঝামাঝি সময়ে, তিনি একটি অন্তঃসত্ত্বা দেন: একটি নির্দিষ্ট বছরের জন্য বিশ্বের (এবং মার্কিন যুক্তরাষ্ট্র) জনসংখ্যার অনুমান করার একটি উপায়।

বিশ্ব ও মার্কিন জনসংখ্যার সূত্র নীচে বর্ণিত
(এক্সকেসিডি থেকে ক্রপ করা হয়েছে : র‌্যান্ডাল মুনরো দ্বারা অনুমানকরণ)

আপনার কাজ হ'ল এমন একটি প্রোগ্রাম লিখুন যা বর্তমান বিশ্ব এবং মার্কিন জনসংখ্যার অনুমানের জন্য এই সূত্রগুলি প্রয়োগ করে, নিম্নলিখিত হিসাবে প্রতিলিপি করা।

বিশ্ব জনসংখ্যা

  1. চলতি বছরের শেষ দুটি অঙ্ক নিন।
  2. হারিকেন ক্যাটরিনা (২০০৫) সাল থেকে লিপ বছরের সংখ্যা (বর্তমান বছর সহ) বিয়োগ করুন । এই উদ্দেশ্যে, 4 দ্বারা বিভাজ্য যে কোনও বছর একটি লিপ বছর হিসাবে বিবেচিত হয়।
  3. দুটি সংখ্যার মধ্যে দশমিক পয়েন্ট যুক্ত করুন (10 দ্বারা বিভাজকের সমান)।
  4. যোগ করুন 6. এটি কোটি কোটি মানুষের ফলাফল দেয়।

মার্কিন জনসংখ্যা

  1. চলতি বছরের শেষ দুটি অঙ্ক নিন।
  2. বিয়োগ 10।
  3. 3 দ্বারা গুণ করুন।
  4. 10 যোগ করুন।
  5. শুরুতে 3 যোগ করুন (এই চ্যালেঞ্জের জন্য, কিছু সংখ্যা নেতিবাচক হবে, সুতরাং পরিবর্তে 300 যোগ করুন)। আমি কোনওভাবেই লক্ষ্য করিনি যে কেবল কনকনেটেটিং কাজ করবে না কারণ আমি যে ফলাফলটি উত্পন্ন করতে যে প্রোগ্রামটি ব্যবহার করেছি তা মাত্র 300 যুক্ত করেছে।
  6. এটি লক্ষ লক্ষ মানুষের ফলাফল দেয়।

বিস্তারিত

এই সূত্রটি "এক বা দুই দশক অবধি চলমান থাকা উচিত" তবে আপনি অবশ্যই 2000-22039 সমেত যে কোনও বছর তাত্ত্বিকভাবে পরিচালনা করতে সক্ষম হবেন। কিছু ক্ষেত্রে, ক্যাটরিনার পরের লিপ বছরগুলির একটি নেতিবাচক বা শূন্য মান হবে।

যতক্ষণ না সমস্ত আউটপুট নীচের চিত্রের সাথে মেলে ততক্ষণ আপনি যে কোনও উপায়ে সূত্রকে সরল করতে মুক্ত।

বছরের জন্য, কম্পিউটারের ঘড়ি অনুযায়ী বছরটি ব্যবহার করুন। এটি অবশ্যই পরের বছর এবং অন্য কোনও বছর এই শতাব্দীতে কাজ করবে, সুতরাং আপনি কেবল হার্ডকোড 2015 করতে পারবেন না convenience সুবিধার জন্য, আপনি অন্যান্য বছর পরীক্ষা করার জন্য বছরের পরিবর্তনশীল বা ইনপুট হিসাবে নির্দিষ্ট করার উপায় অন্তর্ভুক্ত করতে চাইতে পারেন।

আউটপুটটি আনুমানিক বিশ্বের জনসংখ্যার (কোটি কোটি মানুষের মধ্যে) হওয়া উচিত, তার পরে কিছু সীমানার (উদাহরণস্বরূপ স্পেস বা কমা), তার পরে মার্কিন জনসংখ্যা (কয়েক মিলিয়ন লোক)। আপনি এমন একটি ফাংশনও লিখতে পারেন যা কোনও স্ট্রিং বা সংখ্যা বা স্ট্রিংগুলির একটি অ্যারে প্রদান করে বা প্রিন্ট করে।

এটি কোড গল্ফ, তাই বাইট জেতে সংক্ষিপ্ততম কোড। টাইব্রেকার প্রথম পোস্ট।

পরীক্ষার মামলা

এটি সমস্ত সম্ভাব্য বছরের একটি তালিকা এবং তারপরে দুটি আউটপুট।

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
@ কোল গুড পয়েন্ট, আমি এটি তৈরি করব যাতে আপনাকে কেবল ২০৩৯ সালের মধ্যে বছরগুলি সমর্থন করতে হবে year বছরের হার্ডকোডিংয়ের বিষয়ে, আমি হার্ডকোডিংয়ের অনুমতি দিতে চাই না কারণ এটি প্রায় সর্বদা সংক্ষিপ্ত এমনকি এমন ভাষাও হতে পারে যা সমর্থন তারিখগুলি করে।
নিনজাবিয়ারমনেকি

8
@ নিনজাবিয়ারমোনকি আমি প্রস্তাব দিচ্ছি যে পূর্ববর্তী ফলাফলটি 2-সংখ্যক ধনাত্মক সংখ্যা না হলে ঘটে যাওয়া সমস্ত প্রান্তের কেসটি আড়াল করার জন্য আপনি "3 যুক্ত করা, আক্ষরিক বিবেচনায়" বর্ণনার পরিবর্তন করুন। (উদাহরণস্বরূপ, বছর 2000 এর 280ফলাফল হিসাবে দেয় -20+300=280এবং না 3 . -20= "3-20")
PhiNotPi

উত্তর:


22

পাইথ, 21 20 বাইট

ডেনিস -1 বাইট

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

এগুলির একই বাইট গণনা রয়েছে তবে কেবলমাত্র এসসিআইআই:

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

আমি পাইথকে জানি না, তাই সম্ভবত এখনও গল্ফযোগ্য। একই অ্যালগরিদম ব্যবহার:

টিআই-বেসিক, 23 বাইট

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

getDate{YYYY,MM,DD}তারিখের ফর্ম্যাট সেটিংয়ের উপর নির্ভর করে কিছু ক্রমে তিনটি ফ্লোটের একটি তালিকা ফেরত দেয় (টিআই -৪৮ এর সত্যিকারের ইনট ডেটাটাইপ থাকে না); The max(বছর হতে হবে। গুনের মধ্যে এবং বিয়োগ করা max(একটি নিকট-পেরেন সংরক্ষণ করে sa


1
আমার মনে হয় এখানে প্রথমবারের মতো টিআই-বেসিক উত্তরটি দেখলাম ....
দ্য_বাসেট_হাউন্ড

7
@ দ্য_বাসেট_হাউন্ড টিআই-বেসিক ১৪০ টি উত্তরে এখানে 28 তম সাধারণ ভাষা; এটি জিতেছে এক প্রধান এবং একটি কয়েক ছোট প্রশ্ন
lirtosiast

16

জাভাস্ক্রিপ্ট (ES6), 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(), সমীকরণের সমস্ত সংখ্যা ছোট হয়ে গেছে, প্রচুর বাইট সংরক্ষণ করে। সম্পাদনা: আইভিল ট্রিকের জন্য ধন্যবাদ, আমি এড়িয়ে গেছি newএবং getYear()পুরোপুরি। >: D:

পরামর্শ স্বাগত!


10

পাইথ, 30 বাইট

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

আমার প্রথম পাইথ প্রোগ্রাম!

কিছু ইঙ্গিতের জন্য @ জাকুবকে ধন্যবাদ জানাই (আমি সেগুলি সম্পর্কে কখনই ভাবিনি!)


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τ

3
বছর% 100 বছর 40% হিসাবে একই।
lirtosiast

6

সিজেম, 28 বাইট

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

এটি অনলাইনে চেষ্টা করুন

বর্তমানের তুলনায় অন্যান্য বছর চেষ্টা করার et0=জন্য, বছরের শুরুতে বছরের আক্ষরিক মানের সাথে প্রতিস্থাপন করুন ।


2
যেহেতু 2000 টি 40 দ্বারা বিভাজ্য, এবং আপনার কেবল 2000-2039 দরকার তাই আপনি 40%একটি বাইট সংরক্ষণ করতে পারেন ।
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')বা অন্য অজগর উত্তরটি অনুলিপি করুন: পি
ফ্লিপট্যাক

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]বরং ছিন্ন চেয়ে।

আউটপুটটির জন্য, আমরা ধরে নিই যে "কিছু কিছু ডিলিমিটার অনুসরণ করে (উদাহরণস্বরূপ স্পেস বা কমা)" এর অর্থ "নিউলাইন "ও হতে পারে, সুতরাং আমরা একটি ফলাফল এবং তারপরে দ্বিতীয়টি কার্যকর করি। পাওয়ারশেল সুস্পষ্টভাবে ফলাফলগুলি লিখে দেয়, সুতরাং আমাদের কোনও প্রিন্টিং কমান্ড স্পষ্টভাবে কল করার দরকার নেই।


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)

গাণিতিক কোডের সরাসরি বন্দর, মনে করি আমার একটি সংক্ষিপ্ত সমাধান ছিল তবে প্যাকেজগুলির উপর নির্ভরশীল যেখানে এটি বেস আর নিয়ে কাজ করে whereas


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

জাভা 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)

এটি ইটিএইচ প্রডাকশনগুলির উত্তর (গণিতটি গণিত) এর লাইনে রয়েছে তবে মন্দ কৌশলটি উপভোগ করা এটি বিভিন্ন লোকালয়ে আরও পোর্টেবল। এবং একটি ফাংশন হিসাবে এটি 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

পিএইচপি, 45 বাইট

কোড:

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

কারণ y(এর যুক্তি date()) একটি অপরিজ্ঞাত ধ্রুবক, পিএইচপি একটি নোটিশ ট্রিগার করে (এটি নিঃশব্দ করা যেতে পারে) এবং এটিকে স্ট্রিংয়ে রূপান্তর করে (যেমন আমাদের প্রয়োজন); এই পিএইচপি সৌজন্যে 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.