Python :: Aufgabe #313 :: Lösung #1
3 Lösungen
#313
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ß
#1
von felixTheC (1200 Punkte)
- 09.02.2021 um 15:23 Uhr
Python-Code
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"
}'
Kommentare:
Für diese Lösung gibt es noch keinen Kommentar
Seite 1 von 0
1