Матч 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";

  }

};