Elenco di possibili anni di nascita di esseri umani viventi


40

La sfida

Stampa un elenco di anni che inizia con l'anno in corso e termina 120 anni fa. L'anno di nascita di ogni essere umano vivente sarebbe incluso in questo elenco.

Dettagli

L'elenco dovrebbe essere in ordine decrescente.

È consentita ogni funzione integrata per manipolare matrici e / o elenchi.

Vince il codice più breve in byte.

Se eseguito quest'anno, l'output sarebbe

2016, 2015, ..., 1897, 1896

Quando eseguito il prossimo anno l'output sarebbe

2017, 2016, ..., 1898, 1897

Eccetera.

Aggiornare

  • Alcuni hanno chiesto informazioni sul formato dell'elenco. Come molti hanno intuito, non importa. Inserisci un separatore tra i numeri. Intuitivamente la maggior parte ha inserito una virgola o uno spazio o entrambi, newline o output un array.
  • Quasi i superumani come Jeanne Calment sono un'eccezione alla regola dichiarata nella mia domanda.

7
Raccomando la sandbox per ricevere feedback prima di pubblicare una sfida (non solo per la tua prima sfida, la maggior parte di noi la utilizza per ogni sfida).
trichoplax,

3
Non vedo nulla di sbagliato in questa sfida. Una cosa che potrebbe essere utile specificare è se l'output dovrebbe sempre iniziare con il 2016 o con l'anno in cui viene eseguito (inizierà con il 2017 se verrà eseguito il prossimo anno?). Ciò influenzerà se si tratta di una sfida di output fisso o se deve accedere alla data corrente.
trichoplax,

19
Jeanne Louise Calment visse 122 anni.
Zenadix,

10
Ragazzo, era troppo presto per accettare.
Addison Crump,

6
La sfida è: "Stampa tutti i numeri da y- 120 a y" o "Stampa tutti gli anni di nascita delle persone viventi"? Perché se qualcuno nato nel 1896 è vivo oggi, ciò non significa che ci siano ancora persone del 1898 in giro.
CompuChip

Risposte:


19

Pyke, 6 byte

wC7m-

Provalo qui!

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

(Dopo w, il punto di codice per 153 è presente ma non è stampabile)


1
Wow, quello era un segno di spunta veloce. Forse aspettare una risposta Jelly?
Adám,

Mentre sono d'accordo è stato un segno di spunta veloce, dubito che anche Jelly possa farlo in 5
Blue

Perché hai una variabile per 121? Solo perché è un numero quadrato? Ma ben fatto!
Denker,

3
In wrealtà ha successivamente un byte non stampabile che lo rende 121
Blue

1
@LeakyNun è configurabile, qualunque sia l'impostazione predefinita per il server su cui è in esecuzione. Su pyke.catbus, l'ho impostato su Windows-1252
Blue

11

Pyth, 11 9 8 byte

-L.d3C\y

Funziona mappando sull'intervallo [0...120]e sottraendo ogni numero dall'anno corrente. L'intervallo viene creato implicitamente utilizzando 121come argomento della mappa. Per evitare uno spazio bianco di separazione tra .d3e 121otteniamo questo numero convertendolo ynel suo punto di codice.
Grazie a @FryAmTheEggman per aver escogitato questo approccio!

Provalo qui!

Vecchia soluzione a 9 byte:

_>121S.d3

Provalo qui!

Costruisce la gamma [1...<current year>]e ne prende solo gli ultimi 121 elementi.


1
Dovresti invertire la lista in modo che inizi con l'anno in corso
Christiaan Westerbeek l'

1
-L...salva qualche byte.
Jakube,

1
@ChristiaanWesterbeek Ha perso quella parte, risolto. Grazie per aver individuato!
Denker,

@Jakube Adesso ha usato un approccio diverso, ma grazie per il promemoria che esiste, non ha usato molto Pyth nell'ultima volta!
Denker,

1
-L.d3C\ydovrebbe funzionare per 8.
FryAmTheEggman l'

9

R, 34 byte

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

Vedi qui su un interprete online.

