Перелік можливих років народження живих людей


40

Змагання

Виведіть список років, який починається з поточного року та закінчується 120 років тому. Рік народження кожної живої людини буде включений до цього списку.

Деталі

Список має бути у порядку зменшення.

Дозволяється кожна вбудована функція для управління масивами та / або списками.

Виграє найкоротший код у байтах.

При запуску цього року результат буде

2016, 2015, ..., 1897, 1896

При запуску наступного року результат буде

2017, 2016, ..., 1898, 1897

І т.д.

Оновлення

  • Деякі запитали про формат списку. Як більшість здогадалися, це не має значення. Вставте будь-який роздільник між числами. Інтуїтивно найбільше вставлено кома або пробіл або обидва, новий рядок або вивести масив.
  • Квазі надлюдини, як Жанна Калмент , є винятком із правила, викладеного в моєму запитанні.

7
Я рекомендую пісочниці отримати зворотній зв'язок перед тим, як опублікувати виклик (не тільки для вашого першого виклику - більшість з нас використовує його для кожного виклику).
трихоплакс

3
Я не бачу нічого поганого в цьому виклику. Одне, що, можливо, варто уточнити, чи слід завжди починати вихід з 2016 року або з року, в якому він працює (чи розпочнеться він з 2017 року, якщо буде запущений у наступному році?). Це вплине на те, чи це фіксований вихідний виклик, чи потрібно отримати доступ до поточної дати.
трихоплакс

19

10
Лад, це було занадто рано прийняти.
Аддісон Кримп

6
Чи є викликом: "Роздрукувати всі числа від y- 120 до y" чи "надрукувати всі роки народження живих людей"? Тому що, якщо хтось, народжений у 1896 році, сьогодні живий, це не означає, що ще є люди з 1898 року.
CompuChip

Відповіді:


19

Пайк, 6 байт

wC7m-

Спробуйте тут!

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

(Після wцього кодова точка для 153 є, але її не можна друкувати)


1
Ого, це була швидка галочка. Може, зачекати на відповідь Желе?
Adám

Хоча я погоджуюся, що це була швидка галочка, я сумніваюся, навіть Jelly може це зробити в 5
Blue

Чому у вас є змінна для 121? Просто тому, що це квадратне число? Але молодець!
Денкер

3
wНа насправді має нецензурні байти після цього , що робить його 121
Синій

1
@LeakyNun це налаштовується, незалежно від типового для сервера, на якому він працює. На pyke.catbus я встановив його на Windows-1252
Blue

11

Pyth, 11 9 8 байт

-L.d3C\y

Працює, зіставляючи діапазон [0...120]і віднімаючи кожне число з поточного року. Діапазон будується неявно, використовуючи 121як аргумент карти. Щоб уникнути розділяє пробіл між .d3і 121ми отримуємо це число шляхом перетворення yв це елемент коду.
Дякуємо @FryAmTheEggman за те, що придумали такий підхід!

Спробуйте тут!

Старе 9-байтове рішення:

_>121S.d3

Спробуйте тут!

Будує діапазон [1...<current year>]і приймає лише останні 121 його елемент.


1
Ви повинні перевернути список, щоб він розпочався з поточного року
Крістіан Вестербек,

1
-L...економить кілька байт.
Якубе

1
@ChristiaanWesterbeek пропустив цю частину, виправлено. Дякуємо, що помітили!
Денкер

@Jakube Використовував інший підхід зараз, але дякую за нагадування про те, що це існує, останній раз Pyt не використовував багато!
Денкер

1
-L.d3C\yповинні працювати для 8.
FryAmTheEggman

9

R, 34 байти

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

Дивіться тут про онлайн-перекладача.

Редагування За допомогою використання можна зменшити до 33 байт substr.

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

але технічно це рішення працюватиме лише до 9999-12-31.


3
Це круто. Я не знав, що це може ввести рядок у число при використанні :оператора ...
Андрей Костирка,

8

AngularJS + Lodash , 274 байт

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

Вихідні дані

enter image description here



7

CJam, 14 12 11 байт

Збережено 2 байти завдяки Sp3000 та 1 байт завдяки Мартіну Ендеру

et0=121,f-p

Спробуйте в Інтернеті!

Пояснення

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 байт

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

Безголовки:

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.

Показано список 2016 року до 1896 року:

2016 to 1896


Відредагована відповідь, щоб отримати поточний рік з калькулятора.
Калеб Павло


6

PowerShell, 26 24 байти

Вдосконалена версія @TimmyD:

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

Було:

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

куди dateбіжитьGet-Date


1
Blargh, повинен був відповісти раніше. Саме таку пряму версію я підготував. Тоді робота заважала: веселою версією DA також буде ((date).year..0)[0..120]:; на жаль, це не коротше.
Joey

1
Мені цікаво, що дата еквівалентна даті отримання, коли дата насправді не є псевдонімом Get-Date. Я бачив це, що називається правилом "мається на увазі дієслово", і воно рідко коли-небудь задокументоване в літературі PowerShell.
Бево

