#1 Le 28/02/2023, à 13:21
- sputnick
[JEU] #! /challenge/scripting 'parser des dates'
Salut,
j'aimais bien ce jeu il y a un bail Je propose d'y rejouer.
Dans le langage de votre choix, retrouver le dernier jour du mois précédant, si le dernier jour du mois précédent est un samedi ou un dimanche, indiquer la date du vendredi précédent..
Exemple:
date d'origine format de rendu
2023-02-04 2023-01-31
2023-03-06 2023-02-28
2023-04-03 2023-03-31
2023-05-08 2023-04-28 # le 31 tombe un dimanche
J'autorise le shell (bash, ksh, zsh, sh, fish, dash...), C, C++, Perl, Python, go Perl, Rust, Javascript... tous langages
En shell, ça pourrait commencer par:
#!/ shebang bash, sh, zsh, ksh etc...
LANG=C
for ymd in 2023-02-04 2023-03-06 2023-04-03 2023-05-08; do
...
Pistes shell:
$ date -d "2023-02-28 -1 month" "+%F"
2023-01-28
En plus bas niveau (Perl, C, C++, Python...):
man strptime
man strftime
Dernière modification par sputnick (Le 07/03/2023, à 13:05)
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#2 Le 28/02/2023, à 13:49
- sputnick
Re : [JEU] #! /challenge/scripting 'parser des dates'
## réservé
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#3 Le 06/03/2023, à 18:32
- sputnick
Re : [JEU] #! /challenge/scripting 'parser des dates'
Bon ben ça n'intéresse personne apparemment ^^
en bash:
#!/bin/bash
LANG=C
for ymd in 2023-02-04 2023-03-06 2023-04-03 2023-05-08; do
weekday=$(date -d "${ymd%-[0-9]*}-01 -1 day" "+%a")
case "$weekday" in
Sun)
delta=-3
;;
Sat)
delta=-2
;;
*)
delta=-1
;;
esac
date -d "${ymd%-[0-9]*}-01 $delta day" "+%F"
done
En Perl:
perl -MTime::Piece -MTime::Seconds -E '
for (@ARGV) {
s/-\d{2}$//;
my $ymd = Time::Piece->strptime("${_}-01", "%Y-%m-%d");
my ($dow, $month, $dom, $hour, $year) = split / /, $ymd - ONE_DAY;
my $gap;
if ($dow eq "Sun") { $gap = 3*ONE_DAY }
elsif ($dow eq "Sat") { $gap = 2*ONE_DAY }
else { $gap = ONE_DAY }
($dow, $month, $dom, $hour, $year) = split / /, $ymd - $gap;
my $dateold = Time::Piece->strptime(
"$dow $month $dom $year", "%a %b %d %Y");
say $dateold->strftime("%F");
}
' 2023-02-04 2023-03-06 2023-04-03 2023-05-08
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#4 Le 06/03/2023, à 19:00
- Watael
Re : [JEU] #! /challenge/scripting 'parser des dates'
« retrouver la date du dernier jour du mois dernier précédant une date donnée »
« si le dernier jour du mois précédent est un samedi ou un dimanche, indiquer la date du vendredi précédent. »
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 06/03/2023, à 20:15
- Rafbor
Re : [JEU] #! /challenge/scripting 'parser des dates'
Bonsoir,
version en C# avec dotnet-script
#!/usr/bin/env dotnet-script
using System;
foreach(var date in Args)
{
DateTime dtDate1 = Convert.ToDateTime(date);
DateTime dtDate2 = dtDate1.AddMonths(-1);
int nDay = DateTime.DaysInMonth(dtDate2.Year, dtDate2.Month);
if (new DateTime(dtDate2.Year, dtDate2.Month, nDay).DayOfWeek == DayOfWeek.Sunday)
nDay -= 2;
else if (new DateTime(dtDate2.Year, dtDate2.Month, nDay).DayOfWeek == DayOfWeek.Saturday)
nDay -= 1;
Console.WriteLine(new DateTime(dtDate2.Year, dtDate2.Month, nDay).ToString("yyyy-MM-dd"));
}
$ dotnet-script ./date.csx 2023-02-04 2023-03-06 2023-04-03 2023-05-08
2023-01-31
2023-02-28
2023-03-31
2023-04-28
Dernière modification par Rafbor (Le 08/03/2023, à 09:36)
Xubuntu 24.04 - Mes projets sur Github
Hors ligne
#6 Le 07/03/2023, à 19:27
- sputnick
Re : [JEU] #! /challenge/scripting 'parser des dates'
Ah ben c'est facile maintenant que j'ai donné l'algo
Des tentatives dans d'autres langages? Ca aurait de la gueule en go ou en rust (voir en C)
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#7 Le 07/03/2023, à 20:34
- Watael
Re : [JEU] #! /challenge/scripting 'parser des dates'
LeoMajor ? du Gambas ?!
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#8 Le 12/03/2023, à 14:44
- LeoMajor
Re : [JEU] #! /challenge/scripting 'parser des dates'
cherche un peu ...
gbs3 -e 'dim a as date=now(): dim b as date=date(year(a), month(a), 1): dim c as date=dateadd(b, gb.day, -1): if weekday(c)=gb.sunday then c=dateadd(b, gb.day, -3): if weekday(c)=gb.saturday then c=dateadd(b, gb.day, -2): print format(c, gb.mediumdate)'
28/02/2023
cat testa.gbs
#!/usr/bin/env gbs3
Sub foo()
Print System.Language
For Each a As Date In [Val("04/02/2023"), Val("06/03/2023"), Val("03/04/2023"), Val("08/05/2023")]
Print "source", Format(a, "yyyy-mm-dd");;
Dim b As Date = Date(Year(a), Month(a), 1)
Dim c As Date = DateAdd(b, gb.day, -1)
If WeekDay(c) = gb.sunday Then c = DateAdd(b, gb.day, -3)
If WeekDay(c) = gb.saturday Then c = DateAdd(b, gb.day, -2)
Print "get", Format(c, "yyyy-mm-dd")
Next
End
foo()
gbs3 testa.gbs
fr_FR.UTF-8
source 2023-02-04 get 2023-01-31
source 2023-03-06 get 2023-02-28
source 2023-04-03 get 2023-03-31
source 2023-05-08 get 2023-04-28
pour javascript, un webkit (wrapper javascript) dans untel langage fera l'affaire. -> exemple radiomeuh avec time, un sous type de date
Hors ligne
#9 Le 12/03/2023, à 20:45
- sputnick
Re : [JEU] #! /challenge/scripting 'parser des dates'
Ah merci, je m'attendais pas à une soupe de Gambas. Mhhhh !
J'aimerais trop le faire en C si je trouve du temps et de l'envie, mon code Perl peut aider, les syscalls sont identiques en C:
strftime(3)
strptime(3)
Dernière modification par sputnick (Le 12/03/2023, à 20:49)
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#10 Le 19/03/2023, à 14:49
- LeoMajor
Re : [JEU] #! /challenge/scripting 'parser des dates'
variante widget
pour s'amuser (dernier jour ouvré du mois en rouge + jour férié en jaune + premier jour du mois en vert)
:~/scripts$ cat datevba.gbs
#!/usr/bin/env gbs3
'Auto Generated Script 03/19/2023 13:23:41.894 Version (3.17.3)
#Script Title="datevba"
#Script Startup="FMain"
#Script Version="0.0.1"
Use "gb.image"
Use "gb.gui"
Use "gb.form"
Use "gb.util"
class FMain
' Gambas class file
Private Dc As DateChooser
Public Sub Form_Open()
Dim dk As Screen = Screens[0]
With FMain
.X = Fix(dk.W / 4)
.Y = Fix(dk.H / 3)
.W = 500
.H = 360
.Arrangement = Arrange.Horizontal
.Title = "Calendrier"
.Window.Resizable = False
.Padding = 10
End With
With Dc = New Datechooser(FMain) As "edc"
.Mode = DateChooser.DateOnly
.w = FMain.ClientW
.H = FMain.ClientH
.Window.AutoResize = True
End With
End
Public Sub edc_Click()
Select Case Dc.Data.Background
Case Color.Red
Message.Info(Format(Dc.Value, gb.MediumDate) & "\n Dernier Jour ouvré du mois")
Case Color.Green
Message.Info(Format(Dc.Value, gb.MediumDate) & "\n Début du mois")
Case Color.Yellow
Message.Info(Format(Dc.Value, gb.LongDate) & "\n Jour Férié")
Case Else
Message.Info(Format(Dc.Value, gb.ShortDate))
End Select
End
Public Sub edc_Data(dt As Date)
Dim deb As Date = Date(Dc.Year, Dc.Month, 1)
Dim paques As Date = Date.EasterDay(Dc.Year)
Dim ferie As Date[] = [Date(Dc.year, 1, 1), paques, DateAdd(paques, gb.day, 39), DateAdd(paques, gb.day, 50), Date(Dc.year, 5, 1), Date(Dc.year, 5, 8), Date(Dc.year, 7, 14), Date(Dc.year, 8, 15), Date(Dc.year, 11, 1), Date(Dc.year, 11, 11), Date(Dc.year, 12, 25)]
'DateChooser1[deb].Background = Color.Green
If dt = deb Then Dc.Data.Background = Color.Green
Dim fin As Date = DateAdd(DateAdd(deb, gb.month, 1), gb.day, -1)
If WeekDay(fin) = gb.Sunday Then fin = DateAdd(DateAdd(deb, gb.month, 1), gb.day, -3)
If WeekDay(fin) = gb.Saturday Then fin = DateAdd(DateAdd(deb, gb.month, 1), gb.day, -2)
If dt = fin Then Dc.Data.Background = Color.Red
If ferie.Find(dt) <> -1 Then Dc.Data.Background = Color.Yellow
End
End class
form FMain
# Gambas Form File 3.0
{ Form Form
MoveScaled(0,0,64,64)
}
End form
*autogénéré par: gbs3 --convert-project ~/gambas/datevba/ ~/scripts/
man gbs3 pour convertir à l'envers (--convert-script) vers IDE
Hors ligne
#11 Le 19/03/2023, à 17:24
- sputnick
Re : [JEU] #! /challenge/scripting 'parser des dates'
Merci LeoMajor, dessert de Gambas
Allééé, un volontaire pour le faire en C !
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#12 Le 19/03/2023, à 17:43
- hotnuma
Re : [JEU] #! /challenge/scripting 'parser des dates'
Allééé, un volontaire pour le faire en C !
Vla
#define _XOPEN_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <time.h>
#include <string.h>
#define STRSIZE 10
bool finddate(const char *part)
{
if (!part || strlen(part) != STRSIZE)
return false;
char inbuff[STRSIZE+1];
strcpy(inbuff, part);
inbuff[STRSIZE-2] = '0';
inbuff[STRSIZE-1] = '1';
struct tm tm;
memset(&tm, 0, sizeof(tm));
strptime(inbuff, "%Y-%m-%d", &tm);
tm.tm_mday -= 1;
mktime(&tm);
// Saturday
if (tm.tm_wday == 6)
{
tm.tm_mday -= 1;
mktime(&tm);
}
// Sunday
else if (tm.tm_wday == 0)
{
tm.tm_mday -= 2;
mktime(&tm);
}
char outbuff[STRSIZE+1];
strftime(outbuff, STRSIZE+1, "%Y-%m-%d", &tm);
printf("%s\t%s\n", part, outbuff);
return true;
}
int main(int argc, char **argv)
{
if (argc < 2)
return EXIT_FAILURE;
int n = 1;
printf("orig\t\tresult\n");
while (n < argc)
{
finddate(argv[n]);
++n;
}
fflush(stdout);
return EXIT_SUCCESS;
}
gcc main.c -o finddate
./finddate 2023-02-04 2023-03-06 2023-04-03 2023-05-08
orig result
2023-02-04 2023-01-31
2023-03-06 2023-02-28
2023-04-03 2023-03-31
2023-05-08 2023-04-28
Xfce 4.18 / https://github.com/hotnuma
Hors ligne
#13 Le 19/03/2023, à 17:49
- sputnick
Re : [JEU] #! /challenge/scripting 'parser des dates'
@hotnuma: Pour moi t'est le vainqueur. Je demande l'avis du public !
Ça t'a pris combien de temps en vrai?
BIG up et merci de ta participation!
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#14 Le 19/03/2023, à 18:09
- hotnuma
Re : [JEU] #! /challenge/scripting 'parser des dates'
Ça t'a pris combien de temps en vrai?!
Une heure par la, le script bash m'a bien aidé mais je ne savais pas comment soustraire des jours :
https://stackoverflow.com/questions/156 … given-date
L'astuce est de soustraire du nombre de jours (tm_mday) et appeler mktime. Vla
Xfce 4.18 / https://github.com/hotnuma
Hors ligne