Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/02/2023, à 14:21

sputnick

[JEU] #! /challenge/scripting 'parser des dates'

Salut,

j'aimais bien ce jeu il y a un bail big_smile 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 wink

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, à 14:05)


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#2 Le 28/02/2023, à 14:49

sputnick

Re : [JEU] #! /challenge/scripting 'parser des dates'

## réservé


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#3 Le 06/03/2023, à 19: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

https://stackoverflow.com/questions/755 … l/75596837


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#4 Le 06/03/2023, à 20: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.

En ligne

#5 Le 06/03/2023, à 21: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, à 10:36)


Xubuntu 22.04 - Mes projets sur Github

Hors ligne

#6 Le 07/03/2023, à 20:27

sputnick

Re : [JEU] #! /challenge/scripting 'parser des dates'

Ah ben c'est facile maintenant que j'ai donné l'algo big_smile

Des tentatives dans d'autres langages? Ca aurait de la gueule en go ou en rust (voir en C)


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#7 Le 07/03/2023, à 21:34

Watael

Re : [JEU] #! /challenge/scripting 'parser des dates'

LeoMajor ? du Gambas ?!


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#8 Le 12/03/2023, à 15: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, à 21:45

sputnick

Re : [JEU] #! /challenge/scripting 'parser des dates'

Ah merci, je m'attendais pas à une soupe de Gambas. Mhhhh ! tongue

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, à 21:49)


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#10 Le 19/03/2023, à 15: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, à 18:24

sputnick

Re : [JEU] #! /challenge/scripting 'parser des dates'

Merci LeoMajor, dessert de Gambas tongue

Allééé, un volontaire pour le faire en C !


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#12 Le 19/03/2023, à 18:43

hotnuma

Re : [JEU] #! /challenge/scripting 'parser des dates'

sputnick a écrit :

Allééé, un volontaire pour le faire en C !

Vla tongue

#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

Xubuntu / GitHub

Hors ligne

#13 Le 19/03/2023, à 18: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!


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#14 Le 19/03/2023, à 19:09

hotnuma

Re : [JEU] #! /challenge/scripting 'parser des dates'

sputnick a écrit :

Ç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 tongue


Xubuntu / GitHub

Hors ligne