[RUBY] Accélérez approximativement le chiffre de contrôle de mon numéro d'environ 10% (je ne sais pas car je ne l'ai pas mesuré)

Tout d'abord, réfléchissez bien à la méthode de calcul

Avant .

Tout d'abord, examinons de plus près comment calculer les numéros d'inspection (chiffres de contrôle). Si vous le regardez du point de vue du programmeur, vous pouvez voir que le calcul doit être effectué par la procédure suivante.

  1. Mettez $ P et Q $ comme suit. $ P $ est une liste qui comprend des nombres à 11 chiffres autres que les chiffres de contrôle dans Mon numéro comme éléments, et $ P _ {0} $ dans $ P $ représente le premier chiffre des nombres à 11 chiffres. Et. Chaque élément $ Q_n $ de $ Q $ est calculé comme $ n \ bmod 6 + 2 $. Cependant, $ n $ vaut $ 0 \ le n \ le 10 $.
    • P = (P_{10}, P_{9}, P_{8}, ..., P_{0})
    • Q = (Q_{10}, Q_{9}, Q_{8}, ..., Q_{0}) = (6, 5, 4, 3, 2, 7, 6, 5, 4, 3, 2)
  2. Trouvez $ r = (11- \ sum_ {n = 1} ^ {11} P_n \ cdot Q_n \ bmod 11) \ bmod 10 $ et indiquez $ r $ comme numéro d'inspection.

Une fois que vous savez cela, il est facile d'écrire dans n'importe quelle langue. Comme le branchement conditionnel n'apparaît pas, la vitesse d'exécution sera probablement plus rapide. Écrivons-le maintenant.

Ruby

verify_my_number.rb


def verify_my_number(my_number)
  remain, given_check_digit = my_number.divmod(10)
  check_digit = 0

  11.times do |i|
    remain, p_i = remain.divmod(10)
    check_digit += p_i * (i % 6 + 2)
  end

  (11 - check_digit % 11) % 10 == given_check_digit
end

Perl

verify_my_number.pl


sub verify_my_number {
    my ($my_number) = @_;
    my $given_check_digit = $my_number % 10;
    my $check_digit = 0;

    for (my $i = 0; $i < 11; $i++) {
        $my_number /= 10;
        $check_digit += ($my_number % 10) * ($i % 6 + 2);
    }

    return (11 - $check_digit % 11) % 10 == $given_check_digit;
}

Ce n'est pas si différent de Ruby et ce n'est pas intéressant, alors je vais essayer une autre façon d'écrire. Je ne pense pas qu'il y ait un avantage en termes de vitesse simplement parce que c'est un peu amusant à écrire.

verify_my_number2.pl


sub verify_my_number {
    my ($my_number) = @_;
    my $check_digit = 0;

    map {
        $check_digit += $my_number / (10 ** ($_ + 1)) % 10 * ($_ % 6 + 2);
    } (0 .. 10);

    return (11 - $check_digit % 11) % 10 == $my_number % 10;
}

C

verify_my_number.c


int
verify_my_number(long long int my_number)
{
        int check_digit = 0;
        int given_check_digit = my_number % 10;

        for (int i = 0; i < 11; i++) {
                my_number /= 10;
                check_digit += (my_number % 10) * (i % 6 + 2);
        }

        return (11 - check_digit % 11) % 10 == given_check_digit;
}

Go

verify_my_number.go


func verify_my_number(my_number int) bool {
    check_digit := 0
    given_check_digit := my_number % 10

    for i := 0; i < 11; i++ {
        my_number /= 10
        check_digit += (my_number % 10) * (i % 6 + 2)
    }

    return (11 - check_digit % 11) % 10 == given_check_digit
}

bash

verify_my_number.sh


function verify_my_number {
    n=`printf %012d $1`
    given_check_digit=$(($1 % 10))
    check_digit=`echo -n $n|grep -o .|paste -d\* - <(echo -n '654327654320'|grep -o .)|paste -d+ - - - - - - - - - - - -|sed -e 's/^/echo $(((11-(/' -e 's/$/)%11)%10))/'|sh`
    [ $check_digit -eq $given_check_digit ] && echo 'OK' || echo 'NG'
}

Excel Si vous souhaitez simplement calculer le chiffre de contrôle, vous pouvez écrire comme suit.

=MOD(
  11 - MOD(
  (MOD(QUOTIENT($A1, 10000000000), 10) * 6 +
   MOD(QUOTIENT($A1, 1000000000), 10) * 5 +
   MOD(QUOTIENT($A1, 100000000), 10) * 4 +
   MOD(QUOTIENT($A1, 10000000), 10) * 3 +
   MOD(QUOTIENT($A1, 1000000), 10) * 2 +
   MOD(QUOTIENT($A1, 100000), 10) * 7 +
   MOD(QUOTIENT($A1, 10000), 10) * 6 +
   MOD(QUOTIENT($A1, 1000), 10) * 5 +
   MOD(QUOTIENT($A1, 100), 10) * 4 +
   MOD(QUOTIENT($A1, 10), 10) * 3 +
   MOD($A1, 10) * 2),
  11),
10)

Python Je ne suis pas sûr de Python, mais peut-être que ça ressemble à ça? Je ne pense pas que ce soit aussi rapide.

verify_my_number.py


def verify_check_digit(my_number):
    product = sum([
                    (my_number / (10 ** (i + 1)) % 10) * (i % 6 + 2)
                    for i in range(0, 11)
                 ])
    return (11 - product % 11) % 10 == my_number % 10

Recommended Posts

Accélérez approximativement le chiffre de contrôle de mon numéro d'environ 10% (je ne sais pas car je ne l'ai pas mesuré)
[Résumé de 27 langues] Méthode de calcul des chiffres de contrôle de mon numéro
[Vous devez le savoir! ] J'ai essayé de mettre en place un environnement Python de manière rentable en utilisant pleinement les privilèges des étudiants universitaires.
Je veux vérifier la position de mon visage avec OpenCV!