Dünya popülasyonunu yaklaşık olarak belirlemek için xkcd's formülünü kullanın


42

Gelen XKCD 1047 , örneğin bir galon litre sayısı edilene Randall Munroe listeleri farklı hassasiyet ve karmaşıklığı ile çeşitli miktarlarda ve sayıların "biraz yanlış" yaklaşımı, çok yakın 3 + için π / 4 . Çizgi romanın ortasında, bir müdahale veriyor: belirli bir yıla dayanan dünya (ve Amerika Birleşik Devletleri) nüfusunu tahmin etmenin bir yolu.

Aşağıda açıklanan dünya ve ABD nüfus formülü
( Xkcd'den kırpılmış: Randall Munroe tarafından yapılan yaklaşımlar )

Sizin göreviniz, bu formülleri şu anki dünyaya ve ABD nüfusuna yaklaşmak için uygulayan ve aşağıdaki gibi çoğaltılan bir program yazmaktır.

Dünya nüfusu

  1. Mevcut yılın son iki basamağını alın.
  2. Katrina Kasırgası'ndan (2005) beri artık yıl sayısını (şimdiki yıl dahil) çıkarın . Bu amaçla, 4 ile bölünebilen herhangi bir yıl artık yıl olarak kabul edilir.
  3. İki sayı arasına ondalık basamak ekleyin (10'a bölünmekle aynıdır).
  4. Ekle 6. Bu sonucu milyarlarca kişiye verir.

ABD nüfusu

  1. Mevcut yılın son iki basamağını alın.
  2. 10'u çıkar.
  3. 3 ile çarp.
  4. 10 ekle.
  5. Başa 3 ekleyin (bu zorluk için bazı sayılar negatif olacaktır, bunun için 300 ekleyin). Her nasılsa, sadece birleştirmenin işe yaramayacağını farketmemiştim, çünkü sonuçları üretmek için kullandığım program az önce 300 ekledi.
  6. Bu, milyonlarca insanın sonucunu verir.

ayrıntılar

Bu formül "on yıl veya iki yıldır güncel kalmalıdır", ancak 2000–2039 dahil herhangi bir yılı teorik olarak idare edebilmelisiniz. Bazı durumlarda, Katrina'dan bu yana atılan yıllar negatif veya sıfır değere sahip olacak.

Tüm çıktılar aşağıdakilerle eşleştiği sürece formülü herhangi bir şekilde basitleştirmekte özgürsünüz.

Yıl için, yılı bilgisayarın saatine göre kullanın. Gelecek yıl ve bu yüzyılda başka bir yılda çalışması gerekir, bu nedenle 2015'i basitçe kodlayamazsınız. Kolaylık açısından, yılı diğer yıllarda test etmek için bir değişken veya girdi olarak belirtmenin bir yolunu dahil etmek isteyebilirsiniz.

Çıktı yaklaşık dünya nüfusu (milyarlarca insan), ardından bir miktar sınırlayıcı (örneğin alan veya virgül), ardından ABD nüfusu (milyonlarca insan) olmalıdır. Ayrıca bir dize ya da sayı ya da dize dizisini döndüren ya da yazdıran bir işlev yazabilirsiniz.

Bu kod golf, bayt cinsinden en kısa kod kazanır. Tiebreaker en eski yazıdır.

Test durumları

Bu, mümkün olan tüm yılların bir listesidir, bunu iki çıktı izler.

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
Numaraları yuvarlamak zorunda mısın?
Mavi,

5
@muddyfish Anladığımdan emin değilim. Çizgi romandaki talimatları tam olarak takip ederseniz, teknik olarak hiçbir bölünme olmaz, ancak dünya nüfusu en yakın onda birine yuvarlanmalıdır.
NinjaBearMonkey 12:15

2
Birleşik Devletler nüfusu bir tarafından biraz kafam karıştı. Eğer bir birleştiriyorsanız 3, 2040bir nüfusu vermemeli 3100? 40 - 10 = 30, 30 * 3 = 90, 90 + 10 = 100, Verecekti"3" + "100" = 3100
Cole

2
@Cole İyi nokta, bunu sadece 2039 yılına kadar yıllara dayandırmanız için yapacağım. Yılını kodlama konusunda, kodlamaya izin vermek istemiyorum çünkü bu neredeyse her zaman tarihleri ​​destekleyen diller bile daha kısa olacak.
NinjaBearMonkey 12:15

8
@NinjaBearMonkey Önceki sonuç hoş bir 2 basamaklı pozitif sayı olmadığında ortaya çıkan tüm vakaları kapsayacak şekilde, "3 ekleyerek düşünme birleştirmeyi" açıklamasını "300 ekle" kelimesine getirmenizi öneririm. (Örneğin, 2000 yılı 280sonucu verir -20+300=280ve vermez 3 . -20= "3-20")
PhiNotPi 13:15

Yanıtlar:


22

Pyth, 21 20 bayt

Dennis tarafından -1 bayt

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

Bunlar aynı bayt sayısına sahiptir ancak yalnızca ASCII'dir:

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

Pyth'i tanımıyorum, muhtemelen hala golf oynamaktadır. Aynı algoritmayı kullanarak:

TI-BASIC, 23 bayt

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

getDate{YYYY,MM,DD}tarih formatı ayarına bağlı olarak bazı sıralı üç satır listesini verir (TI-84'lerde gerçek bir int veri türü yoktur); max(yıl olacak. Koruyucular içinde çarpma ve çıkarma, max(yakın bir parlatmaya yol açar.


1
Sanırım ilk defa TI-BASIC cevabını burada
görüyorum

7
@The_Basset_Hound TI-BASIC, 140 cevapta 28. en yaygın dildir; o da kazandı bir büyük ve bir kaç küçük soru .
lirtosiast 13:15

16

Javascript (ES6), 55 54 48 bayt

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

Firefox 33'te çalışır; teorik olarak 2000'den 2099'a kadar olan tüm yılları destekler. Sonucu konsola döken programlara izin verilmiyorsa, bu 51 baytlık işlevi kullanın:

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

Tam program, 55 bayt:

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

Yılı almak oldukça pahalıydı, ancak kullanımdan getYear()ziyade kullanımdan kaldırıldıktan sonra getFullYear(), denklemdeki tüm sayılar küçülmüş ve çok sayıda bayt kurtarılmıştı. EDIT: Bir eeevil numarası sayesinde, atladım newve getYear()tamamen. >: D

Önerilerinizi bekliyoruz!


10

Pyth, 30 bayt

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

İlk Pyth programım!

Bazı ipuçları için @Jakube'a teşekkürler (Bunları asla düşünmezdim!)


3
Soruyu okumadım, ancak işte hemen gördüğüm birkaç optimizasyon. Her şeyi bir satıra yazın. Farklı bir sayı ve değişken sırası seçin ( örneğin +*3Z280yerine +*Z3 280). C\dyerine 100(yerden tasarruf). Yerine Jkullanın Z(kaydeder =). Atama satır içi. Link
Jakube 12:15

10

Python 2,80 bayt

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

Şimdi yuvarlar!


OP'nin bir dakika önce açıklığa kavuştuğu gibi yuvarlamanız gerekiyor. ;-)
mınxomaτ 12:15

3
% 100,% 40 ile aynıdır.
lirtosiast 12:15

6

CJam, 28 bayt

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

Çevrimiçi deneyin

Şu andaki yıldan farklı et0=olanları denemek için, başlangıçtaki başlangıcı yılın gerçek değeriyle değiştirin .


2
2000'den 40'a bölünebildiğinden ve yalnızca 2000-2039'a ihtiyacınız varsa, 40%bir bayttan tasarruf etmek için kullanabilirsiniz .
Andrea Biondo

5

Python 3, 134 bayt

İyi çalışıyor ama biraz uzun görünüyor

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)

Bu kısaltmak için kullanın from time import*, y=strftime('%Y'). Veya diğer piton cevabı kopyalayın: P
FlipTack

5

AutoIt - 60 58 56 bayt

$_=@YEAR-2e3
ClipPut(($_-Int($_/4-1))/10+6&' 3'&3*$_-20)

Yuvarlama baytları yiyor (artık değil). Şimdi iki formülü de değiştirdim. Bazı örnek çıktılar:

7.3 325 // 2015
7.3 328
7.4 331
7.5 334 // 2018
8.4 370 // 2030

Hepsi doğru gibi görünüyor.

Bir ipucu: İşlem sırası, baytları parantez içine alır. Örneğin: (a-4)/4 = a/4-1:-).


4

PowerShell, 53 45 Bayt

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

Muddyfish en benzer bir yuvarlama hile kullanır Python 2 cevap PowerShell örtülü beri dünya nüfusu hesaplanmasını kolaylaştırmak amacıyla Round()bir döküm zaman s [double]bir etmek [int]yerine kesiliyor yerine,.

Çıktı için, "bazı sınırlayıcıların (örneğin boşluk veya virgül)" takip ettiğini " " newline "anlamına geldiğini varsayıyoruz , bu yüzden bir sonuç ve sonra ikinciyi kullanıyoruz. PowerShell sonuçları kesin olarak yazar, bu nedenle herhangi bir yazdırma komutunu açıkça çağırmamız gerekmez.


3

Mathematica, 50 bayt

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

Bunun, bağımlılığa bağlı olarak 10+ ve 10+ Sürüm numaralarına sahip bir Wolfram Motorunun olmasına bağlı olduğunu unutmayın DateObjects.

R, 64 bayt

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

Doğrudan Mathematica kodunun limanı, daha kısa bir çözüme sahip olduğumu ancak paketlere bağlı olduğumu düşünürken bu temel R ile çalışıyor.


1
(1/10)-> .1?
lirtosiast 13:15

1
Ayrıca etrafındaki parantezlere de ihtiyacınız olmadığını düşünüyorum .1.
lirtosiast 13:15

3

Java, 180 177 166 152 143 bayt

Noob'a yardım ettiğin için teşekkürler Thomas. :)

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 versiyonu:

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 gerektirir.


import java.time.*? 3.0-> 3.? Ayrıca yılı çıktıyla birlikte yazdırmanıza gerek yoktur.
lirtosiast

Oh, basıldığı yılın gerekmediğinin farkında değildim ...: P
bir spaghetto

3

JavaScript (ES6) 52

Çıkışı bir dizi olarak döndüren bir işlev.

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

Sadece test amaçlı, fonksiyon mevcut girdi - 1900'e eşit bir girdi kabul eder (örneğin, 2015 için 105)

ETHProductions'un cevabı doğrultusunda (matematik matematiktir), ama kötülük numarasından kurtularak farklı yerlerde daha taşınabilir. Ve bir işlev olarak 1 bayt daha kısa.

Test snippet'i:

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

Ruby, 57 bayt

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

Ne yazık ki, Time.now.yeargerçekten bazı karakterler maliyeti.


2

Desmos , 140 Bayt

Yeni bir denklemin sinyali olmak için yeni bir satır sayıyorum. Bağlantıdaki klasörler sadece organizasyon içindir.

Golf , 140 Bayt

add sliderİstendiğinde tıklayın .

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 Bayt

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 bayt

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

Java cevabımın çevirisi.


1

PHP, 45 bayt

Kod:

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

Çünkü y(argümanı date()) tanımlanmamış bir sabittir, PHP (biz gerekmez) bir dizeye bir uyarı (yani kapatılabilir) ve dönüşürse tetikleyen; Bu PHP nezaket 2 byte tasarruf sağlar.

Bildirimi kaldırmak için, programın aşağıdaki gibi çalışma error_reporting=0zamanı direktifini kullanarak çalıştırılması gerekir :

$ php -d error_reporting=0 -r 'echo(int)(($x=3*date(y)+247)/4)*.1," ",$x+33;'
7.3 325

Test için

Çağrısına değiştirerek date(y)ile $argv[1](ilk komut satırı argümanı), 1 byte ile program uzunluğu artar ancak komut satırından yıl alabilirsiniz.

Beklenen argüman eksi 2000'dir; ayrıca negatif değerler (2000'den önceki yıllar) veya 40'tan büyük (2040 yılından sonraki) değerler için de çalışır.

$ 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 bayt

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

TryAPL

Evet, 29 bayt .


İki karakterden tasarruf edin: (∘ ∘40, + ∘33) 755753 + 3 × ⊃⎕TS
Adám
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.