Modifica Potrebbe essere ridotto a 33 byte utilizzando substr.

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

ma tecnicamente questa soluzione funzionerà solo fino al 9999-12-31.


3
Questo e spettacolare. Non sapevo che si potesse scrivere una stringa in un numero quando si utilizza l' :operatore ...
Andreï Kostyrka,

8

AngularJS + Lodash , 274 byte

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

Produzione

enter image description here


8

BASH + coreutils, 35 33 byte

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

2
nel tuo caso, le virgolette non sono necessarie: cambia: date +"%Y"indate +%Y
Olivier Dulac l'

1
x=`date +%Y`;seq $x -1 $[x-120]o seq $[x=`date +%Y`] -1 $[x-120]funziona pure.
Dennis,

10 byte in meno se si dispone di OSX o si è disposti a installare jotsu Linux
Digital Trauma

7

CJam, 14 12 11 byte

Salvato 2 byte grazie a Sp3000 e 1 byte grazie a Martin Ender

et0=121,f-p

Provalo online!

Spiegazione

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 byte

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.

Mostra un elenco del 2016 fino al 1896:

2016 to 1896


Risposta modificata per ottenere l'anno corrente dal calcolatore.
Caleb Paul,

6

05AB1E , 8 7 byte

Codice:

žg120Ý-

Spiegazione:

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

Utilizza la codifica CP-1252 . Provalo online! .


6

PowerShell, 26 24 byte

@TimmyD versione migliorata:

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

Era:

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

dove datecorreGet-Date


1
Blargh, avrebbe dovuto rispondere prima. Questa è esattamente la versione semplice che avevo preparato. Poi lavoro interferito: divertente versione DA sarebbe anche: ((date).year..0)[0..120]; purtroppo non è più corto.
Joey,

1
Trovo interessante che la data sia equivalente a Get-Date quando la data in realtà non è un alias di Get-Date. Ho visto questo chiamato la regola del "verbo implicito" ed è raramente documentato nella letteratura di PowerShell.
Bevo,

@Bevo È utile per CodeGolf, ma un po 'rischioso per qualsiasi altro uso. Vedi: codegolf.stackexchange.com/a/778/571 e catena di commenti; è sia incline a nominare gli scontri sia molto lento.
TessellatingHeckler

6

Dyalog APL , 11 10 byte

120↑⌽⍳⊃⎕ts

120↑ prendi 120 elementi

del rovesciato

indici fino al

il primo elemento di

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

ProvaAPL online!


Vecchia versione:

(⊃⎕TS)-⍳120

⊃⎕TS primo elemento di [AAAA, M, D, h, m, s, t]

- meno

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

Richiede ⎕IO←0 , che è predefinito su molti sistemi.

ProvaAPL online!


6

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

Vitsy non ha il recupero nativo di data / ora, quindi ho dovuto usare shell ed eval per questo.

Grazie a @Caleb per avermi aiutato a eliminare altri 3 byte!

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

Non puoi provarlo online, perché usa sia shell che eval.

L'output è come codici carattere.


Dovresti essere in grado di tagliare un paio di byte da questo perché non hai bisogno delle doppie virgolette attorno alla stringa del formato della data (poiché non ci sono spazi); date +%Yfunziona benissimo.
Caleb,

@Caleb Perfetto, grazie! Ha reso inesistente anche la necessità di un JS eval.
Addison Crump,

5

Mathematica / Wolfram Language, 28 byte

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

Benvenuti in PPCG!
Addison Crump,

4
Benvenuti in PPCG! Non è necessario utilizzare una mappa qui poiché la sottrazione viene automaticamente inserita negli elenchi. E -Range@121+1salva un byte sull'elenco in base zero. E #&@@un byte oltre [[1]]. Detto questo, se non diversamente indicato nella sfida, tutte le comunicazioni devono essere funzioni o programmi completi e questo codice è semplicemente un frammento / espressione. La soluzione più breve sarebbe renderla una funzione senza nome aggiungendo &.
Martin Ender,