@Bevo Це корисно для CodeGolf, але трохи ризиковано для будь-якого іншого використання. Дивіться: codegolf.stackexchange.com/a/778/571 та ланцюжок коментарів; вона і схильна називати сутички, і дуже повільна.
TessellatingHeckler

6

Діалог APL , 11 10 байт

120↑⌽⍳⊃⎕ts

120↑ візьміть 120 елементів

оберненого

індекси до

перший елемент

⎕TS Часова мітка у форматі [РРРР, M, D, год, м, с, т]

СпробуйтеAPL онлайн!


Стара версія:

(⊃⎕TS)-⍳120

⊃⎕TS перший елемент [YYYY, M, D, h, m, s, t]

- мінус

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

Вимагає ⎕IO←0, що для багатьох систем за замовчуванням.

СпробуйтеAPL онлайн!


6

Vitsy + * sh + JavaScript , 33 26 21 18 байт

У Віті немає власного пошуку часу / дати, тому мені довелося використовувати shell та eval для цього.

Дякуємо @Caleb за те, що він допомагає мені зняти ще 3 байти!

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

Ви не можете спробувати це в Інтернеті, оскільки він використовує оболонку AND eval.

Вихідні дані є кодовими символами.


Ви повинні мати можливість обрізати пару байтів від цього, оскільки вам не потрібні подвійні лапки навколо рядка формату дати (оскільки в ньому немає пробілів); date +%Yпрацює просто чудово.
Калеб

@Caleb Ідеально, дякую! Виникла потреба в JS eval також неіснуючою.
Аддісон Кримп

5

Мова математики / Вольфрам, 28 байт

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

Ласкаво просимо до PPCG!
Аддісон Кримп

4
Ласкаво просимо до PPCG! Тут вам не потрібно використовувати карту, оскільки віднімання автоматично перетягується на списки. І -Range@121+1зберігає байт над списком на основі нуля. І #&@@байт понад [[1]]. Сказане, якщо в виклику не вказано інше, всі подання повинні бути функціями або повноцінними програмами, і цей код є лише фрагментом / виразом. Найкоротшим виправленням було б зробити його неназваною функцією шляхом додавання &.
Мартін Ендер

@MartinEnder Дякую за відгук! Я мав би зловив Мінус за можливістю списку, незначний розумовий проміжок, але інші поради високо оцінені!
user6014

#&@@Date[]-#&/@0~Range~120&заощадить у вас два байти, але для того, щоб зробити його функцією, потрібно додати &кінець (що, на мою думку, вашому все одно потрібно), так що загалом -1 байт.
numbermaniac

5

R, 47 39 байт

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

Якщо тільки хтось винайшов реалізацію UTF-8 R із зручно скороченими часто використовуваними системними функціями ...

UPD: відголив 7 (!) Байтів завдяки планнапусу , який запропонував підтягувати 0:120вектор, а не рахувати від та aдо (a-120)1 байтової гри для користувача5957401 , який помітив, що doubleтак само буде працювати numeric. Стара версія:

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

Сповивання навколо і seq(a<-...,a-120)може лише погіршити ситуацію.
Андрей Костирка

використання команди forcing типу as.doubleзамість as.numeric, заощадить вам байт. Аналогічно, якщо замість форматування дати ви розглядаєте відповідь дати як рядок, з якого витягнете і використовуєте, substr(Sys.Date(),1,4)ви зберігаєте інший байт
user5957401



4

php, 73 66 58 42 байт

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

Вихід:

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

Якщо нам не потрібно розділяти ,, 58 58 41 байт:

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

Завдяки вставцікористувача збережено 16 байт


Вам не потрібно розлучатися ,, подивіться на багато інших відповідей.
Аддісон Кримп

Це виглядає саме так, але я поставлю два варіанти, щоб я міг зробити те, що більшість є, а також те, що вимагали
gabe3886

Мені вдалося згорнути відповідь на коми через свій початковий розмір відповіді без коми. Це стільки, скільки я думаю, що я можу це
пограти в

Ви можете видалити <?phpтег, оскільки ми дозволяємо працювати з -rбезкоштовно
Business Cat

2
Гольф - 16 байт :<?=implode(', ',range($j=date(Y),$j-120));
Вставтекористувач

4

Python 2, 64 62 54 байт

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

@KarlKastor дякую за 8 байт!


time.gmtime().tm_yearна 3 байти коротше
KarlKastor

time.gmtime()[0]ще коротше
КарлКастор

@KarlKastor приємно! Гра з модулем часу - це як щоразу для мене ходити в лабіринт. Стільки способів заблукати
атласолог

4

PostgreSQL, 57 байт

Кому потрібно FROM:-). Напевно, це не повинно працювати, але так, спробуйте на sqlfiddle

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

4

Bash на ОС X, 23

jot 121 `date +%Y` - -1

