gioiliop7 Δημοσ. 18 Δεκεμβρίου 2022 Δημοσ. 18 Δεκεμβρίου 2022 Καλησπέρα παιδιά. Δεν ξέρω αν έχετε φτιάξει κάτι παρόμοιο παλαιότερα, αλλά δυσκολεύομαι να βρω τη λογική για τον αλγόριθμο και το πως θα δουλεύει για κάτι που θέλω να φτιάξω οπότε σας το παραθέτω εδώ Είμαστε 3 άτομα σε μία υπηρεσία και κάνουμε ημερίσιες βάρδιες και θέλω να φτιάξω ένα script το οποίο θα κάνει generate τις υπηρεσίες του μήνα. Θα το φτιάξω σε ένα js αρχείο σαν επιλογή γλώσσας αλλά δεν με νοιάζει τόσο αυτό, ακόμα βρίσκομαι στην λογική του όλου πράγματος. Έχω έναν πίνακα με τα άτομα και ένα με τις ημέρες του μήνα. Δεν μπορώ να σκεφτώ πως θα ήταν σωστός τρόπος να γίνει αυτό. Έχω σκεφτεί μέχρι και fifo και όταν πάω να το υλοποιήσω πάλι κολλάω. Loop στις μέρες; Loop στα άτομα και μετα στις μέρες; Μία βοήθεια αν έχετε σκεφτεί κάτι θα ήταν σημαντική. Ευχαριστώ πολύ.
παπι Δημοσ. 18 Δεκεμβρίου 2022 Δημοσ. 18 Δεκεμβρίου 2022 15 λεπτά πριν, gioiliop7 είπε generate τις υπηρεσίες Βαρδιες θες να πεις;
gioiliop7 Δημοσ. 18 Δεκεμβρίου 2022 Μέλος Δημοσ. 18 Δεκεμβρίου 2022 Ναι. Πρακτικά αν εγώ έχω Δευτέρα θα πρέπει αυτόματα να ξαναμπαινω για βάρδια την Πέμπτη. Είναι ολοήμερες οπότε δεν θα χρειαστεί να μπούνε δύο άτομα σε μια μέρα και αυτό το κάνει λίγο πιο εύκολο
παπι Δημοσ. 18 Δεκεμβρίου 2022 Δημοσ. 18 Δεκεμβρίου 2022 (επεξεργασμένο) Ααα, αρα θες ενα "κυκλικο" 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; } Επεξ/σία 18 Δεκεμβρίου 2022 από παπι 1
Λύση gioiliop7 Δημοσ. 18 Δεκεμβρίου 2022 Μέλος Λύση Δημοσ. 18 Δεκεμβρίου 2022 Είσαι απίστευτος. Αρχικά ευχαριστώ για την απάντησή σου. Τα σαββατοκύριακα τα χρειαζόμουν μέσα ωστόσο μου άρεσε ο τρόπος που το προσέγγισες. Επίσης επειδή έτρεξα το 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); }); 1
k33theod Δημοσ. 20 Δεκεμβρίου 2022 Δημοσ. 20 Δεκεμβρίου 2022 Μία άλλη προσέγγιση είναι 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]}`);
pmav99 Δημοσ. 25 Δεκεμβρίου 2022 Δημοσ. 25 Δεκεμβρίου 2022 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, ) 1
ghostaki Δημοσ. 27 Δεκεμβρίου 2022 Δημοσ. 27 Δεκεμβρίου 2022 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) Μιας και τρωγόμουν να γράψω λίγο κώδικα στις διακοπές, ιδού και η δική μου παραλλαγή που εκτυπώνει τις βάρδιες από σήμερα έως και το τέλος του τρέχοντα μήνα.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα