KINO κληρώσεις στην C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

KINO κληρώσεις στην C

Δημοσίευσηαπό Gikoskos » 26 Ιαν 2017, 00:36

Ένα μικρό command-line utility που έκανα πριν απο καιρό στην C, το οποίο κατεβάζει κληρώσεις ΚΙΝΟ απο το site της ΟΠΑΠ και τις εκτυπωνει.

Επισης έχει και μία έξτρα λειτουργικότητα, κατα την οποία υπολογίζει και εκτυπώνει πόσο κερδίζουν 8 διαφορετικά δελτία ΚΙΝΟ σε κάθε κλήρωση.

Αν κάποιος παίξει 8 δελτία ΚΙΝΟ με 10 αριθμους το καθενα, οπού το 1ο δελτίο έχει τους αριθμους απο το 1 εως το 10, το 2ο έχει τους αριθμούς από το 11 έως το 20 κτλ τότε, για κάθε κλήρωση ΚΙΝΟ, κάποια μπορεί να κερδίζουν περισσότερα ευρώ από κάποια άλλα, και ένα δελτίο ακριβώς θα έχει πετύχει το ΚΙΝΟ bonus.

Ένα παράδειγμα output:
Κώδικας: Επιλογή όλων
Lottery 596912 in ascending order: 02 (04) 06 11 13 15 17 26 32 33 41 42 45 46 48 55 56 78 79 80
   --- 8 tickets of ten numbers (1 - 10, 11 - 20...) ---
1st ticket -> Total winning numbers: 03 with price value: 3.0 € (KINO bonus is in this group)
2st ticket -> Total winning numbers: 04 with price value: 0.0 €
3st ticket -> Total winning numbers: 01 with price value: 0.0 €
4st ticket -> Total winning numbers: 02 with price value: 0.0 €
5st ticket -> Total winning numbers: 05 with price value: 2.0 €
6st ticket -> Total winning numbers: 02 with price value: 0.0 €
7st ticket -> Total winning numbers: 01 with price value: 0.0 €
8st ticket -> Total winning numbers: 02 with price value: 0.0 €
Sum of price values: 5.0 €

Στην πρώτη γραμμή λέει τον αριθμό της κλήρωσης και τους αριθμούς που κερδίζουν στην συγκεκριμένη κλήρωση, σε αύξουσα σειρά. Το KINO bonus είναι ο αριθμός που βρίσκεται σε παρενθέσεις. Από κάτω λέει πόσα ευρώ βγάζει κάθε δελτίο, στην συγκεκριμένη κλήρωση, πόσοι αριθμοί κερδίζουν από το κάθε δελτίο, και επίσης ποιο δελτίο έχει το KINO bonus.

Στο τέλος βγάζει το άθροισμα από τις τιμές όλων των δελτίων μαζί.

Για το compile, το μόνο που χρειάζεται είναι το libxml2 και το libcurl (εφόσον έχετε ήδη βάλει το πακέτο build-essential). Δεν είμαι 100% σίγουρος αλλά πιστεύω πως κάτι τέτοιο απο πριν θα σας καλύψει
Κώδικας: Επιλογή όλων
sudo apt-get install build-essential libxml2 libcurl libxml2-dev libcurl-dev

και μετά απο αυτό τρέχετε ένα
Κώδικας: Επιλογή όλων
make

μέσα στο directory του project, και ξεμπερδέψατε.

Για να το χρησιμοποιήσετε, καλέστε το πρόγραμμα μαζί με τουλάχιστον άλλα δύο arguments. Ο αριθμός των arguments που παίρνει το πρόγραμμα, είναι από 2 έως και 4. Αν βάλετε περισσότερα από 4 arguments ή λιγότερα από 2, τότε δεν θα γίνει τίποτα.

Πρώτο argument είναι ο αριθμός της πρώτης κλήρωσης (πχ 100032) και το δεύτερο είναι ο αριθμός της δεύτερης (πχ 300000).
Κώδικας: Επιλογή όλων
./kino_p 100 300

