Определяем мощность (количество символов) использующегося алфавита. 12 букв и 10 цифр составляют 22 символа. В 1 байте допустимо запоминать 256 комбинаций, поэтому "минимальное количество байтов" для кодирования символа равно 1. Номер из 6 символов займет 6 байт.
А для 32 номеров потребуется 32×6 = 192 байта.
Я встречал эту задачу в несколько ином виде: Каждый символ кодируется одинаковым и минимально возможным количеством не байтов, а бит. А номер кодируется минимально возможным количеством байт. Тогда получается 5 бит на символ (2⁴ < 22 < 2⁵), 6 символов требуют 5×6 = 30 бит = 30/8 ≈ 4 байта. А 32 номера занимают 32×4 = 128 байт.
Определяем мощность (количество символов) использующегося алфавита. 12 букв и 10 цифр составляют 22 символа. В 1 байте допустимо запоминать 256 комбинаций, поэтому "минимальное количество байтов" для кодирования символа равно 1. Номер из 6 символов займет 6 байт.
А для 32 номеров потребуется 32×6 = 192 байта.
Я встречал эту задачу в несколько ином виде: Каждый символ кодируется одинаковым и минимально возможным количеством не байтов, а бит. А номер кодируется минимально возможным количеством байт. Тогда получается 5 бит на символ (2⁴ < 22 < 2⁵), 6 символов требуют 5×6 = 30 бит = 30/8 ≈ 4 байта. А 32 номера занимают 32×4 = 128 байт.
function Conv(s: string): string;
begin
var d := s.ToCharArray;
var (i, found) := (d.High, False);
while i >= 1 do
if d[i] > d[i - 1] then
begin
found := True;
break
end
else i -= 1;
if found then
begin
s := s[:i];
var c := d[i - 1];
d := d[i - 1:];
d.Sort;
var j := d.IndexOf(c) + 1;
s += (d[j] + d?[:j] + d?[j + 1:]).JoinIntoString
end
else s := '-';
Result := s
end;
begin
var ms := Arr('1890', '83849', '126631', '146531', '32749972');
foreach var s in ms do
Conv(s).Println
end.
19088389413126615134632772499