Προς το περιεχόμενο

Πλάνο βαρδιών


gioiliop7
Μετάβαση στην απάντηση Απαντήθηκε από gioiliop7,

Προτεινόμενες αναρτήσεις

Καλησπέρα παιδιά.

Δεν ξέρω αν έχετε φτιάξει κάτι παρόμοιο παλαιότερα, αλλά δυσκολεύομαι να βρω τη λογική για τον αλγόριθμο και το πως θα δουλεύει για κάτι που θέλω να φτιάξω οπότε σας το παραθέτω εδώ

Είμαστε 3 άτομα σε μία υπηρεσία και κάνουμε ημερίσιες βάρδιες και θέλω να φτιάξω ένα script το οποίο θα κάνει generate τις υπηρεσίες του μήνα. Θα το φτιάξω σε ένα js αρχείο σαν επιλογή γλώσσας αλλά δεν με νοιάζει τόσο αυτό, ακόμα βρίσκομαι στην λογική του όλου πράγματος.

Έχω έναν πίνακα με τα άτομα και ένα με τις ημέρες του μήνα.

Δεν μπορώ να σκεφτώ πως θα ήταν σωστός τρόπος να γίνει αυτό.

Έχω σκεφτεί μέχρι και fifo και όταν πάω να το υλοποιήσω πάλι κολλάω.

Loop στις μέρες; Loop στα άτομα και μετα στις μέρες;

Μία βοήθεια αν έχετε σκεφτεί κάτι θα ήταν σημαντική.

Ευχαριστώ πολύ.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι. Πρακτικά αν εγώ έχω Δευτέρα θα πρέπει αυτόματα να ξαναμπαινω για βάρδια την Πέμπτη.

Είναι ολοήμερες οπότε δεν θα χρειαστεί να μπούνε δύο άτομα σε μια μέρα και αυτό το κάνει λίγο πιο εύκολο 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Ααα, αρα θες ενα "κυκλικο" buffer, με μια συναερτηση η οποια θα επιστρεφει τη τρεχουσα θεση και ταυτοχρονα θα πηγαινει τον δεικτη στην επομενη.

Θες και μια συναρτηση η οποια θα επιστρεφει αν η μερα ειναι εργασιμη

ετσι μπορεις να πεις loop 1/1/23-31/1/23 current => current.shift = getEmployee(employees)

 

playground

let employees = ['Petros', 'Marios', 'Kwstas'];
let circuitBuffer = circuitBufferMake(employees);
let fromDate = new Date("1/1/2023");
let toDate = new Date("1/31/2023");

for (let date = new Date(fromDate);
    date < toDate;
    date = new Date(date.setDate(date.getDate() + 1))) {

    if (isWorkingDay(date)) {
        let currentEmploye = circuitBufferCurrent(circuitBuffer);
        circuitBufferMove(circuitBuffer);
        console.log(currentEmploye + " is working at " + date.toDateString());
    }
}


function circuitBufferMake(data) {
    return {
        buffer: [...data],
        currentPosition: 0
    };
}
function circuitBufferCurrent(buffer) {
    return buffer.buffer[buffer.currentPosition];
}

function circuitBufferMove(buffer) {
    buffer.currentPosition++;
    if (buffer.currentPosition >= buffer.buffer.length)
        buffer.currentPosition = 0;
}

function isWorkingDay(date) {
    if (date.getDay() == 0
        || date.getDay() == 6)
        return false;
    return true;
}

 

Επεξ/σία από παπι
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Λύση

Είσαι απίστευτος.

Αρχικά ευχαριστώ για την απάντησή σου.

Τα σαββατοκύριακα τα χρειαζόμουν μέσα ωστόσο μου άρεσε ο τρόπος που το προσέγγισες.

Επίσης επειδή έτρεξα το script σου η πρώτη και η τελευταία μέρα του μήνα θέλει διόρθωση γιατί δεν τις πιάνει. Το λέω μπας και το χρησημοποιήσει κάποιος άλλος.

