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


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 элемент.


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.


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

Выход

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



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

PowerShell, 26 24 байта

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

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

Был:

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

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


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]

Добро пожаловать в 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

Мне удалось получить ответ через запятую до исходного размера ответа без запятой. Это столько, сколько я думаю, я могу
— сыграть в

Вы можете удалить <?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 байтов!


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)

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. Также открывается окно для рисования графики, но наличие этого, кажется, не дисквалифицирует меня :)


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


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


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

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


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

Он-лайн тест


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
— Джон Гауэрс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.