Це також буде працювати на Linux , якщо у вас є BSD jotвстановлені (наприклад sudo apt-get install athena-jot.


3

Python 2, 62 байти

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

І на 64 байти:

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

3

Oracle SQL 11.2, 111 байт

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

1
Мені б сподобалося сказати, що список не потрібен, а лише набір впорядкованих рядків
MickyT

3

Обробка, 51 42 41 байт

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

Безумовно

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

Обробка - це просто обгортка для Java, якщо ви цього не знали, і забирає більшу частину котлованної панелі, тому очевидне рішення також є дуже коротким порівняно з версією Java. Також відкривається вікно для малювання графіки, але те, що, здається, не дискваліфікує мене :)


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

Мені подобається "+++", це виглядає так підозріло. Дякую за пропозицію!
Коді

3

MATLAB, 18 байт

Якщо припустимо, що вихідний формат не має значення (окрім порядку зменшення порядку), наступна програма друкує останні 121 рік, починаючи з поточного.

year(date)-(0:120)

Тут потрібна версія MATLAB r2014a або вище. Раніші версії не включали цю yearфункцію.


3

JavaScript, 55 52 50 49 байт

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

+9 байт для alertданих (не потрібно, якщо ви запускаєте це в консолі).

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

-4 байти, якщо роздільник не потрібен.

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
В []s - мабуть, немає необхідності.
Ніл

@Neil: Дякую Моє оригінальне рішення використовувало масив, але я не думав його видаляти.
Yay295

1
Ви можете зберегти один байт, використовуючи forзамість whileцього for(a=d=s=Date().substr(11,4);d-->s-120;)a+=" "+d:!
Дом Гастінгс

3

C, 87 85 76 74 65 байт

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

Безголовки:

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

Мій перший гольф-код - Будь-які вказівники будуть добре сприйняті. Було б добре, якби я міг вирізати sms / argv smenk, але я не такий кваліфікований програміст на C. Поліпшення вітаються.

EDIT : поточний рік отриманий з командного рядка - конкретно групою автоматизованих, добре навчених питних птахів.

EDIT 2 : 85 байт Завдяки Easterly Irk (видалено пробіли навколо параметрів функції arg)

EDIT 3 : 76 байт Завдяки anatolyg за вказівку очевидних (вилучені багатослівні аргументи argc / argv назви парам)

EDIT 4 : 74 байт Завдяки Yay295 (char ** v, змінений рік роздільник)

EDIT 5 : 65 байт завдяки Yay295 та matt (повторно використана змінна i, видалена змінна x, змінена в той час, як для циклу, оновлений printf для включення atoi () read та i ++)


1
Ти не можеш простору? int argc, char-> int argc,char?
Rɪᴋᴇʀ

2
Замініть argcна c(або краще замініть int argcпросто int) та argvна v. Також замініть whileна for. Остання зміна вимагає певного досвіду роботи на C (але може бути цікавим незалежно).
anatolyg

1
char*v[]-> char**vекономить 1 байт. Можна зберегти інший, обмеживши свої роки пробілом або комою, а не новим рядком.
Yay295

1
Ви можете зробити його коротшим. 71 байт. main (int c, char ** v) {int i = 0; while (i <120) printf ("% d", atoi (v [1]) - i ++);}
Метт

2
Ще коротше. 65 байт main(int i,char**v){for(i=0;i<121;printf("%d,",atoi(v[1])-i++));}
Метт

3

JavaScript, 60 53 48 байт

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

Я використовував рекурсивний розчин.


1
Ви можете замінити console.logз alert, і видалити останній ;.
NoOneIsHere

1
Збережіть 5 байтів f=x=>x>Date().split" "[3]-121&&(alert(x),f(x-1)), замінивши лапки на зворотні.
Кудлатий

2

Perl, 33 байти

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

Виконати з -M5.010або -E:

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

2

k, 27 байт

Вихід, як зазначено

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

Приклад:

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

Його можна скоротити, не відформатувавши вихід і просто повернувши список цілих чисел:

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

2

jq, 46 символів

(45 символів код + 1 символ командного рядка)

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

Проба зразка:

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

On-line тест


2

Vim, 32 29 натискань клавіш

Завдяки @daniero за деяку допомогу щодо збереження деяких натискань клавіш та створення результату трохи акуратніше.

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

Пояснення:

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

Формат виводу:

Кожне число знаходиться в окремому рядку, як нижче.

2016
2015
.
.
.
1898
1897

ОП чітко просить майбутню версію, тож на запитання відповідає лише друга. Чи не потрібно після цього натискати клавішу Enter (звичайно називається <CR>в контексті Vim) :pu=strftime('%Y')? Крім того, ви можете пропустити деякі натискання клавіш, використовуючи Yз копіями весь рядок. Всього: :pu=strftime('%Y')<CR>qqYp<Ctrl-x>q118@q- 30 натискань на клавіші
daniero

Крім того, ви можете зірвати з =реєстру: "=strftime('%Y')<CR>pqqYp<Ctrl-x>q118@q- 29 натискань клавіш, і це позбудеться першого порожнього рядка
daniero

Якщо вам також дозволяється використовувати оболонку, ви можете зберегти ще п’ять натискань клавіш dateутилітою::.!date +\%Y<CR>qqYp<C-x>q118@q
Джон Гоуерс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.