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 código de golf , por lo que gana el código más corto en bytes.
Respuestas:
Golpetazo,
92,9082 bytesGolfed
EDICIONES
Cómo funciona !
Cada vez que lo inicie, agregará una línea con la fecha actual al archivo h , por ejemplo:
Luego se usará
uniq
para filtrar duplicados (es decir, varios lanzamientos, dentro del mismo día) y contar las líneas para obtener la longitud de la raya .Para restablecer una racha , buscará 'ayer' en h , y la truncará si no se encuentra.
fuente
Bash, 102 bytes
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
a
para almacenar datos, utilizando las marcas de tiempo accedidas / modificadas.fuente
Goruby, 85 bytes
Corre con la bandera del intérprete
-rdate
.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:
fuente
Python 3, 213 bytes
fuente
Bash + coreutils,
12097 bytesLa línea bash anterior tiene 95 bytes.
Hay un segundo archivo llamado f que solo contiene un único carácter:
(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).
fuente
PowerShell , 95 bytes
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 deGet-Unique
(gu
) ya que podría haber múltiples entradas desde la misma fecha, luego canalizo a través deForEach-Object
(%
).En el bucle, creo una matriz de 2 elementos con el valor
0
en el primer elemento y el valor actual de$c
(+1
) en el segundo elemento. Usar++$c
me 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
0
para$false
o1
para$true
. Dentro de la comparación, estoy asignando a$d
un[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$c
se inicializará1
, ya que se está asignando el valor de la indexación$c
.A continuación,
$n
se completa con la siguiente fecha esperada, agregando1
al objeto datetime actual. La clave aquí es que1D
significa 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$n
para 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.
fuente