Lista możliwych lat urodzenia żywych ludzi


40

Wyzwanie

Wydrukuj listę lat, które zaczynają się od bieżącego roku i kończą 120 lat temu. Rok urodzenia każdego żyjącego człowieka zostanie włączony do tej listy.

Detale

Lista powinna być w kolejności malejącej.

Każda wbudowana funkcja do manipulowania tablicami i / lub listami jest dozwolona.

Najkrótszy kod w bajtach wygrywa.

Po uruchomieniu w tym roku wynik byłby

2016, 2015, ..., 1897, 1896

Po uruchomieniu w przyszłym roku wynik byłby

2017, 2016, ..., 1898, 1897

Itp.

Aktualizacja

  • Niektórzy pytali o format listy. Jak większość zgadła, to nie ma znaczenia. Wstaw dowolny separator między liczbami. Intuicyjnie większość wstawia przecinek lub spację albo oba, znak nowej linii lub wypisuje tablicę.
  • Quasi nadludzi tacy jak Jeanne Calment są wyjątkiem od reguły podanej w moim pytaniu.

7
Polecam piaskownicę do uzyskania opinii przed opublikowaniem wyzwania (nie tylko dla pierwszego wyzwania - większość z nas używa go do każdego wyzwania).
trichoplax

3
Nie widzę nic złego w tym wyzwaniu. Jedną z rzeczy, które warto określić, jest to, czy wyjście powinno zawsze zaczynać się od 2016 r., Czy od roku, w którym zostanie uruchomione (czy zacznie się od 2017 r., Jeśli zostanie uruchomione w przyszłym roku?). Wpłynie to na to, czy jest to stałe wyzwanie wyjściowe, czy też trzeba uzyskać dostęp do bieżącej daty.
trichoplax,

19
Jeanne Louise Calment żyła 122 lata.
Zenadix,

10
Chłopcze, to było zbyt wcześnie na akceptację.
Addison Crump,

6
Czy wyzwanie: „Wydrukuj wszystkie liczby od y- 120 do y” lub „wydrukuj wszystkie lata narodzin żywych ludzi”? Ponieważ jeśli ktoś urodzony w 1896 roku żyje dzisiaj, nie oznacza to, że są jeszcze ludzie z 1898 roku.
CompuChip

Odpowiedzi:


19

Pyke, 6 bajtów

wC7m-

Wypróbuj tutaj!

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

(Po wtym kod współrzędnych dla 153 jest obecny, ale nie można go wydrukować)


1
Wow, to był szybki znacznik wyboru. Może poczekać na odpowiedź galaretki?
Adám

Chociaż zgadzam się, że był to szybki znacznik wyboru, wątpię, aby nawet Jelly mogła to zrobić w 5
Blue

Dlaczego masz zmienną dla 121? Tylko dlatego, że jest to liczba kwadratowa? Ale dobrze zrobione!
Denker,

3
wFaktycznie ma bajt którym nie można drukować potem sprawia, że 121
Niebieski

1
@LeakyNun jest konfigurowalny, bez względu na domyślny serwer, na którym działa. W pyke.catbus ustawiłem go na Windows-1252
Blue

11

Pyth, 11 9 8 bajtów

-L.d3C\y

Działa poprzez mapowanie zakresu [0...120]i odejmowanie każdej liczby od bieżącego roku. Zakres jest budowany niejawnie przy użyciu 121jako argumentu mapy. Aby uniknąć oddzielania białych znaków od .d3i 121otrzymujemy ten numer, konwertując ygo na jego kod.
Dzięki @FryAmTheEggman za wymyślenie tego podejścia!

Wypróbuj tutaj!

Stare 9-bajtowe rozwiązanie:

_>121S.d3

Wypróbuj tutaj!

Buduje zakres [1...<current year>]i bierze tylko ostatnie 121 elementów.


1
Powinieneś odwrócić listę, aby zaczynała się od bieżącego roku
Christiaan Westerbeek,

1
-L...oszczędza kilka bajtów.
Jakube,

1
@ChristiaanWesterbeek Brakowało tej części, naprawiono. Dzięki za wykrycie!
Denker,

@Jakube Użyłem teraz innego podejścia, ale dzięki za przypomnienie, że tak jest, ostatnio nie używałem Pytha!
Denker,

1
-L.d3C\ypowinien działać dla 8.
FryAmTheEggman

9

R, 34 bajty

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

