你有一天连胜!


15

编写一个程序,跟踪其运行的连续天数。

白天在午夜(运行该程序的计算机的本地时间)重置。

如果一天中没有运行该程序,则将计数器重置为零。

每次运行该程序时,如果这是该天第一次运行该程序,则计数器应增加一天。这意味着程序第一次运行时,应该说:“您有1天的连胜!”

程序的输出格式为: You have a [streak_length] day streak!

您可以选择在外部存储数据或修改源代码。

这是,因此以字节为单位的最短代码胜出!


一定是当地时间吗?还是可以是任何时区?
Rɪᴋᴇʀ

@EasterlyIrk,该天在当地时间午夜重置。
丹尼尔(Daniel)

因此,它必须是计算机所在的本地计算机吗?或至少在计算机所在的时区。它不能使用UTC吗?
Rɪᴋᴇʀ

@EasterlyIrk,它必须是计算机的时区
丹尼尔(Daniel)

啊好吧。感谢您的澄清。
Rɪᴋᴇʀ

Answers:


4

重击 9290,82字节

打高尔夫球

grep `date -d-1day -I` h||>h
date -I>>h
echo You have a `uniq h|wc -l` day streak!

编辑

  • 截断文件,而不是删除它,而是-8个字节;
  • daystart替换为!-newermt保存2个字节。

怎么运行的 !

每次启动时,都会在文件h后面添加一行,其中包含当前日期,例如:

2017-02-03
2017-02-04
2017-02-05
2017-02-05

然后它将uniq用于过滤出重复项(即同一天内多次发射),并对行数进行计数以获取条纹长度。

uniq h|wc -l

要重置条纹,它将在h中 grep表示“昨天”,如果找不到则将其截断。

grep `date -d-1day -I` h||>h

5

Bash,102字节

find ! -newerat 0-1day -delete
touch -a a
echo You have a $((1+(`stat -c %X-%Y a`)/86400)) day streak!

警告,这样做你关心的任何文件夹中运行。它将删除前一天未在工作目录中访问的任何文件。

使用文件a来存储数据,使用已访问/已修改的时间戳。


2

Goruby,85字节

运行解释器标志-rdate

c,t=0,Dae.y
op t.ts,?w
dw{c+=1;t=t.p;Fil.f t.ts}
s"You have a #{c} day streak!"

它的工作原理是在调用该文件的每一天存储一个新文件,然后向后计数连续文件的数量,以获取条纹的长度。它永远不会删除文件,因此最终,它将在非常,非常,非常,非常非常长的时间之后,一次填充少量字节,最终填充硬盘。

这是它的非公开版本:

streak, current_date = 0, Date.today
open(current_date.to_s, 'w')
while File.file?(current_date.to_s)
    streak += 1
    current_date = current_date.prev_day;
end
puts "You have a #{streak} day streak!"

1

Python 3,213字节

import time
t=time.time()
try:
 r=open("a").read().split(":")
 open("a","w").write((str(int(r[0])+1)+":"+t)if(t>float(r[1])+86400)and(t<float(r[1])+172800)else("1:"+str(t)))
except:open("a","w").write("1:"+str(t))

1

Bash + coreutils,120 97字节

read d n<f;c=`date -d0 +%s`;echo $c $[c>d?c>d+86399?n=1:++n:n]>f;echo You have a $n day streak!

上面的bash行中有95个字节。

还有另一个名为f的文件,其中仅包含一个字符:

0

(程序写入f。)

因此,我认为总字节数应为97(bash文件的内容为95字节,外部文件的内容为1字节,因为使用了程序以外的1个文件,所以为1字节)。这基于对多文件程序计数字节

注意:感谢@orlp指出我对此发布的较早答案是胡说八道;我完全误解了问题。(它被发布为另一个答案,我已将其删除。)


0

PowerShell,95个字节

(date -f 'd')>>z
gc z|gu|%{$c=(1,++$c)[($d=date $_)-eq$n]
$n=$d+1D}
"You have a $c day streak!"

在线尝试!

说明

首先,将当前日期(以短日期格式)写到文件(名为z)中。>>照常工作;追加,但创建(如果不存在)。

接下来,我用Get-Contentgc)逐行读取文件的内容,通过Get-Uniquegu)进行管道传输,因为同一日期可能会有多个条目,然后通过ForEach-Object%)进行管道传输。

在循环中,我创建了一个2元素数组,其中0第一个元素的值是$c+1)的当前值,第二个元素。使用++$c使我可以避免$c+1在括号中加上类似内容。

然后,我通过布尔比较索引到两个元素数组中,这将合并为0for $false1for $true。在比较中,我指定给$d一个[datetime]从文件当前行读取日期开始创建对象。$n将该对象与进行比较,因为该对象在第一次运行时尚未分配,因此它永远不会匹配,并且$c将初始化为1,因为将索引的值分配了$c

接下来$n,通过添加下一个预期日期来填充1到当前datetime对象来。这里的关键是这1D是一个[decimal]文字。由于某些原因,当您将整数添加到时[datetime],它会被解释为刻度,但是当您添加浮点数时,它们会被解释为天。因此,它将$n为下一次迭代填充。

结果是,每次当前日期与“下一个”日期(前一个日期加1天)不匹配时,计数器都会重置。

最后,消息被输出。

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.