Python :: Aufgabe #313
3 Lösungen
Seriennummer Euro- Banknoten überprüfen (bis 2013)
Anfänger - Python
von JKooP
- 26.01.2021 um 10:26 Uhr
Jede Banknote enthält eine eindeutige Seriennummer, bestehend aus 12 Zeichen
mit folgender alphanumerischer Signatur (ab 2013 abweichend):
LNNNNNNNNNNJ (z.B. X17291528696)
L: Ländercode als Buchstabe von A bis Z (z.B. X für Deutschland, N für Österreich…)
N: 10 Ziffern von 0 bis 9
J: Prüfziffer von 1 bis 9
Berechnung der Prüfziffer:
Der Ländercode muss in eine Zahl umgewandelt werden.
Diese ergibt sich aus der Position des Buchstabens im Alphabet. (A = 1, B = 2; … X = 24)
Dann wird die Quersumme aus der entstandenen Zahl des Ländercodes und den 10 folgenden Ziffern ohne Prüfziffer gebildet.
241729152869 => 2+4+1+7+2+9+1+5+2+8+6+9 = 56
Es wird der Rest (R) der Division durch 9 ermittelt
R = 56 Modulo 9 = 2
und dann der Prüfwert (P).
P = 8 – R => 8 – 2 = 6
Wenn P = 0, dann ist J = 9, ansonsten ist J = P.
X17291528696 => gültige Banknote!
Aufgabe:
Schreibe ein Programm, welches folgende Ergebnisse liefert:
1. Prüfen, ob es sich bei der eingegebenen Seriennummer um die richtige Signatur handelt.
2. Generieren der Prüfziffer J aus dem Ländercode und den folgenden 10 Ziffern.
3. Prüfen, ob es sich bei Eingabe einer Seriennummer um eine Euro- Banknote handelt.
4. Ausgabe des zugehörigen Landes der Euro- Banknote (siehe NZB-Kennung)
Viel Spaß
mit folgender alphanumerischer Signatur (ab 2013 abweichend):
LNNNNNNNNNNJ (z.B. X17291528696)
L: Ländercode als Buchstabe von A bis Z (z.B. X für Deutschland, N für Österreich…)
N: 10 Ziffern von 0 bis 9
J: Prüfziffer von 1 bis 9
Berechnung der Prüfziffer:
Der Ländercode muss in eine Zahl umgewandelt werden.
Diese ergibt sich aus der Position des Buchstabens im Alphabet. (A = 1, B = 2; … X = 24)
Dann wird die Quersumme aus der entstandenen Zahl des Ländercodes und den 10 folgenden Ziffern ohne Prüfziffer gebildet.
241729152869 => 2+4+1+7+2+9+1+5+2+8+6+9 = 56
Es wird der Rest (R) der Division durch 9 ermittelt
R = 56 Modulo 9 = 2
und dann der Prüfwert (P).
P = 8 – R => 8 – 2 = 6
Wenn P = 0, dann ist J = 9, ansonsten ist J = P.
X17291528696 => gültige Banknote!
Aufgabe:
Schreibe ein Programm, welches folgende Ergebnisse liefert:
1. Prüfen, ob es sich bei der eingegebenen Seriennummer um die richtige Signatur handelt.
2. Generieren der Prüfziffer J aus dem Ländercode und den folgenden 10 Ziffern.
3. Prüfen, ob es sich bei Eingabe einer Seriennummer um eine Euro- Banknote handelt.
4. Ausgabe des zugehörigen Landes der Euro- Banknote (siehe NZB-Kennung)
Viel Spaß
Lösungen:
import json
import re
from pathlib import Path
from string import ascii_uppercase
country_code_dict = {char: idx for idx, char in enumerate(ascii_uppercase, 1)}
with Path('nzb.json').open('r') as file:
country_by_code = json.load(file)
class InvalidBanknote(Exception):
pass
def note_validator(banknote: str) -> None:
is_valid = False
valid_signature = re.match(r'([A-Z]{1}[0-9]{10}[1-9]{1})', banknote) is not None
lcc = country_code_dict.get(banknote[0], None)
if lcc is not None and valid_signature:
checksum = lcc + sum(int(num) for num in banknote[1:-1])
p = 8 - (checksum % 9)
j = int(banknote[-1])
if p == 0:
is_valid = j == 9
else:
is_valid = j == p
if is_valid:
print(f'The note: {banknote} is valid and comes from "{country_by_code[banknote[0]]}"')
else:
raise InvalidBanknote(f'The note: {banknote} is not a valid € banknote.')
The json file
'{
"Z": "Belgien",
"Y": "Griechenland",
"X": "Deutschland",
"W": "Dänemark",
"V": "Spanien",
"U": "Frankreich",
"T": "Irland",
"S": "Italien",
"R": "Luxemburg",
"Q": "nicht vergeben",
"P": "Niederlande",
"O": "nicht vergeben",
"N": "Österreich",
"M": "Portugal",
"L": "Finnland",
"K": "Schweden",
"J": "Vereinigtes Königreich",
"I": "nicht vergeben",
"H": "Slowenien",
"G": "Zypern",
"F": "Malta",
"E": "Slowakei",
"D": "Estland",
"C": "Lettland",
"B": "Litauen",
"A": "nicht vergeben"
}'
#Seriennummer Banknoten prüfen
buchstabe = ('a b c d e f g h i j k l m n o p q r s t u v w x').split()
länder = ('leer Litauen Lettland Estland Slowakei Malta Zypern Slowenien leer UK Schweden Finnlad Protugal Österreich leer Niederlande leer Luxemburg Italien Irland Frankreich Spanien Dänemark Deutschland').split()
buchstabe_land = {}
seriennummer = ['X17291528696', 'S37373737354', 'X00000000134', 'A123456789012', 'Z12345678901']
zahl = 1
for b in buchstabe:
buchstabe_land[b] = [zahl, länder[buchstabe.index(b)]]
zahl = zahl + 1
def nummer_prfen():
if len(seriennummer) == 12 and seriennummer.rstrip('1,2,3,4,5,6,7,8,9,0').lower() in buchstabe:
return True
else:
print('Seriennummer ist ungültig')
return False
def p_ziffer():
global land
nummer, land = buchstabe_land[seriennummer.rstrip('1,2,3,4,5,6,7,8,9,0').lower()]
snum_bereinigt = list(seriennummer)
snum_bereinigt.pop(0)
snum_bereinigt.pop(-1)
ergebnis = sum(int(x) for x in snum_bereinigt)
for x in str(nummer):
ergebnis = ergebnis + int(x)
r = ergebnis % 9
p = 8 - r
j = list(seriennummer).pop(-1)
if p == int(j):
return True
else:
return False
for seriennummer in seriennummer:
print('\n' + seriennummer)
if nummer_prfen() is True:
if p_ziffer() is True:
print('Banknote ist gültige Euronote aus',land)
else:
print('Banknote ist keine gültige Euronote')
else:
continue
seriennummer = "X17291528696"
laendercode = seriennummer[0]
laender = ["nicht vergeben", "Litauen", "Lettland", "Estland", "Slowakei", "Malte", "Zypern", "Slowenien",
"nicht vergeben", "Vereintes Königreich", "Schweden", "Finnland", "Portugal", "Österreich", "nicht vergeben",
"Niederlande", "nicht vergeben", "Luxemburg", "Italien", "Irland", "Frankreich", "Spanien", "Dänemark",
"Deutschland", "Griechenland", "Belgien"]
# Prüfung, ob die Seriennummer zu lang oder zu kurz ist
# Prüfung, ob außer an Stelle 1 weitere Buchstaben sind
def erste_pruefung(seriennummer_fkt):
if len(seriennummer_fkt) != 12:
return False
test = seriennummer_fkt.lstrip(seriennummer_fkt[0])
try:
int(test)
except:
return False
else:
return True
# wandelt den Buchstaben des Ländercodes in Zahl um.
# Prüft außerdem, ob es sich sich um ein anders Zeichen als einen Großbuchstaben handelt
def laendercode_zu_zahl(laendercode_fkt):
index = 0
characters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'X', 'Y', 'Z', 'STOP']
for e in characters:
index += 1
if laendercode_fkt == e:
return str(index)
if index > 26:
return False
# Prüfung, ob der Prüefwert gleich der letzten Ziffer der Seriennummer ist
def pruefziffer_check(pruefzahl_fkt, j_ziffer):
quersumme = 0
for e in pruefzahl_fkt:
quersumme += int(e)
pruefwert = 8 - (quersumme % 9)
if pruefwert == 0:
pruefwert = 9
if pruefwert == j_ziffer:
return True
else:
return False
# Überprüfung der einzelnen Kriterien
def banknotencheck(seriennummer_check):
if not erste_pruefung(seriennummer_check):
return False
else:
j_ziffer = int(seriennummer[11])
n_ziffer = seriennummer.rstrip(seriennummer[11]).lstrip(seriennummer[0])
if not laendercode_zu_zahl(laendercode):
return False
else:
pruefzahl = laendercode_zu_zahl(laendercode) + n_ziffer
if pruefziffer_check(pruefzahl, j_ziffer):
return True
else:
return False
# Überprüfung des Ländercodes und Ausgabe
if banknotencheck(seriennummer):
zahl = int(laendercode_zu_zahl(laendercode))
land = laender[zahl - 1]
if land == "nicht vergeben":
print("Ländercode nicht vergeben - ungültige Banknote")
else:
print("gültige Banknote")
print("die Banknote kommt aus", land)
else:
print("ungültige Banknote")
