#!/usr/bin/perl

# Antaa listan laskunumeroita ja niiden mukaisesti muodostettuja viitenumeroita.
# Syötteenä annetaan vuosiluku neljällä numerolla ja haluttu numeroiden määrä.
# Jos numeroita halutaan yli 99, ohjelman logiikka pettää.

# perustuu Antti Vähä-Sipilän koodiin
# http://www.cs.tut.fi/~kusti/viiteperl.html

if ($#ARGV<0) {
    print "Käyttö: viite.pl [vuosi] [määrä]\n";
    exit 1;
}

$vuosi = $ARGV[0];
if (defined($ARGV[1])) { $maara = $ARGV[1]; }
else { $maara = 20; }
    
for ($i = 01; $i<=$maara; $i++) {
    print "$i/$vuosi\t".&laske_viite($vuosi*100+$i) ."\n";
}

exit;

sub laske_viite {
        my ($viite) = @_;
        my $laskuri = 0, $summa = 0;
    
    # Viitteessä ilman tarkistetta saa olla max. 19 numeroa.
        
        my @kertoimet = (7, 3, 1);
        my $pituus=length($viite);
        my $alkuper=$viite;
    
        if ($viite =~ /\D/ || $pituus > 19 || $pituus < 1) {
	    return -1;
	}
        
        while ($laskuri < $pituus) {
	    $summa += ($viite % 10) * $kertoimet[$laskuri % 3];
	    $viite = int($viite / 10);
	    $laskuri++;
	}
        
        my $tarkiste = (10 - ($summa % 10)) % 10;
        
        return $alkuper.$tarkiste;
    }

# Viite suositellaan tulostettavaksi viiden numeron ryhmissä oikealta
# lukien lukemisen helpottamiseksi.

# Perusalgorytmin kirjoitti <avs@iki.fi> 281099
# Työkaluksi muokkasi <nvainio@iki.fi>
