Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки символов. заменить (v, w)
нашлось (v)
Первая команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Если цепочки v в строке нет, эта команда не изменяет строку. Вторая команда проверяет, встречается ли цепочка v в строке исполнителя Редактор.
Дана программа для Редактора:
НАЧАЛО
ПОКА нашлось (21) ИЛИ нашлось (31) ИЛИ нашлось (23)
ЕСЛИ нашлось (21)
ТО заменить (21, 12)
КОНЕЦ ЕСЛИ
ЕСЛИ нашлось (31)
ТО заменить (31, 13)
КОНЕЦ ЕСЛИ
ЕСЛИ нашлось (23)
ТО заменить (23, 32)
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ
На вход приведённой программе поступает строка, содержащая 50 цифр 1, 50 цифр 2 и 50 цифр 3, расположенных в произвольном порядке. Запишите без разделителей символы, которые имеют порядковые номера 10, 90 и 130 в получившейся строке.
Один такой знак занимает минимально 7 бит (2^6=64 < 68 < 128=2^7).
Но символы кодируют целым числом байт. значит по 1 байту (8 бит) на символ. Длина пароля равна 12 символов, которые занимают 12 байт.
Всего выделено 1080 байт на 40 пользователей, то есть 1080/40 = 27 байт на одного пользователя.
Из них 12 байт занято под пароль. Остается 27-12=15 байт можно использовать для хранения дополнительных сведений о каждом пользователе
Можно немного оптимизировать, чтоб обойтись одним сравнением вместо двух. Для этого надо "сдвинуть" все дни так чтобы понедельник был 0, вторник - 1,..., суббота - 5, воскресенье - 6. Для этого вычесть из номера дня единицу, а потом уже брать остаток от деления. После этого его можно просто сравнивать на больше или равно 5.
Чтобы проверить день на предмет праздника надо вычислить последнюю цифру номера дня (в десятичной системе счисления), то есть посчитать остаток от деления на 10 и сравнить с нулём.
Пример функции на С, которая возвращает 1 если выходить на работу в заданный день надо и 0 если не надо:
int need_to_work (int day_number)
{
/* сначала разберемся с праздником */
if ((day_number % 10) == 0) {
return 0; // праздник - работать не надо
}
/* "сдвигаем" номер дня как описывал выше */
day_number = day_number - 1; // можно day_number--;
/* проверка на выходные */
if ((day_number % 7) >= 5) {
return 0; // выходной - работать не надо
}
/* все дни, которые не попали в предыдущие условия - рабочие */
return 1;
}