Bir günlük izin var!


15

Birbirini takip eden gün sayısını takip eden bir program yazın.

Gün gece yarısı sıfırlanır (programın çalıştığı bilgisayarın yerel saati).

Programın çalışmadığı bir gün varsa, sayaç sıfırlanır.

Program her çalıştırıldığında, program o gün ilk kez çalıştırılıyorsa, sayaç bir gün yükselmelidir. Bu, program ilk çalıştırıldığında, "1 günlük bir çizginiz var!"

Programın çıktısı şu şekildedir: You have a [streak_length] day streak!

Verileri harici olarak depolamanıza veya kaynak kodunu değiştirmenize izin verilir –– seçiminiz.

Bu , bayt en kısa kod kazanır!


Yerel saat olmalı mı? Yoksa herhangi bir saat dilimi olabilir mi?
Rɪᴋᴇʀ

@EasterlyIrk, gün gece yarısı yerel saatinde sıfırlanır.
Daniel

Yani bilgisayarın bulunduğu yerden yerel olmalı? Veya en azından waht saat dilimi açıktır. Ne olursa olsun UTC kullanamazsınız?
Rɪᴋᴇʀ

@EasterlyIrk, bilgisayarın saat dilimi olmalı
Daniel

Ah tamam. Açıkladığınız için teşekkürler.
Rɪᴋᴇʀ

Yanıtlar:


4

Bash, 92, 9082 bayt

golfed

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

DÜZENLEMELER

  • Dosyayı kaldırmak yerine -8 bayt;
  • -Days ile değiştirildi ! - 2 bayt kaydetmek için yeni.

Nasıl çalışır !

Her başlattığınızda , h dosyasına geçerli tarihe sahip bir satır ekler , örneğin:

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

Daha sonra uniqyinelenenleri (yani aynı gün içinde birden çok başlatmayı) filtrelemek ve çizgi uzunluğunu elde etmek için çizgileri saymak için kullanılır .

uniq h|wc -l

Bir çizgiyi sıfırlamak için, h içinde 'dün' için grep olur ve bulunmazsa keser.

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

5

Bash, 102 bayt

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

Uyarı, do not önemsediğiniz herhangi klasörde çalıştırın. Çalışma dizininde son gün erişilmeyen dosyaları siler.

aErişilen / değiştirilen zaman damgalarını kullanarak veri depolamak için bir dosya kullanır .


2

Goruby, 85 Bayt

Tercüman bayrağı ile çalıştırın -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!"

Çağrıldığı her gün için yeni bir dosya depolayarak çalışır, ardından çizginin uzunluğunu elde etmek için ardışık dosya sayısını geriye doğru sayar. Hiçbir zaman dosyaları silmez, bu nedenle, sonunda, çok, çok, çok, çok, çok uzun bir süre sonra, sabit diskinizi, bir seferde bir avuç bayt doldurur.

İşte ungolfed versiyonu:

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 bayt

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 bayt

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!

Yukarıdaki bash satırında 95 bayt var.

F adında, tek bir karakter içeren ikinci bir dosya var:

0

(Program f'ye yazar.)

Bu yüzden toplam bayt sayısının 97 olarak kaydedilmesi gerektiğini düşünüyorum (bash dosyasının içeriği için 95 bayt, harici dosyanın içeriği için 1 bayt ve program dışında 1 dosya kullanıldığı için 1 bayt). Bu, çoklu dosya programları için bayt saymaya dayanır .

Not: Daha önce gönderdiğim bir yanıtın saçmalık olduğuna dikkat çektiği için @orlp sayesinde; Sorunu tamamen yanlış okumuştum. (Sildiğim farklı bir yanıt olarak gönderildi.)


0

PowerShell , 95 bayt

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

Çevrimiçi deneyin!

açıklama

Geçerli tarihi (kısa tarih biçiminde) bir dosyaya (adlandırılmış z) yazarak başlıyorum . >>her zamanki gibi çalışır; ekler, ancak yoksa oluşturur.

Daha sonra, aynı tarihten birden fazla giriş olabileceğinden Get-Content( gc), pipe through Get-Unique( gu) ile dosyanın içeriğini satır satır okudum , ardından ForEach-Object(% ).

Döngüde, 0ilk öğedeki değeri ve ikinci öğedeki $c( +1) geçerli değerini içeren 2 öğeli bir dizi oluştururum . Kullanmak parantez ++$cgibi bir şey sarmaktan kaçınmamı sağlar $c+1.

Daha sonra 0için $falseveya 1için birleştirilecek bir boole karşılaştırması ile iki element dizisine indekslerim $true. Karşılaştırma içinde, dosyadaki geçerli satırdan okunan tarihten oluşturulan $dbir [datetime]nesneye ataıyorum . Bu nesne $n, ilk çalıştırmada henüz atanmamış olan ile karşılaştırılır , bu nedenle dizinleme değerinin atandığı için hiçbir zaman eşleşmez ve $csıfırlanır .1$c

Ardından, geçerli datetime nesnesine $neklenerek bir sonraki beklenen tarihle doldurulur 1. Buradaki anahtar, bunun gerçek 1Dbir [decimal]kelime olduğu anlamına geliyor . Bazı nedenlerden dolayı, a'ya tamsayı sayıları eklediğinizde [datetime], keneler olarak yorumlanır, ancak kayan nokta sayıları eklediğinizde, bunlar gün olarak yorumlanır. Bu $n, bir sonraki yineleme için doldurulur .

Etkisi, sayacın geçerli tarih "sonraki" tarihle her eşleşmediğinde (önceki tarih artı 1 gün) sıfırlanmasıdır.

Sonunda mesaj çıktı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.