Список возможных лет рождения живых людей

40

Соревнование

Выведите список лет, который начинается с текущего года и заканчивается 120 лет назад. Год рождения каждого живого человека будет включен в этот список.

Детали

Список должен быть в порядке убывания.

Разрешены все встроенные функции для манипулирования массивами и / или списками.

Самый короткий код в байтах побеждает.

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

2016, 2015, ..., 1897, 1896

При запуске в следующем году результат будет

2017, 2016, ..., 1898, 1897

И т.п.

Обновить

  • Некоторые спрашивали о формате списка. Как многие уже догадались, это не имеет значения. Вставьте любой разделитель между числами. Интуитивно интуитивно большинство вставляет запятую или пробел или оба, перевод строки или вывод массива.
  • Квази сверхчеловеки, такие как Жанна Калмент, являются исключением из правила, изложенного в моем вопросе.
Кристиан Вестербик
источник
7
Я рекомендую « песочницу» для получения обратной связи перед публикацией запроса (не только для вашей первой задачи - большинство из нас использует ее для каждой задачи).
Трихоплакс,
3
Я не вижу ничего плохого в этом вызове. Одна вещь, которую стоит уточнить, это то, должен ли выход всегда начинаться с 2016 года или с года, в котором он выполняется (начнется ли он с 2017 года, если он будет запущен в следующем году?). Это будет влиять на то, является ли это фиксированным выходным заданием или необходимо получить доступ к текущей дате.
Трихоплакс,
19
Жанна Луиза Калмент прожила 122 года.
Zenadix
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
Вау, это была быстрая галочка. Может быть, ждать ответа желе?
адам
Хотя я согласен, что это была быстрая галочка, я сомневаюсь, что даже Желе сможет сделать это в 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 элемент.

Denker
источник
1
Вы должны перевернуть список так, чтобы он начинался с текущего года
Кристиан Вестербик
1
-L...сохраняет несколько байтов.
Якуб
1
@ChristiaanWesterbeek Пропустил эту часть, исправлено. Спасибо, что заметили!
Денкер
@Jakube Использовал другой подход сейчас, но спасибо за напоминание о том, что он существует, в последнее время не очень часто использовал Pyth!
Денкер
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.

plannapus
источник
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}}

Выход

введите описание изображения здесь

ТЫ
источник
8

BASH + coreutils, 35 33 байта

x=`date +%Y`;seq $x -1 $((x-120))
Джо
источник
2
в вашем случае цитаты не нужны: change: date +"%Y"intodate +%Y
Оливье Дюлак
1
x=`date +%Y`;seq $x -1 $[x-120]или seq $[x=`date +%Y`] -1 $[x-120]работает так же.
Деннис
На 10 байт короче, если у вас OSX или вы хотите установить jotна Linux
Digital Trauma
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

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.

Отображение списка 2016 года до 1896 года:

С 2016 по 1896

Калеб Пол
источник
Отредактированный ответ, чтобы получить текущий год из калькулятора.
Калеб Пол
6

05AB1E , 8 7 байт

Код:

žg120Ý-

Объяснение:

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

Использует кодировку CP-1252 . Попробуйте онлайн! ,

Аднан
источник
6

PowerShell, 26 24 байта

@TimmyD улучшенная версия:

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

Был:

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

куда dateбежитGet-Date

TessellatingHeckler
источник
1
Blargh, должен был ответить раньше. Это именно простая версия, которую я подготовил. Тогда на работу вмешивались: DA прикольная версия тоже будет ((date).year..0)[0..120]:; увы это не короче.
Джои
1
Мне интересно, что дата эквивалентна Get-Date, когда дата на самом деле не является псевдонимом Get-Date. Я видел это как правило «подразумеваемого глагола», и оно редко когда-либо документируется в литературе по PowerShell.
Бево
@Bevo Это полезно для CodeGolf, но немного рискованно для любого другого использования. См. Codegolf.stackexchange.com/a/778/571 и цепочку комментариев; это оба склонны к именным столкновениям и очень медленные.
TessellatingHeckler
6

Дьялог АПЛ , 11 10 байт

120↑⌽⍳⊃⎕ts

120↑ взять 120 элементов

из обращенного

индексы до

первый элемент

⎕TS Отметка времени в формате [ГГГГ, М, Д, ч, м, с, т]

Попробуй APL онлайн!


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

(⊃⎕TS)-⍳120

⊃⎕TS первый элемент [ГГГГ, М, Д, ч, м, с, т]

- минус

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

Вы не можете попробовать это онлайн, потому что он использует и оболочку И eval.

Вывод в виде кодов символов.

Аддисон Крамп
источник
Вы должны быть в состоянии обрезать пару байтов, потому что вам не нужны двойные кавычки вокруг строки формата даты (так как в ней нет пробелов); date +%Yработает просто отлично.
Калеб
@Caleb Отлично, спасибо! Сделано так, что необходимость в JS eval также отсутствует.
Эддисон Крамп
5

Mathematica / Wolfram Language, 28 байтов

