Lista de possíveis anos de nascimento de seres humanos vivos


40

O desafio

Saída uma lista de anos que começa com o ano atual e termina 120 anos atrás. O ano de nascimento de todo ser humano vivo seria incluído nesta lista.

Detalhes

A lista deve estar em ordem decrescente.

Todas as funções internas para manipular matrizes e / ou listas são permitidas.

O menor código em bytes vence.

Quando executado este ano, a produção seria

2016, 2015, ..., 1897, 1896

Quando executado no próximo ano, a produção será

2017, 2016, ..., 1898, 1897

Etc.

Atualizar

  • Alguns perguntaram sobre o formato da lista. Como a maioria adivinhou, isso não importa. Insira qualquer separador entre os números. Intuitivamente, a maioria inseriu uma vírgula ou espaço ou ambos, nova linha ou produz uma matriz.
  • Quase sobre-humanos como Jeanne Calment são uma exceção à regra estabelecida na minha pergunta.

7
Eu recomendo a sandbox para obter feedback antes de postar um desafio (não apenas para o seu primeiro desafio - a maioria de nós o usa para todos os desafios).
Trichoplax

3
Não vejo nada de errado com esse desafio. Uma coisa que vale a pena especificar é se a produção deve sempre começar em 2016 ou com o ano em que é executada (será iniciada em 2017 se for executada no próximo ano?). Isso afetará se é um desafio de saída fixa ou precisa acessar a data atual.
Trichoplax


10
Rapaz, era muito cedo para aceitar.
Addison Crump

6
O desafio é: "Imprima todos os números de y- 120 a y" ou "imprima todos os anos de nascimento de pessoas vivas"? Porque se alguém nascido em 1896 está vivo hoje, isso não significa que ainda existam pessoas a partir de 1898.
CompuChip

Respostas:


19

Pyke, 6 bytes

wC7m-

Experimente aqui!

w     - 121
   m- - for i in range(^):
 C7   -  current_year-i

(Depois w, o ponto de código para 153 está presente, mas não é imprimível)


11
Uau, essa foi uma marca de verificação rápida. Talvez espere por uma resposta da Jelly?
Adám 11/08/16

Embora concorde que era uma marca de verificação rápida, duvido mesmo Jelly pode fazê-lo em 5
Azul

Por que você tem uma variável para 121? Só porque é um número quadrado? Mas bem feito!
Denker

3
A wverdade tem um byte impublicável depois que o torna 121
azul

11
O @LeakyNun é configurável, qualquer que seja o padrão para o servidor em que está sendo executado. Em pyke.catbus, eu defini-lo para o Windows-1252
Azul

11

Pitão, 11 9 8 bytes

-L.d3C\y

Funciona mapeando sobre o intervalo [0...120]e subtraindo todos os números do ano atual. O intervalo é construído implicitamente usando 121como argumento do mapa. Para evitar um espaço em branco de separação entre .d3e 121obtemos esse número convertendo yem seu ponto de código.
Agradecemos a @FryAmTheEggman por apresentar essa abordagem!

Experimente aqui!

Solução antiga de 9 bytes:

_>121S.d3

Experimente aqui!

Cria o intervalo [1...<current year>]e leva apenas os últimos 121 elementos dele.


11
Você deve reverter a lista para que ele começa com o ano em curso
Christiaan Westerbeek

11
-L...salva alguns bytes.
Jakube 11/08/16

11
@ChristiaanWesterbeek Perdeu essa parte, consertou. Obrigado por detectar!
Denker

@Jakube Usou uma abordagem diferente agora, mas obrigado pelo lembrete de que isso existe, não usei muito o Pyth na última vez!
Denker

11
-L.d3C\ydeve funcionar para 8.
FryAmTheEggman

9

R, 34 bytes

(format(Sys.Date(),"%Y"):0)[1:121]

Veja aqui em um intérprete online.

Editar Pode ser reduzido para 33 bytes usando substr.

