Використовуйте формулу 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. Це дає результат мільйонам людей.

Деталі

Ця формула "повинна залишатися актуальною протягом десяти років або двох", але ви повинні мати можливість теоретично впоратися з будь-яким 2000–2039 рр. Включно. У деяких випадках високосні роки з часу Катріни матимуть негативне або нульове значення.

Ви можете будь-яким чином спростити формулу, доки всі результати відповідають наведеним нижче.

За рік використовуйте рік відповідно до годинника комп'ютера. Він повинен працювати наступного року та будь-якого іншого року цього століття, тому ви не можете просто жорсткий код 2015. Для зручності ви можете включити спосіб вказати рік як змінну або вхід для тестування інших років.

Вихідним показником має бути приблизне населення світу (у мільярдах людей), за яким слід розмежувати (наприклад, пробіл чи кома), а за ним - населення США (у мільйонах людей). Ви також можете написати функцію, яка повертає або друкує рядок або масив чисел або рядків.

Це код гольфу, тому найкоротший код у байтах виграє. Tiereaker - найдавніший пост.

Тестові справи

Це перелік усіх можливих років з наступними двома результатами.

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давати популяції 3100? 40 - 10 = 30, 30 * 3 = 90, 90 + 10 = 100, Який дав би"3" + "100" = 3100
Cole

2
@Cole Добрий момент, я зроблю це так, що вам потрібно підтримувати лише роки до 2039 року. Щодо жорсткого кодування року, я не хочу дозволити жорстке кодування, оскільки це майже завжди буде коротшим, навіть мови, які підтримують дати.
NinjaBearMonkey

8
@NinjaBearMonkey Я пропоную вам змінити опис "додавання 3, мислення об'єднання" на буквальне "додати 300", щоб охопити всі крайові випадки, які виникають, коли попередній результат не є приємним двозначним позитивним числом. (Наприклад, 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}у певному порядку залежно від налаштування формату дати (у 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(), всі числа в рівнянні стали меншими, заощадивши багато байтів. EDIT: Завдяки трюковій вуха я пропустив 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

Python 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

CJam, 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'). Або скопіюйте іншу відповідь 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 каламутної риби, щоб спростити обчислення чисельності населення світу, оскільки PowerShell неявно Round()с, коли ви переходите з "а [double]" [int], а не з обрізки.

Для виведення ми припускаємо, що "слідом за деяким роздільником (наприклад, пробіл або кома)" також може означати "новий рядок", тому ми виконуємо один результат, а потім другий. PowerShell неявно записує результати, тому нам не потрібно явно викликати будь-які команди друку.


3

Математика, 50 байт

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

Зауважте, що це залежить від наявності Wolfram Engine з версією 10+ (випущена 2014 р.) Через залежність від 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 байт

Дякую Томасу за те, що він допомагає нобі :)

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

JavaScript (ES6) 52

Функція, що повертає вихід у вигляді масиву.

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

Тільки для цілей тестування, функція приймає вхід, рівний поточному року - 1900 (наприклад, 105 за 2015 рік)

Це в рядку відповіді 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|

Безумовно , 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

Переклад моєї відповіді на 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.