using System.Text.RegularExpressions;
public static int Modulus(int divisor, int dividend)
throw new DivideByZeroException();
int whole = (int)Math.Floor((double)divisor / (double)dividend);
return divisor - (dividend * whole);
public static void Main()
Console.WriteLine(MOD3736.GetCheckDigit("0794"));
public static class MOD3736
private const string _alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static readonly Regex _removeInvalidCharactersRegex = new Regex($"(?>[^{_alphabet}]+)");
public static char GetCheckDigit(string s)
throw new ArgumentNullException(nameof(s));
throw new ArgumentException(nameof(s));
var withoutInvalidCharacters = _removeInvalidCharactersRegex.Replace(s, string.Empty);
Console.WriteLine($"Input pulito: >{withoutInvalidCharacters}<");
if (withoutInvalidCharacters.Length == 0)
throw new ArgumentException(nameof(s));
int moduPlus1 = modu + 1;
for (int j = 0; j < s.Length; j++)
int a = _alphabet.IndexOf(s[j]);
int sj = (pj % moduPlus1) + a;
int pj_plus_1 = CustomRem(sj, modu) * 2;
Console.WriteLine($"Pj = {pj}\t\ta = {a}\t\tSj = {sj}\t\tpj+1 = {pj_plus_1 / 2}\t\t*2 = {pj_plus_1}\t\tpj+1 = {pj_plus_1 % 11}");
Console.WriteLine($"Pn = {pj}");
var xx = Modulus(1 - pj, modu);
Console.WriteLine($"x = {xx}");
private static int CustomRem(int n1, int n2)
return res == 0 ? n2 : res;
public static bool IsValid(string s)