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


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.