Zobacz tutaj na tłumacza online.

Edytuj Można zmniejszyć do 33 bajtów za pomocą substr.

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

ale technicznie to rozwiązanie będzie działać tylko do 9999-12-31.


3
To jest niesamowite. Nie wiedziałem, że może on rzutować ciąg znaków na liczbę podczas korzystania z :operatora ...
Andreï Kostyrka

8

AngularJS + Lodash , 274 bajty

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

Wydajność

wprowadź opis zdjęcia tutaj



7

CJam, 14 12 11 bajtów

Zaoszczędzono 2 bajty dzięki Sp3000 i 1 bajt dzięki Martinowi Enderowi

et0=121,f-p

Wypróbuj online!

Wyjaśnienie

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 bajtów

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

Nie golfowany:

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.

Pokazuje listę 2016 aż do 1896:

2016 do 1896


Edytowana odpowiedź, aby pobrać bieżący rok z kalkulatora.
Caleb Paul,

6

05AB1E , 8 7 bajtów

Kod:

žg120Ý-

Wyjaśnienie:

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

Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .


6

PowerShell, 26 24 bajtów

@TimmyD ulepszona wersja:

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

Był:

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

gdzie datedziałaGet-Date


1
Blargh, powinien był wcześniej odpowiedzieć. To jest dokładnie prosta wersja, którą przygotowałem. Następnie praca przeszkadzała: DA zabawa wersja będzie również ((date).year..0)[0..120]:; niestety nie jest krótszy.
Joey,

1
Interesujące jest dla mnie to, że data jest równoważna z Get-Date, kiedy data nie jest aliasem dla Get-Date. Widziałem tę zasadę zwaną „czasownikiem domyślnym” i rzadko jest to udokumentowane w literaturze PowerShell.
Bevo,

@Bevo Jest to przydatne dla CodeGolf, ale trochę ryzykowne dla każdego innego zastosowania. Zobacz: codegolf.stackexchange.com/a/778/571 i łańcuch komentarzy; jest zarówno podatna na konflikty nazw, jak i bardzo powolna.
TessellatingHeckler

6

Dyalog APL , 11 10 bajtów

120↑⌽⍳⊃⎕ts

120↑ weź 120 elementów

odwróconego

wskaźniki do

pierwszy element

⎕TS Znacznik czasu w formacie [RRRR, M, D, h, m, s, t]

Wypróbuj APL online!


Stara wersja:

(⊃⎕TS)-⍳120

⊃⎕TS pierwszy element [RRRR, M, D, h, m, s, t]

- minus

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

Wymaga ⎕IO←0, co jest domyślne w wielu systemach.

Wypróbuj APL online!


6

Vitsy + * sh + JavaScript , 33 26 21 18 bajtów

Vitsy nie ma natywnego pobierania daty / godziny, więc musiałem użyć powłoki i eval do tego.

Dzięki @Caleb za pomoc w ścinaniu kolejnych 3 bajtów!

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

Nie możesz wypróbować tego online, ponieważ używa zarówno powłoki ORAZ eval.

Dane wyjściowe są w postaci kodów znaków.


Powinieneś być w stanie usunąć z tego kilka bajtów, ponieważ nie potrzebujesz podwójnych cudzysłowów wokół ciągu formatu daty (ponieważ nie ma w nim spacji); date +%Ydziała dobrze.
Caleb,

@Caleb Idealne, dzięki! Sprawiło, że również nie istniała ewaluacja JS.
Addison Crump,

5

Język Mathematica / Wolfram, 28 bajtów

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

Witamy w PPCG!
Addison Crump,

4
Witamy w PPCG! Nie musisz tutaj używać mapy, ponieważ odejmowanie jest automatycznie dzielone na listy. I -Range@121+1zapisuje bajt na liście zerowej. I #&@@bajt skończony [[1]]. To powiedziawszy, chyba że wyzwanie stanowi inaczej, wszystkie zgłoszenia muszą być funkcjami lub pełnymi programami, a ten kod jest jedynie fragmentem / wyrażeniem. Najkrótszą poprawką byłoby uczynienie z niej funkcji nienazwanej przez dodanie &.
Martin Ender,

@MartinEnder Dziękujemy za opinię! Powinienem był przyłapać Minusa na liście, niewielkie mentalne wygaśnięcie, ale inne wskazówki są bardzo mile widziane!
user6014,