Εν μέρει τελικά το είχα λύσει πρίν απαντήσεις αλλά τώρα το είδα οπότε θα παραθέσω και τη δική μου λύση μπας και κάποιο άλλο παιδί θέλει να κάνει κάτι παρόμοιο.

Το έκανα με δομή δεδομένων πρακτικά και μια ουρά, κάτι σαν FIFO.

Playground: https://playcode.io/1039614

const date = new Date();

function getAllDaysInMonth(year, month) {
  const date = new Date(year, month, 1);
  const dates = [];

  while (date.getMonth() === month) {
    dates.push(new Date(date));
    date.setDate(date.getDate() + 1);
  }

  return dates;
}

const allDays = getAllDaysInMonth(date.getFullYear(), date.getMonth());
const employees = ["Giannis", "Petros", "Kostas"];
allDays.forEach((e) => {
  const selected = employees[0];
  employees.shift();
  console.log(`${selected} working in ${e}`);
  employees.push(selected);
});
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μία άλλη προσέγγιση είναι

atoma = ["Giannis", "Petros", "Kostas", "Thodoris"];
arat = atoma.length; 
for (let i = 0;i<31; i++)
  console.log (`Tin ${i+1} Ιανουαρίου 2023 ipiresia exei o ${atoma[i%arat]}`);

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

On 20/12/2022 at 15:00, k33theod said:

Μία άλλη προσέγγιση είναι

atoma = ["Giannis", "Petros", "Kostas", "Thodoris"];
arat = atoma.length; 
for (let i = 0;i<31; i++)
  console.log (`Tin ${i+1} Ιανουαρίου 2023 ipiresia exei o ${atoma[i%arat]}`);

 

Δεν έχουν όλοι οι μήνες 31 μέρες. Επίσης θα πρέπει να λάβεις υπόψη και τα δίσεκτα χρόνια κτλ.

Anyhow, μια λύση σε Python
 

from datetime import date
from datetime import timedelta
from itertools import cycle
from typing import Generator

def daterange(start: date, end: date) -> Generator[date, None, None]:
    return (start + timedelta(n) for n in range((end- start).days))

def print_shifts(workers: list[str], start_date: str, end_date: str) -> None:
    start = date.fromisoformat(start_date)
    end = date.fromisoformat(end_date)
    for (worker, date) in zip(cycle(WORKERS), daterange(start, end)):
        print(f"{date.isoformat()} - {worker}")

if __name__ == "__main__":
    WORKERS = ["kostas", "manos", "andreas", "maria", "eleni"]
    START_DATE = "2020-02-01"
    END_DATE = "2020-03-01"

    print_shifts(
        workers=WORKERS,
        start_date=START_DATE,
        end_date=END_DATE,
    )
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

const personsInShiftRota = ['John', 'Anna', 'Rachel', 'Nick']

const getRemainingShiftDatesForCurrentMonth = () => {
  const currentMonthIndex = new Date().getMonth()
  const today = new Date().getDate()
  const shiftDate = new Date() // today, for starters
  const shiftDates = [shiftDate.toDateString()]
  for (let i = today; i < 31; i++) {
    shiftDate.setDate(shiftDate.getDate() + 1)
    if (shiftDate.getMonth() === currentMonthIndex) {
      shiftDates.push(shiftDate.toDateString())
    }
  }
  return shiftDates;
}


const getShiftRota = (shiftDates, personsInShiftRota) => {
  const numberOfPersons = personsInShiftRota.length
  const rota = []
  shiftDates.forEach((shiftDate, index) => {
    const personIndex = index % numberOfPersons
    rota.push(`${shiftDate} - ${personsInShiftRota[personIndex]}`)
  })
  return rota
}

const shiftDates = getRemainingShiftDatesForCurrentMonth()
const shiftRota = getShiftRota(shiftDates, personsInShiftRota)

console.log(shiftRota)

Μιας και τρωγόμουν να γράψω λίγο κώδικα στις διακοπές, ιδού και η δική μου παραλλαγή που εκτυπώνει τις βάρδιες από σήμερα έως και το τέλος του τρέχοντα μήνα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...