¡Tienes una racha de días!

15

Escriba un programa que realice un seguimiento de la cantidad de días consecutivos que se ha ejecutado.

El día se reinicia a la medianoche (la hora local de la computadora en la que se ejecuta el programa).

Si hay un día en que el programa no se ejecuta, el contador se restablece a cero.

Cada vez que se ejecuta el programa, el contador debe subir un día si es la primera vez que se ejecuta el programa ese día. Esto significa que la primera vez que se ejecuta el programa, debería decir: "¡Tienes una racha de 1 día!"

La salida del programa tiene la forma: You have a [streak_length] day streak!

Se le permite almacenar datos externamente o modificar el código fuente, su elección.

Este es el , por lo que gana el código más corto en bytes.

Daniel
fuente
¿Tiene que ser hora local? ¿O puede ser cualquier zona horaria?
Rɪᴋᴇʀ
@EasterlyIrk, el día se reinicia a la medianoche hora local.
Daniel
¿Entonces tiene que ser local desde donde está la computadora? O al menos con la zona horaria en la que se encuentra el equipo. No puede usar UTC independientemente?
Rɪᴋᴇʀ
@EasterlyIrk, tiene que ser la zona horaria de la computadora
Daniel
Ah bien. Gracias por aclararlo.
Rɪᴋᴇʀ

Respuestas:

4

Golpetazo, 92, 9082 bytes

Golfed

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

EDICIONES

  • Truncar el archivo, en lugar de eliminarlo, -8 bytes;
  • Reemplazado -daystart con ! -newermt para guardar 2 bytes.

Cómo funciona !

Cada vez que lo inicie, agregará una línea con la fecha actual al archivo h , por ejemplo:

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

Luego se usará uniqpara filtrar duplicados (es decir, varios lanzamientos, dentro del mismo día) y contar las líneas para obtener la longitud de la raya .

uniq h|wc -l

Para restablecer una racha , buscará 'ayer' en h , y la truncará si no se encuentra.

grep `date -d-1day -I` h||>h
zepelín
fuente
5

Bash, 102 bytes

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

Advertencia, no se ejecute en ninguna carpeta que le interese. Elimina cualquier archivo no accedido en el último día en el directorio de trabajo.

Utiliza un archivo apara almacenar datos, utilizando las marcas de tiempo accedidas / modificadas.

orlp
fuente
2

Goruby, 85 bytes

Corre con la bandera del intérprete -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!"

Funciona almacenando un nuevo archivo para cada día en el que se invoca, luego cuenta el número de archivos consecutivos hacia atrás para obtener la duración de la racha. Nunca elimina archivos, por lo que, eventualmente, después de un tiempo muy, muy, muy, muy, muy largo, llenará su disco duro, un puñado de bytes a la vez.

Aquí hay una versión sin golf de ella:

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!"
Tutleman
fuente
1

Python 3, 213 bytes

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))
drc00k3
fuente
1

Bash + coreutils, 120 97 bytes

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!

La línea bash anterior tiene 95 bytes.

Hay un segundo archivo llamado f que solo contiene un único carácter:

0

(El programa escribe en f.)

Entonces, creo que el número total de bytes debe puntuarse como 97 (95 bytes para el contenido del archivo bash, 1 byte para el contenido del archivo externo y 1 byte porque se usa 1 archivo que no sea el programa). Esto se basa en contar bytes para programas de varios archivos .

Nota: Gracias a @orlp por señalar que una respuesta anterior a esto que publiqué no tenía sentido; Había leído mal el problema por completo. (Fue publicado como una respuesta diferente, que he eliminado).

Mitchell Spector
fuente
0

PowerShell , 95 bytes

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

Pruébalo en línea!

Explicación

Comienzo escribiendo la fecha actual (en formato de fecha corta) en un archivo (llamado z).>>funciona como de costumbre; agrega, pero crea si no existe.

A continuación, leo el contenido del archivo línea por línea con Get-Content( gc), canalizo a través de Get-Unique( gu) ya que podría haber múltiples entradas desde la misma fecha, luego canalizo a través de ForEach-Object(% ).

En el bucle, creo una matriz de 2 elementos con el valor 0en el primer elemento y el valor actual de $c( +1) en el segundo elemento. Usar ++$cme permite evitar envolver algo como$c+1 entre paréntesis.

Luego indexo en la matriz de dos elementos con una comparación booleana, que se fusionará para 0para $falseo 1para $true. Dentro de la comparación, estoy asignando a $dun [datetime]objeto creado a partir de la fecha de lectura de la línea actual en el archivo. Ese objeto se compara con $n, que en la primera ejecución aún no se ha asignado, por lo que nunca coincidirá y $cse inicializará 1, ya que se está asignando el valor de la indexación $c.

A continuación, $nse completa con la siguiente fecha esperada, agregando 1al objeto datetime actual. La clave aquí es que 1Dsignifica que es un [decimal]literal. Por alguna razón, cuando agrega números enteros a [datetime], se interpreta como ticks, pero cuando agrega números de coma flotante, se interpretan como días. Entonces esto se completa $npara la próxima iteración.

El efecto es que el contador se reinicia cada vez que la fecha actual no coincide con la fecha "siguiente" (que es la fecha anterior más 1 día).

Finalmente se emite el mensaje.

briantista
fuente