Η παραπάνω κλήση θα εκτυπώσει τις κληρώσεις από την 100 εως την 300, καθώς και τα έξτρα δεδομένα.

Το 3ο argument μπορεί να είναι ότι θέλει, σημασία έχει αν υπάρχει 3ο argument ή όχι. Αν υπάρχει 3ο argument τα αρχεία xml που κατεβάζονται από το site της ΟΠΑΠ, για κάθε κλήρωση, διαγράφονται και δεν αποθηκεύονται στον δισκο (στον φάκελο xml που δημιουργείται). Αν αποθηκεύονται τα αρχεία, τότε την επόμενη φορά που θα χρειαστεί να ξαναδείτε τις ίδιες κληρώσεις, το πρόγραμμα απλά θα διαβάσει τα αρχεία xml στον δίσκο, και δεν θα τα κατεβάσει απο το 0.

Αν υπάρχει 4ο argument, τότε αυτό θα γίνει το όνομα ενός αρχείου μέσα στο οποίο θα γραφτούν τα δεδομένα, αντι να εκτυπωθούν στην κονσόλα. Αυτό έχει θετικό, πως η εκτέλεση του προγράμματος θα τελειώσει πιο γρήγορα απ'ότι αν τα δεδομένα εκτυπώνονταν στην κονσόλα. Ωστόσο το αρνητικό είναι πως δεν θα δείτε τα cool χρώματα που εκτυπώνονται στην κονσόλα ;)

Εννοείται πως αν βάλεις 4ο argument υποχρεωτικά πρέπει να βάλεις και 3ο. Δηλαδη αν τα δεδομενα γράφονται σε αρχείο, υποχρεωτικά θα διαγραφτούν και τα αρχεία xml στην συνέχεια. Αυτό είναι κακό design choice απο εμενα που δεν το πολυσκεφτηκα οσο το υλοποιούσα. Θα λυνοταν με λίγες αλλαγες αλλά δεν πειράζει :roll:

Μία κλήση του προγράμματος που κατεβάζει τις κληρώσεις KINO από 1000 μέχρι 2000 και εκτυπώνει τα αποτελέσματα στο αρχείο results.txt μοιάζει κάπως έτσι:
Κώδικας: Επιλογή όλων
./kino_p 1000 2000 d results.txt


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

Καταλαβαίνω πως με μία γλώσσα σαν την Python κάτι τέτοιο θα γινόταν πολυ πιο εύκολα και γρήγορα, καθώς η Python ειναι ειδικα σχεδιασμενη για τετοια πραματα (http downloads, xml parsing) αλλά ήταν καλή άσκηση να το κάνω στην C. Επίσης όλα τα downloads γίνονται σε νήματα, δηλαδή αυξάνεται αρκετά η ταχύτητά τους. Ξέρω πως θα μπορούσα να χρησιμοποιήσω το libcurl multi API αλλά δυστυχώς έμαθα για την ύπαρξη του πολύ αργότερα, αφού υλοποιήσα το δικό μου σύστημα με τα νήματα.

Ο μεγιστος προεπιλεγμένος αριθμός νημάτων κατεβάσματος είναι 30. Μπορείτε να το αλλάξετε από το αρχείο k_hdr.h εκεί που λέει
Κώδικας: Επιλογή όλων
#define MAX_DOWNLOAD_THREADS           30

να βάλετε όσα νήματα θέλετε εσείς και να κάνετε recompile το πρότζεκτ.

Εδώ είναι το λινκ για απευθείας κατέβασμα της τελευταίας έκδοσης του git repo από το gitlab, σε μορφή tar.gz
Gikoskos
babeTUX
babeTUX
 
Δημοσιεύσεις: 8
Εγγραφή: 25 Ιαν 2017, 16:55
Εκτύπωση

  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι