連日があります!


15

実行された連続日数を追跡するプログラムを作成します。

日は深夜(プログラムが実行されているコンピューターの現地時間)にリセットされます。

プログラムが実行されない日がある場合、カウンターはゼロにリセットされます。

プログラムが実行されるたびに、その日にプログラムが初めて実行された場合は、カウンターが1日上がるはずです。これは、プログラムを初めて実行するときに、「1日間連続して!」と言う必要があることを意味します。

プログラムの出力は次の形式です。 You have a [streak_length] day streak!

データを外部に保存したり、ソースコードを変更したりできます。

これはなので、バイト単位の最短コードが勝ちです!


現地時間でなければなりませんか?それとも、単にタイムゾーンにすることができますか?
Rɪᴋᴇʀ

@EasterlyIrk、日は現地時間の午前0時にリセットされます。
ダニエル

それで、それはコンピューターがある場所からローカルでなければなりませんか?または、少なくともコンピューターがオンになっているタイムゾーン。それに関係なくUTCを使用することはできませんか?
Rɪᴋᴇʀ

@EasterlyIrk、コンピューターのタイムゾーンでなければなりません
ダニエル

うん、いいよ。明確にしてくれてありがとう。
Rɪᴋᴇʀ

回答:


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

バッシュ、102バイト

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

警告、気にするフォルダで実行しないでください。作業ディレクトリ内の最終日にアクセスされなかったファイルを削除します。

aアクセス/変更されたタイムスタンプを使用して、ファイルを使用してデータを保存します。


2

ゴルビー、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という2番目のファイルがあります。

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)で1 行ずつ読み取り、パイプスルーGet-Uniquegu)してから、パイプスルーForEach-Object%)します。

ループで0は、最初の要素の値と2番目の要素の$c+1)の現在の値で2要素配列を作成します。を使用++$cすると、次のようなラッピングを回避できます$c+1、カッコ内のます。

次に、ブール比較を使用して2つの要素の配列にインデックスを付けます。これにより、0for $falseまたは1forに結合され$trueます。比較内で、ファイルの現在の行から読み取られた日付から作成され$d[datetime]オブジェクトに割り当てています。そのオブジェクトはと比較さ$nれ、最初の実行ではまだ割り当てられていないため、インデックス付けの値がに割り当てられているため、一致することはなく、$cに初期化1され$cます。

次に、現在の日時オブジェクトに$n追加1することにより、次に予想される日付が入力されます。ここで重要なのは、1Dそれが[decimal]リテラルであることを意味します。何らかの理由で整数をaに追加する[datetime]と、ティックとして解釈されますが、浮動小数点数を追加すると、それらは日として解釈されます。これが移入します$nは次の反復のためにれます。

その結果、現在の日付が「次の」日付(前の日付に1日を加えた日付)に一致しないたびに、カウンターがリセットされます。

最後にメッセージが出力されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.