(substr(Sys.Date(),1,4):0)[1:121]

mas tecnicamente essa solução funcionará apenas até o 9999-12-31.


3
Isso é incrível. Eu não sabia o que poderia estereotipado uma string em um número quando se utiliza o :operador ...
Andreï Kostyrka

8

AngularJS + Lodash , 274 bytes

angular.module('x',[]).controller('x',['$scope',function(x){x.x=_.range(9,new Date().getFullYear()+1).slice(-121).reverse()}])
<script src=//goo.gl/M5LvGe></script><script src=//goo.gl/opljJl></script><select ng-app=x ng-controller=x multiple><option ng-repeat="x in x">{{x}}

Saída

insira a descrição da imagem aqui


8

BASH + coreutils, 35 33 bytes

x=`date +%Y`;seq $x -1 $((x-120))

2
no seu caso, as aspas são desnecessárias: change: date +"%Y"into #date +%Y
Olivier Dulac

11
x=`date +%Y`;seq $x -1 $[x-120]ou seq $[x=`date +%Y`] -1 $[x-120]funciona também.
Dennis

10 bytes mais curto se você tiver OSX ou estão dispostos a instalar jotno Linux
Trauma Digital

7

CJam, 14 12 11 bytes

Economizou 2 bytes graças ao Sp3000 e 1 byte graças a Martin Ender

et0=121,f-p

Experimente online!

Explicação

et0=         e# Push the current year
    121,     e# Push the range 0, 1, ..., 120
        f-   e# For each item in the range, subtract it from current year
          p  e# Print the array

7

HP50g RPL, 97 bytes

120 'S' STO DATE ->STR 6 9 SUB OBJ-> 'Y' STO {} S WHILE 0 >= REPEAT Y S - + 'S' DECR END REVLIST

Ungolfed:

120
'span' STO     @ Store the span of years to cover.
DATE           @ Get the date as number 11.082016. 
→STR           @ Convert to string "11.082016".
               @ (Number format must allow all these decimal places.)
6 9 SUB        @ "11.082016" Substring for the year.
               @       ^  ^
               @  123456789
OBJ→           @ Convert string to number.
'year' STO     @ Store as the year to start at.
{} span        @ Start empty list to collect the years.
               @ Leave loop counter on the stack.
WHILE 0 ≥      @ Loop until the counter goes negative.
REPEAT
  year span -  @ E.g. on first iteration: 2016 - 120 = 1896.
  +            @ Append the year to the list on the stack.
  'span' DECR  @ Decrement loop counter and leave on stack.
END
REVLIST        @ Put list in reverse chronological order.

Mostrando uma lista de 2016 até 1896:

2016 a 1896


Resposta editada para obter o ano atual da calculadora.
Caleb Paul

6

05AB1E , 8 7 bytes

Código:

žg120Ý-

Explicação:

žg         # Get the current year.
  120Ý     # Create the list [0, 1, ..., 119, 120].
      -    # Substract, which leaves [year - 0, year - 1, ..., year - 120].

Usa a codificação CP-1252 . Experimente online! .


6

PowerShell, 26 24 bytes

@TimmyD versão melhorada:

0..120|%{(date).Year-$_}

Estava:

($d=(date).year)..($d-120)

onde datecorreGet-Date


11
Blargh, deveria ter respondido anteriormente. Essa é exatamente a versão direta que eu tinha preparado. Então o trabalho interferiu: a versão divertida do DA também seria ((date).year..0)[0..120]:; infelizmente não é mais curto.
Joey #

11
Acho interessante que a data seja equivalente a Get-Date quando date não é realmente um alias para Get-Date. Eu já vi isso chamado regra "verbo implícito" e raramente é documentada na literatura do PowerShell.
Bevo

@ Bevo É útil para CodeGolf, mas um pouco arriscado para qualquer outro uso. Consulte: codegolf.stackexchange.com/a/778/571 e cadeia de comentários; é propenso a nomear confrontos e muito lento.
TessellatingHeckler

