당신은 하루 연속입니다!


15

실행 된 연속 일 수를 추적하는 프로그램을 작성하십시오.

요일은 자정 (프로그램이 실행되는 컴퓨터의 현지 시간)에 재설정됩니다.

프로그램이 실행되지 않는 날이 있으면 카운터가 0으로 재설정됩니다.

프로그램이 실행될 때마다 카운터는 프로그램이 그날 처음 실행 된 경우 하루 씩 증가해야합니다. 이것은 프로그램이 처음 실행될 때 "하루에 1 일 연속입니다!"라고 말해야합니다.

프로그램의 출력 결과는 다음과 같습니다. You have a [streak_length] day streak!

데이터를 외부에 저장하거나 소스 코드 (원하는 선택)를 수정할 수 있습니다.

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다!


현지 시간이어야합니까? 아니면 시간대가 될 수 있습니까?
Rɪᴋᴇʀ

@EasterlyIrk, 현지 시간으로 자정에 재설정됩니다.
Daniel

그래서 컴퓨터가있는 곳에서 로컬이어야합니까? 또는 적어도 컴퓨터가 켜져있는 시간대입니다. UTC에 관계없이 사용할 수 없습니까?
Rɪᴋᴇʀ

@EasterlyIrk, 그것은 컴퓨터의 시간대 여야합니다
Daniel

아 알았어 설명해 주셔서 감사합니다.
Rɪᴋᴇʀ

답변:


4

세게 때리다, 92, 90, 82 바이트

골프

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

EDITS

  • 파일을 제거하는 대신 -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!"

매일 호출되는 새 파일을 저장 한 다음 연속 파일 수를 거꾸로 세어 연속 길이를 계산합니다. 파일을 삭제하지 않으므로 결국 매우 긴 시간이 지나면 하드 드라이브를 한 번에 몇 바이트 씩 채 웁니다.

그것의 ungolfed 버전은 다음과 같습니다.

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

파이썬 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)에 파일로 쓰는 것으로 시작합니다 . >>평소와 같이 작동합니다. 추가하지만 존재하지 않는 경우 만듭니다.

다음에, I는 부합하여 파일 라인의 내용을 판독 Get-Content( gc내지), 파이프 Get-Unique( gu통해 여러 후 동일한 기간에서 항목 파이프가있을 수 있기 때문에) ForEach-Object( %).

루프 0에서 첫 번째 요소 의 값 과 두 번째 요소의 현재 값 $c( +1)을 사용하여 2 요소 배열을 만듭니다 . 를 사용 ++$c하면 $c+1괄호 와 같은 줄 바꿈을 피할 수 있습니다 .

그런 다음에 병합 얻을 것이다 부울 비교와 두 요소 배열에 I 인덱스 0에 대한 $false또는 1에 대한 $true. 비교 내에서, 나는에 할당하고있어 파일의 현재 행에서 읽은 날로부터 생성 된 객체. 이 개체는 에 처음으로 실행되지 않은에 비교되어 인덱싱 값이에 할당 되므로 일치하지 않으며 로 초기화 됩니다 .$d[datetime]$n$c1$c

다음 은 현재 날짜 / 시간 개체 $n에 추가하여 다음 예상 날짜로 채워집니다 1. 여기서 핵심 1D[decimal]문자 그대로 임을 의미합니다 . 어떤 이유로 정수를 a [datetime]에 추가하면 틱으로 해석되지만 부동 소수점을 추가하면 며칠로 해석됩니다. 따라서 이것은 $n다음 반복을 위해 채워집니다 .

결과는 현재 날짜가 "다음"날짜 (이전 날짜에 1을 더한 날짜)와 일치하지 않을 때마다 카운터가 재설정됩니다.

마지막으로 메시지가 출력됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.