#&@@Date[]-#&/@0~Range~120&pozwoli ci zaoszczędzić dwa bajty, ale wtedy uczynienie go funkcją wymaga dodania &na końcu (co, jak sądzę, i tak potrzebuje), więc w sumie -1 bajt.
numbermaniac

5

R, 47 39 bajtów

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

Gdyby tylko ktoś wynalazł implementację R dla UTF-8 z wygodnie skracanymi często używanymi funkcjami systemowymi ...

UPD: zgolił 7 (!) Bajtów dzięki plannapusowi , który zasugerował podciągnięcie 0:120wektora zamiast liczenia od ado (a-120)i 1 bajta grâce à user5957401 , który zauważył, że doubleto zadziała równie dobrze numeric. Stara wersja:

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

Bawiąc się i seq(a<-...,a-120)może tylko pogorszyć sytuację.
Andreï Kostyrka,

użycie polecenia forcing typu as.doublezamiast as.numericoszczędza bajt. Podobnie, jeśli zamiast formatować datę, traktujesz odpowiedź daty jako ciąg znaków, z którego chcesz pobrać i substr(Sys.Date(),1,4)zapisujesz kolejny bajt
użytkownik5957401

5

MATL , 10 bajtów

1&Z'0:120-

Wypróbuj 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 bajtów

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

Wynik:

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

Jeśli nie musimy się rozdzielać ,, to 58 57 41 bajtów:

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

Dzięki inserttusernamehere do zapisania 16 bajtów


Naprawdę nie trzeba się rozdzielać ,, spójrz na wiele innych odpowiedzi.
Addison Crump,

Wygląda to w ten sposób, ale
ustawię

Udało mi się sprowadzić odpowiedź na przecinek do mojego pierwotnego rozmiaru bez przecinka. To tyle, ile myślę, że mogę grać w golfa
gabe3886,

Możesz usunąć <?phptag, ponieważ zezwalamy na bieganie -rza darmo
Business Cat

2
Golf poza 16 bajtami :<?=implode(', ',range($j=date(Y),$j-120));
insertsersernamehere

4

Python 2, 64 62 54 bajtów

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

@KarlKastor dzięki za 8 bajtów!


time.gmtime().tm_yearjest o 3 bajty krótszy
KarlKastor

time.gmtime()[0]jeszcze krótszy
KarlKastor

@KarlKastor nice! Zabawa z modułem czasu jest dla mnie jak wchodzenie do labiryntu za każdym razem. Tyle sposobów na zgubienie
atlasolog

4

PostgreSQL, 57 bajtów

Kto potrzebuje FROM:-). Prawdopodobnie nie powinno działać, ale tak, spróbuj w sqlfiddle

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

4

Bash na OS X, 23

jot 121 `date +%Y` - -1

Działa to również w systemie Linux, jeśli masz jotzainstalowany BSD (np sudo apt-get install athena-jot.


3

Python 2, 62 bajty

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

A przy 64 bajtach:

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

3

Oracle SQL 11.2, 111 bajtów

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

1
Chciałbym pokusić się o stwierdzenie, że lista nie jest wymagana, a jedynie zestaw uporządkowanych wierszy
MickyT,

3

Przetwarzanie, 51 42 41 bajtów

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

Bez golfa

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

Przetwarzanie jest tylko opakowaniem dla Javy, jeśli jeszcze tego nie wiesz, i zabiera większość podstawki, więc oczywiste rozwiązanie jest również bardzo krótkie w porównaniu do wersji Java. Otwiera także okno do rysowania grafiki, ale nie wydaje mi się, że dyskwalifikuje mnie :)


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

Uwielbiam „+++”, wygląda podejrzanie. Dzieki za sugestie!
Cody

3

MATLAB, 18 bajtów

Zakładając, że format wyjściowy nie ma znaczenia (poza kolejnością malejącą), następujący program drukuje ostatnie 121 lat, poczynając od bieżącego.

year(date)-(0:120)

Wymaga MATLAB w wersji r2014a lub wyższej. Wcześniejsze wersje nie zawierały tej yearfunkcji.


3

JavaScript, 55 52 50 49 bajtów

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

+9 bajtów do alertdanych (nie jest to konieczne, jeśli uruchomisz to w konsoli).

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

-4 bajty, jeśli separator nie jest konieczny.

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
Do []s wydają się być zbędne.
Neil,

@Neil: Dzięki. Moje oryginalne rozwiązanie wykorzystywało tablicę, ale nie myślałem o jej usunięciu.
Yay295,

