#!/tools0/gnu/bin/perl -w

# Das Lufthansa Pruefzeichen der PK-Nummer
# ----------------------------------------
# Author: Torsten Sillke, FRA AE/DCS, Tel. 91314
# Datum:  Dez. 1993 
# 
#   Eingabezeilenformat:  Nummer Kommentar
#   Ausgabezeilenformat:  Nummer Pruefzeichen Kommentar
#
# Beispiel
# --------
#  Eingabezeilen:
#
#   15637 Petra
#   5111 Torsten Sillke
#
#  Ausgabezeilen:
#
#   015637 H Petra
#   005111 D Torsten Sillke
#
#
# Verfahren: 137-Code
# -------------------
#
#  Testen ob der Pruefcode passt:
#
#  - Die Zahl wird auf 6 Stellen aufgefuellt durch fuehrende Nullen.
#  - Der Buchstabe wird in eine Ziffer (die 7te) gewandelt wie folgt:
#      A B C D E F G H I K
#      1 2 3 4 5 6 7 8 9 0
#  - Die 7 stellige Zahl mit den Ziffern a1, a2, ..., a7 erfuellt
#    die folgende sogenannte Kontroll-Gleichung:
#
#    a1 + 3*a2 + 7*a3 + a4 + 3*a5 + 7*a6 + a7 = 0 (modulo 10)
#
#  Beispiel Test
#
#    Gegeben: 5111 D
#  - 005111 D   (6 Stellen)
#  - 005111 4   (Buchstabe D ist Ziffer 4)
#  - 0 + 3*0 + 7*5 + 1 + 3*1 +7*1 + 4 = 50  (ist durch 10 teilbar)
#    Test erfolgreich.
#
# Referenz fuer den 137-Code:
#
# - W. Press, S. Teukolsky, W. Vetterling, B. Flannery:
#     Numerical Recipes in C
#     The Art of Scientific Computing (Second Edition)
#
#     http://nr.harvard.edu/nr/bookc.html (Online Version)
#     20.3 Cyclic Redundancy and Other Checksums 896-903
#

@code = split('', "ABCDEFGHIK");
@factor = (1,3,7,1,3,7);

while (<ARGV>) {
   ($num, $rest) = /(\d*)(.*)/;
   $num = sprintf("%06d", $num);
   @digits = split('', $num);
   for ($n=$i=0; $i<6; $i++) {
      $n += $factor[$i] * $digits[$i];
   }
   print "$num $code[9 - $n % 10] $rest\n";
}

