活着的人可能的出生年份清单


40

挑战

输出从当前年份开始到120年前结束的年份列表。每个活着的人的出生年份将包括在此列表中。

细节

该列表应按降序排列。

允许使用每个内置函数来操纵数组和/或列表。

以字节为单位的最短代码获胜。

今年运行时,输出为

2016, 2015, ..., 1897, 1896

明年运行时,输出为

2017, 2016, ..., 1898, 1897

等等。

更新资料

  • 有些人询问了列表的格式。正如大多数人所猜测的,这无关紧要。在数字之间插入任何分隔符。直观上,大多数情况下插入逗号或空格或两者,换行符或输出数组。
  • 珍妮·卡门特(Jeanne Calment)等准超人是我问题中提到的规则的例外。

7
我建议使用沙箱在发布挑战之前获得反馈(不仅仅是针对您的第一个挑战-我们大多数人都将其用于每个挑战)。
trichoplax

3
我认为这项挑战没有任何问题。可能需要说明的一件事是,输出是应该始终从2016年开始还是以其运行的年份开始(如果明年运行,它将以2017年开始吗?)。这将影响是固定输出挑战还是需要访问当前日期。
trichoplax


10
老兄,这还为时过早。
艾迪生·克伦普

6
是挑战:“将所有数字从y-120 y打印到”还是“打印所有在世人员的出生年份”?因为如果一个1896年出生的人今天还活着,那并不意味着仍然有1898年左右的人。
CompuChip

Answers:


19

Pyke,6个字节

wC7m-

在这里尝试!

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

(之后w,存在153的代码点,但无法打印)


1
哇,那是个快速的勾号。也许等待果冻的答案?
阿达姆,2013年

虽然我同意这是一个快速的复选标记,但我也怀疑果冻是否能在5年内做到这一点
Blue Blue

为什么会有121的变量?只是因为它是一个平方数?但是做得好!
Denker

3
w实际上后来有一个不可打印的字节,使得它121

1
@LeakyNun它是可配置的,无论运行它的服务器的默认值如何。在pyke.catbus上,我将其设置为Windows-1252
蓝色

11

Pyth,11 9 8字节

-L.d3C\y

通过映射范围[0...120]并从当前年份中减去每个数字来工作。范围是通过121用作map参数隐式构建的。为避免在之间使用空格.d3121我们通过转换y为它的代码点来获得此数字。
感谢@FryAmTheEggman提出了这种方法!

在这里尝试!

旧的9字节解决方案:

_>121S.d3

在这里尝试!

建立范围[1...<current year>],仅接受范围的最后121个元素。


1
您应该反转列表,以便从当年开始
Christiaan Westerbeek

1
-L...保存一些字节。
雅库布

1
@ChristiaanWesterbeek错过了那部分,已修复。感谢您的发现!
Denker

@Jakube现在使用了一种不同的方法,但是要提醒您,这个方法确实存在,在上一次没有太多使用Pyth!
Denker

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
这太棒了。我不知道使用的时候它可以强制转换一个字符串为许多:运营商...
安德烈KOSTYRKA

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
在您的情况下,不需要引用:更改: date +"%Y"变为date +%Y
Olivier Dulac

1
x=`date +%Y`;seq $x -1 $[x-120]seq $[x=`date +%Y`] -1 $[x-120]也可以。
丹尼斯

如果您有OSX或愿意jot在Linux 上安装,则短10字节
Digital Trauma

7

CJam,14 12 11字节

Sp3000节省了2个字节,Martin Ender节省了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至1896


编辑答案以从计算器获取当前年份。
卡勒布·保罗

6

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

在哪里dateGet-Date


1
布拉赫,应该早点回答。那正是我准备的简单版本。然后工作受到干扰:DA有趣的版本也将是:((date).year..0)[0..120]; las,它并不短。
乔伊,

1
我发现有趣的是,当日期实际上不是Get-Date的别名时,日期就等于Get-Date。我见过这种称为“隐式动词”规则,在PowerShell文献中很少有记载。
Bevo

@Bevo对CodeGolf很有用,但在其他用途​​上会有点冒险。参见:codegolf.stackexchange.com/a/778/571和评论链;它既容易发生名称冲突,又非常慢。
TessellatingHeckler,2016年

6

Dyalog APL11个10 字节

120↑⌽⍳⊃⎕ts

120↑ 带120个元素

反转的

索引直到

第一个要素

⎕TS 时间戳记,格式为[YYYY,M,D,h,m,s,t]

在线尝试APL!


旧版本:

(⊃⎕TS)-⍳120

⊃⎕TS [YYYY,M,D,h,m,s,t]的第一个元素

- 减去

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

要求⎕IO←0,这是许多系统上的默认设置。

在线尝试APL!


6

Vitsy + * sh + JavaScript33 26 21 18字节

Vitsy没有本地时间/日期检索功能,因此我不得不为此使用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.

您无法在线尝试使用此命令,因为它同时使用了shell和eval。

输出为字符代码。


您应该能够对此减少一些字节,因为您不需要在日期格式字符串周围加上双引号(因为其中没有空格);date +%Y效果很好。
迦勒

@Caleb完美,谢谢!也不存在对JS eval的需求。
艾迪生·克伦普

5

Mathematica / Wolfram语言,28个字节

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

欢迎来到PPCG!
艾迪生·克伦普

4
欢迎来到PPCG!您无需在此处使用地图,因为减法会自动遍历列表。并-Range@121+1在基于零的列表上保存一个字节。还有#&@@一个字节[[1]]。也就是说,除非在挑战中另有说明,否则所有提交都必须是函数或完整程序,并且此代码仅是片段/表达式。最短的解决方法是通过添加使其成为未命名的函数&
马丁·恩德

@MartinEnder感谢您的反馈!我应该让Minus具有列表能力,轻微的心理失误,但其他提示非常感谢!
user6014

#&@@Date[]-#&/@0~Range~120&会为您节省两个字节,但是要使其成为函数,则需要&在末尾添加(我认为您仍然需要),因此总共为-1个字节。
numbermaniac

5

R,47 39字节

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

如果只有某人发明了R的UTF-8实现并带有经常使用的缩写系统功能...

UPD:由于plannapus减少了7(!)字节,建议删除一个0:120向量,而不是从ato到(a-120)1字节计数àuser5957401,后者注意到该double方法同样适用numeric。旧版本:

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

随便摆弄,seq(a<-...,a-120)只会使情况恶化。
安德烈·科斯蒂卡(AndreïKostyrka)

使用type force命令as.double代替as.numeric会节省一个字节。同样,如果您不格式化日期,而是将日期响应视为要从中提取的字符串,并使用substr(Sys.Date(),1,4)它保存了另一个字节
user5957401

5

MATL,10字节

1&Z'0:120-

在线尝试!

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字节

<?=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、1897、1896

如果我们不需要用分隔,,则58 57 41个字节:

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

感谢insertusernamehere节省了16个字节


您实际上不需要与分开,,看看许多其他答案。
艾迪生·克伦普

看起来是这样,但我会输入两个选项,以便我可以执行大多数操作,也可以执行所要求的操作
gabe3886 '16

我设法将逗号的答案减小到了原来的非逗号答案的大小。这就是我认为可以打高尔夫球的范围
gabe3886 '16

您可以删除<?php,因为我们允许标签与运行-r免费
商业猫

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

@KarlKastor真好!玩时间模块对我来说就像每次走进迷宫一样。这么多迷路的方法
地图学家2013年

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

如果您已jot安装BSD (例如),这在Linux上也可以使用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
我很想说listagg不是必需的,而只是一组有序行
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

alert数据+9字节(如果在控制台中运行,则不需要)。

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

1
您可以使用a for来代替保存一个字节whilefor(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++));
}

我的第一个代码高尔夫球-任何指针都会受到欢迎。如果可以切掉argc / argv垃圾,会很好,但是我不是C语言程序员那么熟练。欢迎改进。

编辑:本年度是从命令行中获得的-特别是由一群自动化的,训练有素的饮水鸟获得的。

编辑 2:85个字节,感谢Easterly Irk(删除了arg函数参数周围的空格)

编辑 3:76个字节感谢anatolyg指出了显而易见的(删除了冗长的argc / argv参数名称)

编辑 4:74个字节,感谢Yay295(char ** v,更改的年份分隔符)

编辑 5:65字节,感谢Yay295和matt(重新使用了变量i,删除了变量x,更改为for循环,更新了printf以包括atoi()读取和i ++)


1
你不能留空间吗?int argc, char-> int argc,char
Rɪᴋᴇʀ

2
更换argcc(或更好的替换int argc由刚int)和argv通过v。同时更换whilefor。后者的变化需要一定的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.logalert,然后删除最后一个;
NoOneIsHere

1
使用节省5个字节f=x=>x>Date().split" "[3]-121&&(alert(x),f(x-1)),用反引号替换引号。
Shaggy

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

在线测试


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

OP明确要求提供一个面向未来的版本,因此只有第二个版本可以回答问题。之后,是否不需要按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

如果您还被允许使用Shell,则可以使用该date实用程序节省另外五次击键::.!date +\%Y<CR>qqYp<C-x>q118@q
John Gowers
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.