6

Dyalog APL , 11 10 bytes

120↑⌽⍳⊃⎕ts

120↑ pegue 120 elementos

do reverso

índices até

o primeiro elemento de

⎕TS TimeStamp no formato [AAAA, M, D, h, m, s, t]

TryAPL online!


Versão antiga:

(⊃⎕TS)-⍳120

⊃⎕TS primeiro elemento de [AAAA, M, D, h, m, s, t]

- menos

⍳120 [0, 1, 2, ..., 118, 119]

Requer ⎕IO←0, que é padrão em muitos sistemas.

TryAPL online!


6

Vitsy + * sh + JavaScript , 33 26 21 18 bytes

O Vitsy não possui recuperação de data / hora nativa, então tive que usar shell e avaliação para este.

Obrigado a @Caleb por me ajudar a cortar outros 3 bytes!

'Y%+ etad',Dca*-HZ

'Y%+ etad'               Push the string 'date +"%Y"' to the stack.
          ,              Execute through shell. 
           Dca*-         Dupe n, push n - 120.
                H        Pop x, y, push range(x, y) to the stack.
                 Z       Output all stack as characters.

Você não pode tentar este online, porque ele usa shell e eval.

A saída é como códigos de caracteres.


Você deve aparar alguns bytes disso porque não precisa de aspas duplas ao redor da string de formato de data (já que não há espaços nela); date +%Yfunciona muito bem.
Caleb

@ Caleb Perfeito, obrigado! Tornou a necessidade de um JS eval inexistente também.
precisa saber é o seguinte

5

Linguagem Mathematica / Wolfram, 28 bytes

Date[][[1]]-#&/@Range[0,120]

Bem-vindo ao PPCG!
Addison Crump

4
Bem-vindo ao PPCG! Você não precisa usar um mapa aqui, pois a subtração é encadeada automaticamente sobre as listas. E -Range@121+1salva um byte sobre a lista baseada em zero. E #&@@um byte acabou [[1]]. Dito isto, a menos que indicado de outra forma no desafio, todos os envios devem ser funções ou programas completos, e esse código é apenas um trecho / expressão. A correção mais curta seria torná-la uma função sem nome acrescentando &.
Martin Ender

@MartinEnder Obrigado pelo feedback! Eu deveria ter pego o Minus sendo capaz de listar, um lapso mental menor, mas as outras dicas são muito apreciadas!
User6014

#&@@Date[]-#&/@0~Range~120&você economizará dois bytes, mas, para torná-la uma função, é necessário adicionar &o final (que eu acho que o seu precisa), portanto, -1 bytes no total.
numbermaniac

5

R, 47 39 bytes

as.double(substr(Sys.Date(),1,4))-0:120

Se apenas alguém inventasse uma implementação UTF-8 de R com funções do sistema frequentemente abreviadas convenientemente ...

UPD: eliminou 7 (!) Bytes devido ao plannapus , que sugeriu a sub-ação de um 0:120vetor em vez de contar de aaté (a-120)1 byte para o usuário5957401 , que notou que isso doubletambém funcionaria numeric. Versão antiga:

a=as.numeric(format(Sys.Date(),"%Y"));a:(a-120)

Brincar com e seq(a<-...,a-120)só pode piorar a situação.
Andreï Kostyrka 11/08/16

usar o comando forçar tipo em as.doublevez de as.numericeconomizará um byte. Da mesma forma, se em vez de formatar uma data, você tratar a resposta data como uma corda para puxar e usar substr(Sys.Date(),1,4)você salvar outro byte
user5957401

5

MATL , 10 bytes

1&Z'0:120-

Experimente online!

1&Z'      % Push first component of "clock" vector, which is year
0:120     % Literal vector [0, 1, 2, ..., 120]
-         % Subtract element-wise. Implicitly display


4

php, 73 66 58 42 bytes

<?=implode(', ',range($j=date(Y),$j-120));

Saída:

2016, 2015, 2014, 2013, 2012, 2011, 2010, 2009, 2008, 2007, 2006, 2005, 2004, 2003, 2002, 2001, 2000, 1999, 1998, 1997, 1996, 1995, 1995, 1994, 1993, 1992, 1991, 1990, 1989, 1988, 1987, 1986, 1985, 1984, 1983, 1982, 1981, 1980, 1979, 1978, 1977, 1976, 1975, 1974, 1973, 1972, 1971, 1970, 1969, 1968, 1967, 1966, 1965, 1964, 1963, 1962, 1961, 1960, 1959, 1958, 1957, 1956, 1955, 1954, 1953, 1952, 1951, 1950, 1949, 1948, 1948, 1947, 1946, 1945, 1944, 1943, 1942, 1941, 1940, 1939, 1938, 1937, 1936, 1935, 1934, 1933, 1932, 1931, 1930, 1929, 1928, 1928, 1927, 1926, 1925, 1924, 1923, 1922, 1921, 1920, 1919, 1918, 1917, 1916, 1915, 1914, 1913, 1912, 1911, 1910, 1909, 1908, 1907, 1906, 1905, 1904, 1903, 1902, 1902, 1901, 1900, 1899, 1898, 1897, 1896

Se não precisarmos nos separar ,, 58 57 41 bytes:

<?=implode(' ',range($j=date(Y),$j-120));

Obrigado a insertusernamehere por salvar 16 bytes


Você realmente não precisa se separar ,, veja muitas das outras respostas.
precisa saber é o seguinte

Parece que sim, mas eu vou colocar em duas opções para que eu possa fazer o que a maioria são, e também o que foi solicitado
gabe3886

Consegui obter a resposta de vírgula no tamanho original da resposta que não é vírgula. Isso é tanto como eu acho que posso golf-lo
gabe3886

Você pode remover a <?phpetiqueta, pois permitimos a execução -rgratuita de #
Business Cat

2
Golf off 16 bytes :<?=implode(', ',range($j=date(Y),$j-120));
insertusernamehere

4

Python 2, 64 62 54 bytes

import time
n=time.gmtime()[0]
exec'print n;n-=1;'*121

@KarlKastor obrigado por 8 bytes!


time.gmtime().tm_yearé 3 bytes mais curto
KarlKastor 11/11

time.gmtime()[0]ainda menor
KarlKastor 11/11

@KarlKastor nice! Brincar com o módulo de tempo é como entrar em um labirinto todas as vezes para mim. Tantas maneiras de se perder
atlasologist

4

PostgreSQL, 57 bytes

Quem precisa de FROM:-). Provavelmente não deve funcionar, mas funciona, tente no sqlfiddle

select date_part('y',current_date)-generate_series(0,120)

4

Bash no OS X, 23

jot 121 `date +%Y` - -1

Isso também irá trabalhar em Linux, se você tem BSD jotinstalada (por exemplo sudo apt-get install athena-jot.


3

Python 2, 62 bytes

import time
for n in range(121):print int(time.ctime()[-4:])-n

E a 64 bytes:

for n in range(121):print int(__import__("time").ctime()[-4:])-n

3

Oracle SQL 11.2, 111 bytes

SELECT LISTAGG(TO_CHAR(SYSDATE,'YYYY')-LEVEL+1,', ')WITHIN GROUP(ORDER BY LEVEL)FROM DUAL CONNECT BY LEVEL<122;

11
Eu seria tentado a dizer o o listagg não é necessária e apenas o conjunto de linhas ordenadas
MickyT

3

Processando, 51 42 41 bytes

for(int i=0;i<121;)print(year()-i+++" ");

Ungolfed

for(int i = 0; i < 121;)
    print(year() - i++ + " ");

O processamento é apenas um invólucro para Java, se você não soubesse, e retira a maior parte do clichê, portanto a solução óbvia também é super curta em comparação com uma versão Java. Também abre uma janela para desenhar gráficos, mas isso não parece me desqualificar :)


11
for(int i=0;i<121;)print(year()-i+++" ");
Leaky Nun

Eu amo o "+++", parece tão suspeito. Obrigado pela sugestão!
Cody

3

MATLAB, 18 bytes

Assumindo que o formato de saída não importa (além da ordem decrescente), o programa a seguir imprime os últimos 121 anos começando com o atual.

year(date)-(0:120)

Requer MATLAB versão r2014a ou superior. As versões anteriores não incluíam a yearfunção.


3

JavaScript, 55 52 50 49 bytes

for(a=d=s=Date().substr(11,4);d-->s-120;)a+=" "+d

+9 bytes alertnos dados (não é necessário se você o executar em um console).

for(a=d=s=Date().substr(11,4);d-->s-120;)a+=" "+d;alert(a)

-4 bytes se o delimitador não for necessário.

for(a=d=s=Date().substr(11,4);d-->s-120;)a+=d

for (a = d = s = Date().substr(11, 4); d --> s - 120; )
    a += " " + d;
console.log(a);


11
Os []s parecem ser desnecessários.
Neil

@ Neil: Obrigado. Minha solução original usava uma matriz, mas não pensei em removê-la.
precisa saber é o seguinte

11
Você pode salvar um byte usando um em forvez whiledisso for(a=d=s=Date().substr(11,4);d-->s-120;)a+=" "+d:!
Dom Hastings

3

C, 87 85 76 74 65 bytes

main(int i,char**v){for(i=0;i<121;printf("%d,",atoi(v[1])-i++));}

Ungolfed:

main(int i,char**v){
    for(i = 0; i < 121; printf("%d,", atoi(v[1])-i++));
}

Meu primeiro código de golfe - Qualquer ponteiro seria bem recebido. Seria bom se eu pudesse cortar o argc / argv lixo, mas não tenho que qualificados um programador C. Melhorias são bem-vindas.

EDIT : O ano atual é obtido a partir da linha de comando - especificamente por um grupo de bebedouros automatizados e bem treinados.

EDIT 2 : 85 bytes Graças a Easterly Irk (espaços removidos em torno dos parâmetros de função arg)

EDIT 3 : 76 bytes Agradecimentos a anatolyg por apontar o óbvio (nomes de parâmetros detalhados removidos argc / argv)

EDIT 4 : 74 bytes Graças a Yay295 (char ** v, delimitador de ano alterado)

EDIT 5 : 65 bytes graças a Yay295 e matt (reutilizou a variável i, removeu a variável x, alterou while para for loop, printf atualizado para incluir atoi () read e i ++)


11
Você não pode um espaço? int argc, char-> int argc,char?
Rɪᴋᴇʀ

2
Substitua argcpor c(ou melhor substitua int argcpor apenas int) e argvpor v. Substitua também whilepor for. A última alteração requer alguma experiência em C (mas pode ser divertida, independentemente).
precisa saber é

11
char*v[]-> char**veconomiza 1 byte. Você pode salvar outro, delimitando seus anos com um espaço ou vírgula, em vez de uma nova linha.
precisa saber é o seguinte

11
Você pode torná-lo mais curto. 71 bytes. principal (int c, char ** v) {int i = 0; while (i <120) printf ( "% d", atoi (v [1]) - i ++);}
Mt

2
Ainda mais curto. 65 bytes main(int i,char**v){for(i=0;i<121;printf("%d,",atoi(v[1])-i++));}
Matt

3

JavaScript, 60 53 48 bytes

f=x=>x>Date().split` `[3]-121&&(alert(x),f(x-1))

Eu usei uma solução recursiva.


11
Você pode substituir console.logpor alerte remover o último ;.
NoOneIsHere

11
Economize 5 bytes com f=x=>x>Date().split" "[3]-121&&(alert(x),f(x-1)), substituindo as aspas por reticulares.
Shaggy