Date[][[1]]-#&/@Range[0,120]
user6014
источник
Добро пожаловать в PPCG!
Эддисон Крамп,
4
Добро пожаловать в PPCG! Вам не нужно использовать карту здесь, так как вычитание автоматически пронизывает списки. И -Range@121+1сохраняет байт в списке с нулями. И #&@@байт закончился [[1]]. Тем не менее, если в заявке не указано иное, все представления должны быть функциями или полными программами, а этот код является просто фрагментом / выражением. Самое короткое исправление - добавление функции без имени &.
Мартин Эндер
@MartinEnder Спасибо за отзыв! Я должен был поймать Минуса, будучи в списке, незначительное умственное отклонение, но другие советы очень ценятся!
user6014
#&@@Date[]-#&/@0~Range~120&сэкономит вам два байта, но затем превращение в функцию требует добавления &конца (что, я думаю, вам в любом случае нужно), так что всего -1 байт.
Числовой маньяк
5

R, 47 39 байт

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

Если бы только кто-то изобрел реализацию R в UTF-8 с удобно сокращенными часто используемыми системными функциями ...

UPD: сбрил 7 (!) Байтов благодаря plannapus , который предложил подрубить 0:120вектор вместо подсчета от aдо (a-120)и 1 байт grâce user5957401 , который заметил, что это doubleбудет работать так же хорошо numeric. Старая версия:

a=as.numeric(format(Sys.Date(),"%Y"));a:(a-120)
Андрей Костырка
источник
Возиться с и seq(a<-...,a-120)может только ухудшить ситуацию.
Андрей Костырка
использование команды type forcing as.doubleвместо as.numericвас сэкономит байт. Точно так же, если вместо форматирования даты вы обрабатываете ответ даты как строку, из которой substr(Sys.Date(),1,4)
извлекаете данные,
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, 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, 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 57 41 байт:

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

Спасибо insertusername здесь за сохранение 16 байт

gabe3886
источник
Вам не нужно расставаться ,, посмотрите на многие другие ответы.
Эддисон Крамп,
Это выглядит так, но я добавлю два варианта, чтобы я мог сделать то, что большинство, а также то, что было запрошено
gabe3886
Мне удалось получить ответ через запятую до исходного размера ответа без запятой. Это столько, сколько я думаю, я могу
сыграть в
Вы можете удалить <?phpтег, так как мы разрешаем работать с ним -rбесплатно
Business Cat
2
Гольф от 16 байтов :<?=implode(', ',range($j=date(Y),$j-120));
insertusername здесь
4

Python 2, 64 62 54 байта

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

@KarlKastor спасибо за 8 байтов!

atlasologist
источник
time.gmtime().tm_yearна 3 байта короче
KarlKastor
time.gmtime()[0]еще короче
KarlKastor
@KarlKastor приятно! Играть с модулем времени для меня все равно, что ходить в лабиринт каждый раз. Так много способов заблудиться
атласолог
4

PostgreSQL, 57 байт

Кому нужен FROM:-). Вероятно, не должно работать, но это так, попробуйте в sqlfiddle

select date_part('y',current_date)-generate_series(0,120)
MickyT
источник
4

Bash на OS 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+++" ");

Ungolfed

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

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

Cody
источник
1
for(int i=0;i<121;)print(year()-i+++" ");
Утренняя монахиня
Я люблю "+++", это выглядит так подозрительно. Спасибо за предложение!
Коди
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);

Yay295
источник
1
С []кажутся ненужными.
Нил
@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++));}

Ungolfed:

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

Мой первый кодовый гольф - Любые указатели были бы хорошо приняты. Было бы неплохо, если бы я мог вырезать мусор argc / argv, но я не такой квалифицированный программист С. Улучшения приветствуются.

РЕДАКТИРОВАТЬ : Текущий год получен из командной строки - в частности, группой автоматизированных, хорошо обученных пьющих птиц.

РЕДАКТИРОВАТЬ 2 : 85 байт, благодаря Easterly Irk (убраны пробелы вокруг параметров функции arg)

РЕДАКТИРОВАТЬ 3 : 76 байт. Спасибо Анатолигу за то, что он указал на очевидные (удаленные подробные названия параметров argc / argv)

РЕДАКТИРОВАТЬ 4 : 74 байта благодаря Yay295 (символ ** v, измененный разделитель года)

РЕДАКТИРОВАТЬ 5 : 65 байт благодаря Yay295 и matt (повторно использовал переменную i, удалил переменную x, изменил время цикла for, обновил printf, включив чтение atoi () и i ++)

schil227
источник
1
Вы не можете пробел? int argc, char-> int argc,char?
Rɪᴋᴇʀ
2
Заменить argcна c(или лучше заменить int argcпросто int) и argvна v. Также заменить whileна for. Последнее изменение требует некоторого опыта в Си (но может быть забавным независимо).
Анатолий
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))

Я использовал рекурсивное решение.

Huntro
источник
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

к, 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

Он-лайн тест

manatwork
источник
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 нажатий клавиш, и это избавит от первой пустой строки
Даньеро
Если вам разрешено использовать и оболочку, вы можете сохранить еще пять нажатий клавиш с помощью dateутилиты::.!date +\%Y<CR>qqYp<C-x>q118@q
Джон Гауэрс