Матч
20, Почтовый код (Postnet)
Почтовый код США состоит из 5, 9
или 11 цифр. Каждая цифра представляется последовательностью 5 полос, каждая из
которых может быть малой (Low) или большой (High). Коды цифр следующие:
0 1 2
3 4 5
6 7 8
9
HHLLL LLLHH LLHLH LLHHL LHLLH LHLHL LHHLL HLLLH HLLHL
HLHLL
Сетевое представление почтового
кода состоит из большой полосы (H), за которой следуют почтовый код,
контрольная сумма и снова большая полоса (H). Контрольной суммой является цифра,
после добавления которой к сумме цифр почтового кода, дает число, кратное 10.
Например, если сумма цифр постового кода равна 33, то контрольной суммой будет
7.
По заданному почтовому коду найти
его сетевое представление.
Класс: Postnet
Метод: string
barcode(string zipCode)
Ограничения:
zipCode содержит 5, 9 или 11 цифр ‘0’ – ‘9’.
Вход. Строка zipCode, содержащая
почтовый код.
Выход. Строка, являющаяся сетевым представлением входного почтового
кода.
Пример входа
zipCode |
"12345" |
"94070" |
"11111" |
Пример выхода
"HLLLHHLLHLHLLHHLLHLLHLHLHLLHLHLH"
"HHLHLLLHLLHHHLLLHLLLHHHLLLHHLLLH"
"HLLLHHLLLHHLLLHHLLLHHLLLHHLHLHLH"
РЕШЕНИЕ
обработка строк
Вычисляем сумму цифр почтового
кода в переменной s используя функцию
суммирования accumulate. Создаем и возвращаем сетевое представление почтового
кода согласно условию задачи.
Занесем в массив code
представления всех цифр. Если s –
сумма цифр почтового кода, то контрольная сумма равна (10 – s % 10) % 10 (% – операция взятия
остатка в языке Си).
ПРОГРАММА
#include <cstdio>
#include <string>
#include <numeric>
using namespace std;
string code[] = {"HHLLL", "LLLHH",
"LLHLH", "LLHHL",
"LHLLH",
"LHLHL",
"LHHLL", "HLLLH",
"HLLHL", "HLHLL"};
string f(string res,char a)
{
return res + code[a - '0'];
}
class Postnet
{
public:
string barcode(string zipCode)
{
int s =
accumulate(zipCode.begin(),zipCode.end(),-zipCode.size() * '0');
return
accumulate(zipCode.begin(),zipCode.end(),string() + "H",f) +
code[(10 - s % 10) % 10] + "H";
}
};