No xkcd 1047 , Randall Munroe lista aproximações "levemente erradas" de quantidades e números variados com precisão e complexidade variadas, tais como que o número de litros em um galão é muito próximo de 3 + π ⁄ 4 . No meio dos quadrinhos, ele dá um intervalo: uma maneira de estimar a população mundial (e dos Estados Unidos) com base em um determinado ano.
(Cortado de xkcd: Aproximações de Randall Munroe)
Sua tarefa é escrever um programa que implemente essas fórmulas para aproximar o mundo atual e as populações dos EUA, replicadas da seguinte maneira.
População mundial
- Pegue os dois últimos dígitos do ano atual.
- Subtraia o número de anos bissextos (incluindo o ano atual) desde o furacão Katrina (2005). Para esses fins, qualquer ano divisível por 4 é considerado um ano bissexto.
- Adicione um ponto decimal entre os dois números (o mesmo que dividir por 10).
- Adicionar 6. Isso dá o resultado em bilhões de pessoas.
População dos EUA
- Pegue os dois últimos dígitos do ano atual.
- Subtraia 10.
- Multiplique por 3.
- Adicione 10.
- Adicione 3 ao início (para esse desafio, alguns números serão negativos; portanto, adicione 300). De alguma forma, eu não percebi que apenas concatenar não funcionaria porque o programa que eu usei para gerar os resultados acabou de adicionar 300.
- Isso dá o resultado em milhões de pessoas.
Detalhes
Essa fórmula "deve permanecer atual por uma década ou duas", mas você deve ser capaz de lidar teoricamente com qualquer ano 2000-2039, inclusive. Em alguns casos, os anos bissextos desde o Katrina terão um valor negativo ou zero.
Você é livre para simplificar a fórmula de qualquer forma, desde que todas as saídas correspondam às que estão abaixo.
Para o ano, use o ano de acordo com o relógio do computador. Ele deve funcionar no próximo ano e em qualquer outro ano deste século, para que você não possa simplesmente codificar em 2015. Por conveniência, convém incluir uma maneira de especificar o ano como uma variável ou entrada para testar outros anos.
O resultado deve ser a população mundial aproximada (em bilhões de pessoas), seguida por algum delimitador (por exemplo, espaço ou vírgula), seguido pela população dos EUA (em milhões de pessoas). Você também pode escrever uma função que retorne ou imprima uma string ou uma matriz de números ou strings.
Este é o código golf, pelo que o código mais curto em bytes vence. O desempate é o primeiro post.
Casos de teste
Esta é uma lista de todos os anos possíveis, seguidos pelas duas saídas.
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
fonte
3
, não deve2040
fornecer uma população de3100
?40 - 10 = 30
,30 * 3 = 90
,90 + 10 = 100
, O que daria"3" + "100" = 3100
280
como resultado de-20+300=280
e não3 . -20= "3-20"
)Respostas:
Pitão,
2120 bytes-1 byte por Dennis
Eles têm a mesma contagem de bytes, mas são apenas ASCII:
Eu não conheço Pyth, então ainda
provavelmenteprovavelmente jogável. Usando o mesmo algoritmo:TI-BASIC, 23 bytes
getDate
retorna uma lista de três carros alegóricos{YYYY,MM,DD}
em alguma ordem, dependendo da configuração do formato da data (as TI-84 não têm um tipo de dados int verdadeiro); omax(
será o ano. Multiplicar e subtrair dentro domax(
salva um ponto final.fonte
Javascript (ES6),
555448 bytesFunciona no Firefox 33; teoricamente, suporta todos os anos de 2000 a 2099. Se programas que despejam o resultado no console não forem permitidos, use esta função de 51 bytes:
Programa completo, 55 bytes:
Obter o ano foi bastante caro, mas depois de usar o obsoleto emEdição: Graças a um truque eeevil, eu puleigetYear()
vez degetFullYear()
, todos os números na equação ficaram menores, economizando muitos bytes.new
egetYear()
completamente. >: DSugestões são bem-vindas!
fonte
Pitão, 30 bytes
Meu primeiro programa Pyth!
Obrigado @Jakube por algumas dicas (eu nunca teria pensado nisso!)
fonte
+*3Z280
vez de,+*Z3 280
por exemplo).C\d
em vez de100
(economiza espaços). Use emJ
vez deZ
(salva o=
). Inline a tarefa. LinkPython 2, 80 bytes
Agora rodadas!
fonte
CJam, 28 bytes
Experimente online
Para tentar anos diferentes do atual, substitua o
et0=
no início pelo valor literal do ano.fonte
40%
para salvar um byte.Python 3, 134 bytes
Funciona bem, mas parece um pouco longo
fonte
from time import*
,y=strftime('%Y')
. Ou copie a outra resposta python: PAutoIt -
605856 bytesO arredondamento come bytes(não mais). Agora ajustei as duas fórmulas. Algumas saídas de amostra:Todos eles parecem ser precisos.
Uma dica: a ordem de execução salva bytes entre parênteses. Por exemplo:
(a-4)/4 = a/4-1
:-).fonte
PowerShell,
5345 bytesUsa um truque de arredondamento semelhante ao da resposta de Python 2 do muddyfish para simplificar o cálculo da população mundial, pois o PowerShell implicitamente
Round()
s quando você transmite de a[double]
para um[int]
, em vez de truncar.Para a saída, assumimos que "seguido por algum delimitador (por exemplo, espaço ou vírgula)" também pode significar "nova linha"; portanto, executamos um resultado e depois o segundo. O PowerShell escreve implicitamente os resultados, portanto, não precisamos chamar explicitamente nenhum comando de impressão.
fonte
Mathematica, 50 bytes
Observe que isso depende de ter um Wolfram Engine com o número da versão 10+ (lançado em 2014) devido à dependência
DateObjects
.R, 64 bytes
Porta direta do código do Mathematica, acho que tive uma solução mais curta, mas dependente dos pacotes, enquanto isso funciona com a base R.
fonte
(1/10)
->.1
?.1
.Java,
180177166152143 bytesObrigado Thomas por ajudar um noob a sair :)
Versão não destruída:
Requer Java 8.
fonte
import java.time.*
?3.0
->3.
? Você também não precisa imprimir o ano com a saída.JavaScript (ES6) 52
Uma função retornando a saída como uma matriz.
Apenas para fins de teste, a função aceita uma entrada igual ao ano atual - 1900 (por exemplo, 105 para 2015)
Isso está na linha da resposta da ETHproductions (a matemática é a matemática), mas avodando o truque do mal , é mais portátil em locais diferentes. E, como função, é 1 byte menor.
Snippet de teste:
fonte
Ruby, 57 bytes
Infelizmente,
Time.now.year
realmente custa alguns personagens.fonte
Desmos , 140 bytes
Estou contando uma nova linha para ser um sinal para uma nova equação. Pastas no link são apenas para organização.
Golfe , 140 Bytes
Clique
add slider
quando solicitado.Ungolfed , 261 Bytes
fonte
Glava, 77 bytes
Uma tradução da minha resposta Java.
fonte
PHP, 45 bytes
O código:
Como
y
(o argumento dedate()
) é uma constante indefinida, o PHP aciona um aviso (que pode ser silenciado) e o converte em uma string (conforme necessário); essa cortesia do PHP permite economizar 2 bytes.Para suprimir o aviso, o programa precisa ser executado usando a
error_reporting=0
diretiva de tempo de execução, assim:Para teste
Substituindo a chamada por
date(y)
with$argv[1]
(o primeiro argumento da linha de comando), o comprimento do programa aumenta em 1 byte, mas ele pode obter o ano a partir da linha de comando.O argumento esperado é o ano menos 2000; também funciona para valores negativos (anos antes de 2000) ou valores maiores que 40 (após o ano 2040).
fonte
APL,
252329 bytesTryAPL
Sim, são 29 bytes .
fonte