Форум программистов, компьютерный форум, киберфорум
Наши страницы
mozgotron
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Алгоритм 8-значного тайм-кода

Запись от mozgotron размещена 01.12.2019 в 13:48

Разрабатываю вторую версию алгоритма генерации 8-значного тайм-кода. Первую версию не буду здесь описывать, так как она в корне неправильная, хотя и рабочая (уже несколько лет использую в одной своей программе).

Описание тайм-кода

Количество разрядов: 8
Основание системы счисления: 36
Используемый алфавит кодирования: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ (36 символов)
Можно использовать и меньше знаков для кодирования, например 30: 0123456789ABCDEFHKMNPQRSTUWXYZ, они дают 656.100.000.000 комбинаций, что достаточно для посекундного кодирования всех вариантов прошедшего в нашу эру времени.
Функция кодирования: обратимая (должна быть возможность восстановить по тайм-коду исходные дату-время, пусть даже с искажениями из-за високосных лет, високосных секунд и чередования дней в месяцах)
Распределение високосных годов: Високосными являются годы, которые делятся без остатка на 4 или на 400, кроме делящихся без остатка на 4 и на 100, и 4-го года н.э.
Количество секунд в 9999 годах: 60 * 60 * 24 * (365 * 7501 + 366 * 2498) = 315.544.291.200
Максимальное количество комбинаций тайм-кода: 368 = 2.821.109.907.456
Ёмкость кода: удовлетворительная, так как 2.821.109.907.456 > 315.544.291.200
Внешний вид тайм-кода (примеры): X0PC0ULR, X0P17A9M, X0WC0RKM

Обозначения

a — текущий год
b — месяц
c — день
k — количество високосных лет
l — количество невисокосных лет
q — час
r — минута
s — секунда
x — результат деления
y (y1, y2, yn) — остатки от деления
T10 — десятичный тайм-код
T36 — тридцатишестиричный тайм-код

Константы

31.536.000 — количество секунд в невисокосном году
31.622.400 — количество секунд в високосном году
2.419.200 — количество секунд в месяце из 28 дней
2.505.600 — количество секунд в месяце из 29 дней
2.592.000 — количество секунд в месяце из 30 дней
2.678.400 — количество секунд в месяце из 31 дня
1 — количество месяцев, состоящих из 28/29 дней
4 — количество месяцев, состоящих из 30 дней
7 — количество месяцев, состоящих из 31 дня
86.400 — количество секунд в сутках
3600 — количество секунд в часе
60 — количество секунд в минуте

Алгоритм

1. Делаем снимок системных даты-времени по шаблону гггг.мм.дд/чч:мм:сс (14 цифр).
2. Вычисляем количества високосных и невисокосных лет, прошедших с 1 года н.э. по a.
Цитата:
Для этого: a делим без остатка на 4. Результат сохраняем в переменную i и делим без остатка на 100. К результату прибавляем 1 (4 год н.э.) и сохраняем в переменную j. От i вычитаем j, получаем число прошедших високосных лет, сохраняем в переменную k. От a вычитаем k, получаем число прошедших невисокосных лет, сохраняем в переменную l.
3. Определяем, a високосный или нет. Делим его на 4. Если остаток > 0, значит невисокосный. Если a невисокосный, значит считаем февраль как 28 дней. Если a високосный, значит считаем февраль как 29 дней.
4. Если февраль в текущем году прошёл, учитываем количество его дней. Если ещё не прошёл, не учитываем.
5. Находим сумму всех секунд, прошедших с 1 года 1 месяца 1 числа 0 часов 0 минут 0 секунд по формуле:

Цитата:
T10 = (k - 1) * 31622400 + l * 31536000 + (b - 1) * 2678400 + (c - 1) * 86400 + (q - 1) * 3600 + (r - 1) * 60 + s
T10 = k * 31622400 + (l - 1) * 31536000 + (b - 1) * 2678400 + (c - 1) * 86400 + (q - 1) * 3600 + (r - 1) * 60 + s
Где февраль текущего года?
Если a високосный, то применяем первую формулу. Если a невисокосный, применяем вторую формулу.
6. Переводим T10 в T36 путём деления первого на 36.
7. Выписываем в строчку результат и остатки от деления в порядке
Цитата:
x, yn, ... y2, y1
8. Заменяем выписанные после деления числа знаками 36-ричного алфавита по таблице замены
0123456789101112131415161718192021222324
0123456789ABCDEFGHIJKLMNO
2526272829303132333435
PQRSTUVWXYZ

9. Пустые разряды слева заполняем нулями до получения длины кода в 8 знаков.

Структура программы, генерирующей тайм-код

Программа включает 2 функциональных блока:
1. Блок подсчёта прошедших секунд.
2. Блок конвертирования десятичного числа в тридцатишестиричное.
Размещено в разработка
Просмотров 103 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.