1
Możesz zapisać jeden bajt, używając forzamiast whiletego for(a=d=s=Date().substr(11,4);d-->s-120;)a+=" "+d:!
Dom Hastings,

3

C, 87 85 76 74 65 bajtów

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

Nie golfowany:

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

Mój pierwszy kod golfowy - Wszelkie wskazówki zostaną dobrze przyjęte. Byłoby miło, gdybym mógł wyciąć śmieci argc / argv, ale nie jestem tak wykwalifikowanym programistą C. Ulepszenia mile widziane.

EDYCJA : Bieżący rok jest uzyskiwany z wiersza poleceń - szczególnie przez grupę zautomatyzowanych, dobrze wyszkolonych ptaków pijących.

EDYCJA 2 : 85 bajtów Dzięki Easterly Irk (usunięto spacje wokół parametrów funkcji arg)

EDYCJA 3 : 76 bajtów Dzięki anatoligowi za wskazanie oczywistych (usunięte pełne nazwy argc / argv param)

EDYCJA 4 : 74 bajty Dzięki Yay295 (char ** v, zmieniono separator roku)

EDYCJA 5 : 65 bajtów dzięki Yay295 i mattowi (ponownie użyłem zmiennej i, usunąłem zmienną x, zmieniono while for for loop, zaktualizowano printf, aby zawierał odczyt atoi () i i ++)


1
Nie możesz zrobić miejsca? int argc, char-> int argc,char?
Rɪᴋᴇʀ

2
Zamień argcna c(lub lepiej zastąp int argcna just int) i argvprzez v. Zastąp również whileprzez for. Ta ostatnia zmiana wymaga nieco doświadczenia w C (ale może być świetną zabawą).
anatolyg

1
char*v[]-> char**vzapisuje 1 bajt. Możesz uratować inną, ograniczając swoje lata spacją lub przecinkiem zamiast nowej linii.
Yay295,

1
Możesz go skrócić. 71 bajtów. main (int c, char ** v) {int i = 0; while (i <120) printf ("% d,", atoi (v [1]) - i ++);}
Matt

2
Jeszcze krótszy. 65 bajtów main(int i,char**v){for(i=0;i<121;printf("%d,",atoi(v[1])-i++));}
Mat.

3

JavaScript, 60 53 48 bajtów

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

Użyłem rozwiązania rekurencyjnego.


1
Można wymienić console.logz alerti usunąć ostatni ;.
NoOneIsHere

1
Zaoszczędź 5 bajtów f=x=>x>Date().split" "[3]-121&&(alert(x),f(x-1)), zastępując cudzysłowy odwrotnymi znakami.
Kudłaty

2

Perl, 33 bajty

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

Uruchom z -M5.010lub -E:

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

2

k, 27 bajtów

Dane wyjściowe zgodnie z opisem

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

Przykład:

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

Można go bardziej skrócić, nie formatując danych wyjściowych i po prostu zwracając listę liczb całkowitych:

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

2

jq, 46 znaków

(Kod 45 znaków + opcja wiersza poleceń 1 znak)

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

Przykładowy przebieg:

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 klawiszy

Podziękowania dla @daniero za pomoc w zapisywaniu niektórych naciśnięć klawiszy i poprawianiu wydajności.

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

Wyjaśnienie:

"                                          # 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

Format wyjściowy:

Każda liczba znajduje się w osobnej linii, jak poniżej.

2016
2015
.
.
.
1898
1897

OP wyraźnie prosi o wersję na przyszłość, więc tylko druga odpowiada na pytanie. Czy nie musisz później wciskać klawisza Enter (często nazywanego tak jak <CR>w kontekście Vima) :pu=strftime('%Y')? Możesz także pominąć niektóre naciśnięcia klawiszy, używając Yz kopiami całej linii. Łącznie: :pu=strftime('%Y')<CR>qqYp<Ctrl-x>q118@q- 30 naciśnięć klawiszy
daniero

Możesz także szarpać z =rejestru: "=strftime('%Y')<CR>pqqYp<Ctrl-x>q118@q- 29 naciśnięć klawiszy i pozbywa się pierwszej pustej linii
daniero

Jeśli możesz również używać powłoki, możesz zaoszczędzić pięć kolejnych naciśnięć klawiszy za pomocą datenarzędzia::.!date +\%Y<CR>qqYp<C-x>q118@q
John Gowers
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.