Προγραμματιστική πρόκληση Νο 13 : Μάθε πότε εμβολιάζεσαι

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

Το πρόγραμμα πρέπει να εκτελεί επιτυχώς:

  • Την είσαγωγή και τον έλεγχο αν ο συγκεκριμένος αριθμός είναι της μορφής ΑΜΚΑ
  • Το έλεγχο σε ποια ηλικιακή ομάδα ανήκει ο κάτοχος του ΑΜΚΑ
  • Αν ανήκει στην τρέχουσα εμβολιαστική περίοδο
  • Αν ανήκει ή όχι σε ομάδα που μπορεί να επιλέξει εμβόλια

Προφανώς για τους πιο έμπειρους δεν αποτελεί πρόκληση αλλά αν θέλετε να το κάνετε πιο ενδιαφέρον γράψτε το σε όσο λιγότερες γραμμές μπορείτε και προφανώς σε ότι γλώσσα θέλετε.

Μπορείτε να δείτε εδώ https://emvolio.gov.gr/eligibility ποιες ειναι η ηλικίες που εμβολιάζονται

1 «Μου αρέσει»

Θα γραψω καποιες σκεψεις , αν και δεν ξερω να το κανω προγραμματιστικα :slight_smile:

Το αμκα ειναι 11 νουμερα νομιζω. Αρα εισαγει ο χρηστης τον αμκα και το προγραμμα θα τσεκαρει αν ειναι 11 νουμερα. Πες οτι ειναι 11 νουμερα… πως διασφαλιζεται οτι ειναι εγκυρος αμκα ? Ακομα και αν το 5ο και 6ο νουμερο αντιστοιχει οντως στο ετος γεννησης , τα υπολοιπα μπορει να ειναι ακυρα.
Τα υπολοιπα ζητουμενα θεωρω οτι ειναι απλοι ελεγχοι με τις πληροφοριες απο το σαιτ.

Με τις λιγοστες μου γνωσεις , θεωρω οτι το ολο κολπο παιζεται στο πως θα ελεγχθει οτι ο αμκα ειναι εγκυρος αριθμος. Οχι μονο σαν πληθος ψηφιων. Δηλαδη δεν ξερω αν υπαρχει καποιο API απο καποια κυβερνητικη σελιδα που μπορει να χρησιμοποιηθει…
Εκτος και αν δεν ειναι καν ζητουμενο κατι τετοιο στην προκληση :slight_smile:

Το προσεγγίζεις καλά
Συγκεκριμένα το ΑΜΚΑ αποτελείται απο 11 ψηφία.

  • Τα 2 πρώτα είναι η μέρα γέννησης
  • Τα 2 επόμενα είναι ο μήνας
  • Τα επόμενα 2 το έτος γέννησης
  • Τα υπόλοιπα 5 είναι random

Άρα σωστα το είπες, πρώτα πρέπει να δούμε την εγκυρότητα του ΑΜΚΑ.

Για τον 3ο έλεγχο (έτος γέννησης) πρέπει να βρούμε τον γηραιότερο άνθρωπο στην Ελλάδα… :cowboy_hat_face:

Λοιπον ψαχνοντας βρηκα ενα σαιτ που κανει ακριβως αυτο. Ελεγχει την ορθοτητα ενος δοθεντος ΑΜΚΑ. Μπορω να βαλω λινκ , δεν ξερω αν επιτρεπεται εδω στο φορουμ.
Λιγο που κοιταξα το source της σελιδας και τα σκριπτς που χρησιμοποιει και οσο μπορω να καταλαβω , δεν χρησιμοποιει καποιο API απο επισημη κρατικη/κυβερνητικη σελιδα.
Αυτο που καταλαβαινω ειναι οτι οι ΑΜΚΑ αριθμοι υποκεινται σε καποια μαθηματικη φορμουλα.
Που εχει να κανει με modules (Εχω ξεχασει τα παντα με αυτα , απο τοτε που τα καναμε στο Μαθηματικο :slight_smile: ).

Δηλαδη , αν ο αριθμος βγαζει συγκεκριμενο αποτελεσμα , ειναι εγκυρος , αλλιως ειναι ακυρος. Εβαλα το ΑΜΚΑ μου και μετα εβαλα τον ιδιο αριθμο με αλλαγμενο ενα ψηφιο και τα αποτελεσματα που εβγαλε ο “ελεγχος” ηταν σωστος.

1 «Μου αρέσει»

Σίγουρα περιέχουν κάποιο CRC ή parity που να επιβεβαιώνει την εγκυρότητα του αριθμού. Κάτι απλό που να μπορείς να το κάνεις στο κεφάλι σου, και έχω δει γραμματείς να το κάνουν.

ΥΓ: Τα link προς τρίτους επιτρέπονται στο φόρουμ και ας χάσουμε τις διαφημίσεις :grinning:.
Αν κάτι απαγορεύετε και είναι το άκριτο self-promotion. Δεν το έχουμε αντιμετωπίσει ακόμα, αλλά πιστεύω όλοι μπορούμε να καταλαβαίνουμε πότε κάποιος θέλει να βοηθήσει ή απλά προσπαθεί να κάνει διαφήμιση.

Ουτε καν ειναι δικο μου το σαιτ , ουτε καν ξερω αυτον που το εφτιαξε.
Ενταξει ψεματα , τον ξερω. Γραφει το ονομα του στην σελιδα :slight_smile:

Η σελιδα , τελοσπαντων , ειναι αυτη. Ενα απο τα σκριπτς που βρηκα οτι χρησιμοποιει ειναι αυτο εδω. Οσοι ξερετε λιγα παραπανω πραγματα απο εμενα ριξτε μια ματια εκει στον ελεγχο που κανει με τα modules.

Η σελιδα ανηκει στην Διευνθυνση Πρωτοβαθμιας Εκπαιδευσης Ν. Δραμας , αρα την λες και σοβαρη…

Και κατι να ευθυμησουμε. Ο πατερας μου εχει αποστηθισει ενα σωρο νουμερα , π.χ. αφμ , κινητα , σταθερα κλπ αλλα αρνειται πεισματικα να αποστηθισει το ΑΜΚΑ του , επειδη ειναι λαθος :slight_smile: Σαν νουμερο ειναι εγκυρο προφανως , αλλα οταν του το βγαλανε κανανε λαθος στην ημερομηνια γεννησης του !! Οχι στο ετος προφανως , αλλα στην μερα/μηνας.
Αναρωτιεμαι αν τετοια φαινομενα μπορουν να προβλεφθουν στην παραπανω προγραμματιστικη προκληση :slight_smile:

Δίνω μια πρόταση σε python για την εγκυρότητα του ΑΜΚΑ. Είναι συνειδητά ημιτελής

while True:
    try:
        amka=int(input("Δώσε ΑΜΚΑ : "))
        if len(str(amka))==11 and int(str(amka)[0:2]) <= 31:
            print(amka)
            break
        else:
            print("Μη έγκυρη μορφή ΑΜΚΑ")
    except ValueError:
        print("Δεν έδωσες έγκυρη τιμή ή αριθμό")
        continue

Από ότι βλέπω υπάρχει συγκεκριμένος αλγόριθμος που ελέγχει την εγκυρότητα του ΑΜΚΑ, ο Αλγόριθμος του Λουν

@billniakas Δυο παρατηρησεις.

  1. Ελεγχος για μηδενικο ΑΜΚΑ.
  2. Προκυπτει ενα θεμα με ΑΜΚΑ που ξεκιναει απο μηδεν. Εβαλα των γονιων μου που ξεκινανε απο μη-μηδενικο νουμερο και δειχνει να δουλευει. Εβαλα το δικο μου που ξεκιναει απο μηδεν , και το βγαζει μη εγκυρο.
    Εσυ ξερεις πως διορθωνεται αυτο προγραμματιστικά :slight_smile:
  3. (bonus) Εβαλα για πλακα για αριθμο το “12345678989” και το βγαζει εγκυρο. Ναι οκ εχει 11 ψηφια , ναι οκ μπορει ο αλγορθμος του Λουν να το βγαζει σωστο , αλλα αν σκεφτουμε τι απεικονιζουν τα 4 πρωτα ψηφια , λογικα δεν παιζει να υπαρχει τετοιος ΑΜΚΑ. Δεν υπαρχει 34ος μηνας :slight_smile:
    Αρα προκυπτουν καποιοι επιπροσθετοι ελεγχοι. Π.χ. τα δυο πρωτα ψηφια να μην υπερβαινουν το 30 ή/και 31 και ενιοτε ουτε καν το 28 και 29 (δισεκτα ετη). Αρα ο ελεγχος να λαμβανει υποψη και τα ψηφια 5 και 6 που ειναι το ετος , οπως και τα ψηφια 3 και 4 που ειναι ο μηνας και δεν πρεπει επουδενι να ξεπερνα το νουμερο 12.
    Ολα αυτα εφοσον δεχτουμε οτι ο ελεγχος που γινεται στον κωδικα σου ειναι σωστη υλοποιηση του αλγοριθμου του Λουν.

Όχι δεν είναι σωστή υλοποίηση. Για δες αυτή

def check_amka(amka):
    amka = [int(d) for d in str(amka)]
    even_sum=0
    odd_sum=0
    for i in range (0,10,2):
        #print(amka[i])
        #print(amka[i+1])
        odd_sum += amka[i]
        if 2*amka[i+1] > 9:
            even_sum += sum([int(d) for d in str(2*amka[i+1])])
        else:
            even_sum += 2*amka[i+1]

    return (odd_sum+even_sum)%10

while True:
    try:
        amka=input("Δώσε ΑΜΚΑ : ")
        if int(amka[10]) == 0:
            check_digit=0
        else:
            check_digit=10 - int(amka[10])
        if check_amka(amka) == check_digit: 
            print("Εγκυρος ΑΜΚΑ")
            break
        else:
            print("Μη έγκυρος ΑΜΚΑ")
            
        
    except ValueError:
        print("Δεν έδωσες έγκυρη τιμή ή αριθμό")
        continue

edit : Με 3 ΑΜΚΑ που δοκίμασα η συγκεκριμένη δουλεύει

@billniakas Δειχνει να δουλευει σωστα. Απλα βαζεις και εναν ελεγχο για μη-μηδενικο ΑΜΚΑ και το πουλας :slight_smile:

1 «Μου αρέσει»

Εγώ είμαι open source παληκάρι δεν κάνω τέτχοια

#!/usr/bin/env python3
def check_amka(amka):
    amka = [int(d) for d in str(amka)]
    even_sum=0
    odd_sum=0
    for i in range (0,10,2):
        odd_sum += amka[i]
        if 2*amka[i+1] > 9:
            even_sum += sum([int(d) for d in str(2*amka[i+1])])
        else:
            even_sum += 2*amka[i+1]
    return (odd_sum+even_sum)%10
while True:
    try:
        amka=input("Δώσε ΑΜΚΑ : ")
        if amka == '00000000000':
            print("Άστα αυτά πονηρέ......")
            continue
        
        if int(amka[10]) == 0:
            check_digit=0
        else:
            check_digit=10 - int(amka[10])
        if check_amka(amka) == check_digit: 
            print("Εγκυρος ΑΜΚΑ")
            break
        else:
            print("Μη έγκυρος ΑΜΚΑ")
            
        
    except ValueError:
        print("Δεν έδωσες έγκυρη τιμή ή αριθμό")
        continue

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

Βασικά τα πρώτα 4 είναι ο αύξων αριθμός γεννήσεων εκείνη την ημέρα και το τελευταίο είναι αριθμός ελέγχου ώστε να επαληθεύεται το αποτέλεσμα βάση του αλγορίθμου Λουν.

Μια λύση με JS και μια ιστοσελίδα για χρήση: https://jsbin.com/jinaveq/edit?html,output

1 «Μου αρέσει»

Εννοεις οτι απο τα τελευταια 5 “random” νουμερα στο τελος του ΑΜΚΑ , τα 4 πρωτα υποδηλωνουν τον αυξων αριθμο γεννησεων εκεινη την μερα ? Δηλ, στο δικο μου ΑΜΚΑ , τα 4 αυτα νουμερα , ειναι 0319 . Και γεννηθηκα πρωι. Δηλαδη εκεινη την μερα πριν απο μενα ειχαν προλαβει και ειχαν γεννηθει 318 αλλα παιδια ?
Τι διαολο , τοση κινηση πια εκεινη την μερα ? :slight_smile:

1 «Μου αρέσει»

Με ένα γρήγορο search είναι ο αριθμός του πότε γίνεται τελικά η καταχώρηση στο μητρώο πολιτών (μάλλον…).

1 «Μου αρέσει»

Και αγχωθηκα για μια στιγμη… λεω τι φαση … 300 γεννησεις και ακομα δεν ειχε παει μεσημερι…
Ουτε κουνελια δεν γεννανε τοσο πολυ σε μια μερα :slight_smile:

1 «Μου αρέσει»