@MartinEnder Grazie per il feedback! Avrei dovuto accorgermi che Minus era in grado di elencare, un lieve ritardo mentale, ma gli altri consigli sono molto apprezzati!
user6014

#&@@Date[]-#&/@0~Range~120&ti farà risparmiare due byte, ma per renderlo una funzione è necessario aggiungere &l'end alla fine (di cui penso comunque il tuo abbia bisogno), quindi -1 byte in totale.
numbermaniac,

5

R, 47 39 byte

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

Se solo qualcuno inventasse un'implementazione UTF-8 di R con funzioni di sistema usate frequentemente abbreviate ...

UPD: rasato 7 (!) Byte a causa del plannapus , che ha suggerito di sottrarre un 0:120vettore piuttosto che contare da aa (a-120)e 1 byte con un utente5957401 , che ha notato che doubleavrebbe funzionato bene numeric. Vecchia versione:

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

Giocherellare e non seq(a<-...,a-120)può che peggiorare la situazione.
Andreï Kostyrka,

l'utilizzo del comando forzatura del tipo as.doubleinvece di as.numericti farà risparmiare un byte. Allo stesso modo, se invece di formattare una data, trattate la risposta della data come una stringa da cui estrarre e usate substr(Sys.Date(),1,4)salvate un altro byte
user5957401

5

MATL , 10 byte

1&Z'0:120-

Provalo 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 byte

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

Produzione:

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

Se non abbiamo bisogno di separarci con ,, quindi 58 57 41 byte:

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

Grazie a insertusernamehere per il salvataggio di 16 byte


Non hai davvero bisogno di separarti ,, guarda molte delle altre risposte.
Addison Crump,

Sembra così, ma
inserirò

Sono riuscito a ottenere la risposta virgola fino alla mia dimensione di risposta originale non virgola. Questo è quanto penso di poterlo giocare a golf
gabe3886,

Puoi rimuovere il <?phptag poiché consentiamo di utilizzarlo -rgratuitamente
Business Cat

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

4

Python 2, 64 62 54 byte

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

@KarlKastor grazie per 8 byte!


time.gmtime().tm_yearè più corto di 3 byte
KarlKastor l'

time.gmtime()[0]ancora più breve
KarlKastor l'

@KarlKastor nice! Giocare con il modulo temporale è come camminare in un labirinto ogni volta per me. Tanti modi per perdersi
atlantologo l'

4

PostgreSQL, 57 byte

Chi ha bisogno di un FROM:-). Probabilmente non dovrebbe funzionare, ma lo fa, provalo su sqlfiddle

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

4

Bash su OS X, 23

jot 121 `date +%Y` - -1

Funzionerà anche su Linux se hai jotinstallato BSD (es sudo apt-get install athena-jot.


3

Python 2, 62 byte

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

E a 64 byte:

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

3

Oracle SQL 11.2, 111 byte

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

1
Sarei tentato di dire che il listagg non è richiesto e solo l'insieme delle righe ordinate
MickyT

3

Elaborazione, 51 42 41 byte

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

Ungolfed

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

L'elaborazione è solo un wrapper per Java se non lo sapevi, e porta via la maggior parte della piastra di caldaia, quindi la soluzione ovvia è anche super breve rispetto a una versione Java. Apre anche una finestra per il disegno di grafica, ma avere ciò non sembra squalificarmi :)


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

Adoro il "+++", sembra così sospetto. Grazie per il suggerimento!
Cody,

3

MATLAB, 18 byte

Supponendo che il formato di output non abbia importanza (a parte l'ordine discendente), il seguente programma stampa gli ultimi 121 anni a partire da quello corrente.

year(date)-(0:120)

Richiede la versione MATLAB r2014a o successiva. Le versioni precedenti non includevano la yearfunzione.


3

JavaScript, 55 52 50 49 byte

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

+9 byte ai alertdati (non necessario se si esegue questo in una console).

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

-4 byte se il delimitatore non è necessario.

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


1
I []s sembrano essere inutili.
Neil,

@Neil: grazie. La mia soluzione originale utilizzava un array, ma non avevo pensato di rimuoverlo.
Yay295,

1
È possibile salvare un byte usando a foranziché whilesu questo for(a=d=s=Date().substr(11,4);d-->s-120;)a+=" "+d:!
Dom Hastings,

3

C, 87 85 76 74 65 byte

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

Il mio primo codice golf - Eventuali indicazioni sarebbero ben accette. Sarebbe bello se potessi tagliare la spazzatura argc / argv, ma io non sono che abile programmatore C. Miglioramenti benvenuti.

EDIT : l'anno in corso è ottenuto dalla riga di comando, in particolare da un gruppo di uccelli potatori automatizzati e ben addestrati.

MODIFICA 2 : 85 byte Grazie a Easterly Irk (rimossi gli spazi attorno ai parametri della funzione arg)

MODIFICA 3 : 76 byte Grazie ad anatolyg per aver sottolineato l'ovvio (rimossi i nomi dei parametri argc / argv dettagliati)

MODIFICA 4 : 74 byte Grazie a Yay295 (carattere ** v, delimitatore anno modificato)

EDIT 5 : 65 byte grazie a Yay295 e matt (riutilizzato la variabile i, rimossa la variabile x, modificata mentre in per il ciclo, aggiornato printf per includere atoi () read e i ++)


1
Non puoi uno spazio? int argc, char-> int argc,char?
Rɪᴋᴇʀ

2
Sostituisci argccon c(o meglio sostituisci int argccon solo int) e argvcon v. Sostituisci anche whilecon for. Quest'ultima modifica richiede una certa esperienza in C (ma può essere divertente a prescindere).
Anatolyg

1
char*v[]-> char**vsalva 1 byte. Puoi salvarne un altro delimitando i tuoi anni con uno spazio o una virgola anziché una nuova riga.
Yay 295,

1
Puoi renderlo più breve. 71 byte. main (int c, char ** v) {int i = 0; while (i <120) printf ("% d,", atoi (v [1]) - i ++);}
Matt,

2
Ancora più breve. 65 byte main(int i,char**v){for(i=0;i<121;printf("%d,",atoi(v[1])-i++));}
Matt,

3

JavaScript, 60 53 48 byte

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

Ho usato una soluzione ricorsiva.


1
È possibile sostituire console.logcon alerte rimuovere l'ultimo ;.
NoOneIsHere

1
Salva 5 byte con f=x=>x>Date().split" "[3]-121&&(alert(x),f(x-1)), sostituendo le virgolette con i backtick.
Shaggy,

2

Perl, 33 byte

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

Esegui con -M5.010o -E:

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

2

k, 27 byte

Uscita come specificato

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

Esempio:

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

Può essere abbreviato maggiormente non formattando l'output e semplicemente restituendo l'elenco di numeri interi:

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

2

jq, 46 caratteri

(Codice 45 caratteri + opzione riga comandi 1 carattere)

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

Esecuzione di esempio:

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

Test online


2

Vim, 32 29 sequenze di tasti

Grazie a @daniero per l'aiuto nel salvare alcuni tasti e rendere l'output un po 'più ordinato.

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

Spiegazione:

"                                          # 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 di output:

Ogni numero è su una riga separata come di seguito.

2016
2015
.
.
.
1898
1897

OP richiede chiaramente una versione a prova di futuro, quindi solo la seconda risponde alla domanda. Non hai bisogno di premere il tasto Invio (comunemente indicato come <CR>nel contesto di Vim) dopo :pu=strftime('%Y')? Inoltre, puoi saltare alcune sequenze di tasti usando Ycon le copie dell'intera riga. In totale: :pu=strftime('%Y')<CR>qqYp<Ctrl-x>q118@q- 30 sequenze di tasti
daniero

Inoltre, puoi strappare dal =registro: "=strftime('%Y')<CR>pqqYp<Ctrl-x>q118@q- 29 sequenze di tasti e si elimina la prima riga vuota
daniero

Se ti è consentito usare anche la shell, puoi salvare altre cinque sequenze di tasti con l' dateutilità::.!date +\%Y<CR>qqYp<C-x>q118@q
John Gowers,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.