2

Perl, 33 bytes

say+(gmtime)[5]-$_+1900for 0..120

Executar com -M5.010ou -E:

perl -E 'say+(gmtime)[5]-$_+1900for 0..120'

2

k, 27 bytes

Saída conforme especificado

1@", "/:$(`year$.z.d)-!121;

Exemplo:

k)1@", "/:$(`year$.z.d)-!121;
2016, 2015, 2014, 2013, 2012, 2011, 2010, 2009, 2008, 2007, 2006, 2005, 2004, 2003, 2002, 2001, 2000, 1999, 1998, 1997, 1996, 1995, 1994, 1993, 1992, 1991, 1990, 1989, 1988, 1987, 1986, 1985, 1984, 1983, 1982, 1981, 1980, 1979, 1978, 1977, 1976, 1975, 1974, 1973, 1972, 1971, 1970, 1969, 1968, 1967, 1966, 1965, 1964, 1963, 1962, 1961, 1960, 1959, 1958, 1957, 1956, 1955, 1954, 1953, 1952, 1951, 1950, 1949, 1948, 1947, 1946, 1945, 1944, 1943, 1942, 1941, 1940, 1939, 1938, 1937, 1936, 1935, 1934, 1933, 1932, 1931, 1930, 1929, 1928, 1927, 1926, 1925, 1924, 1923, 1922, 1921, 1920, 1919, 1918, 1917, 1916, 1915, 1914, 1913, 1912, 1911, 1910, 1909, 1908, 1907, 1906, 1905, 1904, 1903, 1902, 1901, 1900, 1899, 1898, 1897, 1896

Ele pode ser encurtado ainda mais, não formatando a saída e retornando apenas a lista de números inteiros:

(`year$.z.d)-!121

2

jq, 46 caracteres

(Código de 45 caracteres + opção de linha de comando de 1 caractere)

now|strftime("%Y")|tonumber|range(.;.-121;-1)

Exemplo de execução:

bash-4.3$ jq -n 'now|strftime("%Y")|tonumber|range(.;.-121;-1)' | head
2016
2015
2014
2013
2012
2011
2010
2009
2008
2007

Teste on-line


2

Vim, 32 29 pressionamentos de tecla

Agradecemos a @daniero por alguma ajuda para salvar algumas teclas e tornar a saída um pouco melhor.

"=strftime('%Y')<Enter>pqqYp<Ctrl-x>q118@q
  • <Enter> é Enter
  • <Ctrl-x>é Ctrl+X

Explicação:

"                                          # Put into the register {
 =strftime('%Y')                           #   This year in YYYY form
                <Enter>                    # }
                       p                   # Paste the register
                        qq                 # Record macro q {
                          Y                #   Yank (copy) the current line
                           p               #   Paste
                            <Ctrl-x>       #   Decrment number at cursor
                                    q      # }
                                     118@q # Do macro q 118 times

Formato de saída:

Cada número está em uma linha separada, como abaixo.

2016
2015
.
.
.
1898
1897

O OP pede claramente uma versão preparada para o futuro, portanto, apenas a segunda responde à pergunta. Você não precisa pressionar a tecla Enter (geralmente chamada de <CR>contexto Vim) depois :pu=strftime('%Y')? Além disso, você pode pular algumas teclas pressionando usando Ycópias a linha inteira. No total: :pu=strftime('%Y')<CR>qqYp<Ctrl-x>q118@q- 30 teclas digitadas
daniero

Além disso, você pode arrancar a partir do =registo: "=strftime('%Y')<CR>pqqYp<Ctrl-x>q118@q- 29 teclas, e torna-se livrar da primeira linha vazia
daniero

Se você também pode usar o shell, poderá salvar mais cinco pressionamentos de tecla com o dateutilitário::.!date +\%Y<CR>qqYp<C-x>q118@q
John Gowers 15/16
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.