Ero incuriosito da come gli imei funzionassero.
Prima di informarmi, ancora non sapevo che fossero necessariamente lunghi 15 cifre e che l’ultima servisse a verificare la validità delle prime 14.
Ho scritto un algoritmo per controllare la validità di un imei e/o generare la sua cifra di controllo.
Tra il codice trovate anche i come e i perché. Di solito non commento mai i programmi che scrivo, però era meglio fare un’eccezione questa volta 😉
Ammetto che avevo fatto il ciclo di imeiCheckDigit in Linq, poi mi sono dato dell’idiota e l’ho riscritto come si deve. 😀
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(checkImei(Console.ReadLine()));
Console.ReadKey();
}
static bool checkImei(String imei)
{
int[] digits = getDigits(imei);
//L'imei deve essere di 15 cifre
if (digits.Length != 15)
return false;
return digits[14] == imeiCheckDigit(digits);
}
/*
* si moltiplica * 2 da destra una cifra si una no. i numeri > 9 vengono divisi cifra per cifra
* tutte le cifre vengono quindi sommate a formare un unico numero
* esempio: 3 + 5*2 + 3 + 9*2 + 5 + 1*2 + 0 + 1*2 + 3 + 9*2 + 7 + 0*2 + 2 + 8*2 = _
* 3+(1+0)+3+(1+8)+5+(2)+0+(2)+3+(1+8)+7+(0)+2+(1+6)=53
* la cifra di controllo viene generata infine cercando il numero per rendere la somma divisibile per 10
* esempio: se la somma è 53, la cifra di controllo è 7
*/
static int imeiCheckDigit(int[] n)
{
int somma = 0;
for (int i = n.Length-2; i > 0; i -= 2)
{
int a = n[i] * 2;
if (a > 9)
a = a / 10 + a % 10;
somma += a + n[i - 1];
}
somma %= 10;
return somma == 0 ? 0 : (10 - somma);
}
static int[] getDigits(String s)
{
return s.Select(digit => int.Parse(digit.ToString())).ToArray();
}
}
}